OpenCV Python 直方图
来源:互联网 发布:javascript iframe src 编辑:程序博客网 时间:2024/05/16 05:55
OpenCV Python 直方图
直方图
什么是直方图
直方图的作用
敲程序
下面为使用Python
的OpenCV
和matplotlib
来编写几个samples程序来实际感受一下图像的直方图:
使用matplotlib计算直方图
代码
import cv2import numpy as npfrom matplotlib import pyplot as pltimg = 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 cv2import numpy as npfrom matplotlib import pyplot as pltimg = 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([img], [i], None, [256], [0, 256]) plt.plot(histr, color = col) plt.xlim([0, 256])plt.show()
运行效果
代码讲解
histr = cv2.calcHist([img], [i], None, [256], [0, 256])
cv2.calcHist()
是OpenCV里面求直方图的函数。下面介绍这个函数需要传入的形参:
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
[img]
images
原始图像,需要使用[]
修饰 [i]
channels
cv2.calcHist()函数一次只能得到一张图片的其中一个通道的直方图,所以,这里传入的是本次需要处理的元素图片的通道的索引号,同样需要使用[]
修饰。如果输入的元素图像是灰度图,它的值就是[0]; 如果输入的元素图像是彩色图像的话,传入的参数可以是[0], [1], [2],它们分别对应着通道B, G, R。plt.plot(histr, color = col)
这句话中的col
的值是:’b’, ‘g ’ 或 ‘r’,赋给color
形参,函数会自动处理成形应的颜色值,用这个颜色值将histr
直方图绘制到plt
画板上。
plt.xlim([0, 256])
设置plt
画板x轴的上下限,就是x轴所显示的长度。我们将这段代码修改出下面这个样子,然后运行程序,会得到下面的结果:
plt.xlim([0, 100])
使用掩模
代码
import cv2import numpy as npfrom matplotlib import pyplot as pltimg = 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] = 255masked_img = cv2.bitwise_and(img, img, mask = mask)hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])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])plt.show()
运行效果
<注>:当原始图像使用较大图像的时候,你会发现程序运行后需要好久才能得到下面的结果。
代码解释
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
(指的是上面截图里的窗口)哪个图上,顺序是从左到右,从上到下
- OpenCV Python 直方图
- python opencv 显示直方图
- Python OpenCV 直方图 (五)
- Python OpenCV -- 直方图均衡化(十三)
- Python+OpenCV学习(5)---直方图
- Python + OpenCV 直方图均衡 (Histogram Equalization)
- opencv-python绘制图像颜色直方图
- python-opencv 直方图目标区域匹配
- opencv-python 绘制直方图和均衡化
- OpenCv 直方图
- OpenCv 直方图
- OpenCV 直方图
- opencv 直方图
- opencv直方图
- opencv直方图
- opencv 直方图
- 【OpenCV】直方图
- OpenCV Python教程(3、直方图的计算与显示)
- 关于JAVA中使用nbtstat获取地址报错
- PyQt5:将窗口放在屏幕中间(6)
- Retrofit实现App更新
- HDU1195 BFS或者DP
- CSS盒子模型各属性层级及基础知识
- OpenCV Python 直方图
- Ajax XMLHttpRequest对象的三个属性以及open和send方法
- iOS开发之runloop
- 判断两个View是否相同
- leetcode #74 in cpp
- 浅谈JAVA垃圾回收机制及其回收时机
- PyQt5:PyQt5中的菜单和工具栏、主窗口(7)
- 将1~6这6个数字按每行3个进行输出,输出时要求左边的数字比右边的大,上边的数字比下边的大,求出所有可能的填写方法并统计输出排列方法有多少种。
- oracle 简单查询