您的位置:首页 > 编程语言 > Python开发

OpenCV Python 直方图

2016-06-01 00:08 537 查看

OpenCV Python 直方图

直方图

什么是直方图

直方图的作用

敲程序

下面为使用
Python
OpenCV
matplotlib
来编写几个samples程序来实际感受一下图像的直方图:

使用matplotlib计算直方图

代码

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('~/Pictures/IMG_4137.JPG', 0)
plt.hist(img.ravel() , 256, [0, 256])
plt.show()


出现错误

上面的这段程序,你运行会出现这样的error:

Traceback (most recent call last):
File "/home/aobo/PycharmProjects/OpenCV2/Histograms/hist.py", line 6, in <module>
plt.hist(img.ravel() , 256, [0, 256])
AttributeError: 'NoneType' object has no attribute 'ravel'


解决办法

将代码里的下面这行

img = cv2.imread('~/Pictures/IMG_4137.JPG', 0)


修改为:(图片路径使用完整的绝对路径)

img = cv2.imread('/home/aobo/Pictures/IMG_4137.JPG', 0)


错误的原因是:
img
变量没有成功的载入图片(
cv2.imread()
),所以这个
img
变量就是一个没有任何变量类型的一个变量,在Python语言里
img
现在就是一个
NoneType
对象。因为只要
Mat
对象才有
ravel()
这个方法,而
NoneType
对象没有,所以才出现了上面的
error


img.ravel() 将图像转成一维数组。


运行结果:



输出一个彩色图像的直方图

代码

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('/home/aobo/Pictures/IMG_4137.JPG')
color = ('b','g','r')
# enumerate():python里的一个新函数
# 它的作用:同时遍历索引(i)和元素(col)
for i,col in enumerate(color):
histr = cv2.calcHist(

代码讲解

histr = cv2.calcHist(

使用掩模

代码

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('/home/aobo/Pictures/IMG_4137.JPG')
color = ('b','g','r')

mask = np.zeros(img.shape[:2], np.uint8)
mask[1000:2000, 1000:2000] = 255
masked_img = cv2.bitwise_and(img, img, mask = mask)

hist_full = cv2.calcHist(

代码解释

mask = np.zeros(img.shape[:2], np.uint8)
mask[1000:2000, 1000:2000] = 255


制作一个掩模。首先使用
np.zeros()
函数创建一个与原图尺寸和深度都一样,像素值全为
0
(黑色)图像
mask
,然后指定
mask
掩模的
[1000:2000, 1000:2000]
区域的像素全为
255
(白色)。上图右上角的图就是掩模图像。

masked_img = cv2.bitwise_and(img, img, mask = mask)


现在掩模发挥了作用:掩模的黑色区域(像素值为0)用来遮盖原图
img
,即不参与图像处理,只保留像素值不为0的区域。
masked_img
图像就是上图左下角的图像。

cv2.bitwise_and()函数的功能是位与。下面是这个函数的声明:

cv2.bitwise_and(src1, src2[, dst[, mask]])

当前代码里,对应的
src1
src2
是同一种数据类型,所以此时cv2.bitwise_and()函数执行的是下面的操作:



hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])


分别计算出原图
img
的直方图和
img
掩模区域的直方图。

plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask, 'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0, 256])


subplot()
matplotlib.pyplot
里的函数。它是:将多个图画到一个平面上的工具。

subplot(m, n, p)
或者
subplot(mnp)


m表示图排成m行
n表示图排成n列
p表示将图画到
Figure
(指的是上面截图里的窗口)哪个图上,顺序是从左到右,从上到下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息