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(指的是上面截图里的窗口)哪个图上,顺序是从左到右,从上到下 |
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法