opencv直方图处理的常见处理操作有哪些
Admin 2022-08-13 群英技术资讯 285 次浏览
直方图从图像内部灰度级的角度对图像进行表述从直方图的角度对图像进行处理,可以达到增强图像显示效果的目的。
直方图是图像内灰度值的统计特性与图像灰度值之间的函数,直方图统计图像内各个灰度级出现的次数。从直方图的图形上观察,横坐标是图像中各像素点的灰度级,纵坐标是具有该灰度级(像素值)的像素个数。在绘制直方图时,将灰度级作为x轴处理,该灰度级出现的次数作为y轴处理
把左侧的直线图和右侧直方图都称为直方图
在实际处理中,图像直方图的x轴区间一般是[0, 255],对应的是8位位图的256个灰度级;y轴对应的是具有相应灰度级的像素点的个数。
归一化直方图: 在归一化直方图中,x轴仍然表示灰度级;y轴不再表示灰度级出现的次数,而是灰度级出现的频率。
灰度级出现的频率=灰度级出现的次数/总像素数在归一化直方图中,各个灰度级出现的频率之和为1。归一化直方图与直方图在外观上是一致的,只是y轴的标签不同而已。
在OpenCV的官网上,特别提出了要注意的三个概念:DIMS、BINS、RANGE
Python的模块matplotlib.pyplot中的hist()函数能够方便地绘制直方图,通常采用该函数直接绘制直方图。除此以外,OpenCV中的cv2.calcHist()函数能够计算统计直方图,还可以在此基础上绘制图像的直方图。
模块matplotlib.pyplot提供了一个类似于MATLAB绘图方式的框架,可以使用其中的matplotlib.pyplot.hist()函数来绘制直方图。此函数的作用是根据数据源和灰度级分组绘制直方图。
其基本语法格式为:
matplotlib.pyplot.hist(X, BINS)
函数ravel()的作用是将二维数组降维成一维数组。
例如:数组a
使用函数ravel()对a进行处理:
b = a.ravel()
使用hist()函数绘制一幅图像的直方图
import cv2 import matplotlib.pyplot as plt o=cv2.imread("./img/hand1.png") cv2.imshow("original", o) plt.hist(o.ravel(),256) plt.show() cv2.waitKey() cv2.destroyAllWindows()
使用函数hist()将一幅图像的灰度级划分为16组后,绘制该图像的直方图。
将灰度级划分为16组,即将灰度级划分为16个子集,对应的BINS值为16。
import cv2 import matplotlib.pyplot as plt o=cv2.imread("./img/hand1.png") plt.hist(o.ravel(),16) plt.show()
OpenCV提供了函数cv2.calcHist()用来计算图像的统计直方图,该函数能统计各个灰度级的像素点个数。利用matplotlib.pyplot模块中的plot()函数,可以将函数cv2.calcHist()的统计结果绘制成直方图。
函数cv2.calcHist()用于统计图像直方图信息,其语法格式为:
hist = cv2.calcHist( images, channels, mask, histSize, ranges, accumulate )
函数中返回值及参数的含义为:
仅计算掩膜区域
**例子:**使用cv2.calcHist()函数计算一幅图像的统计直方图结果,并观察得到的统计直方图信息。
import cv2 import numpy as np img=cv2.imread("./img/hand1.png") hist = cv2.calcHist([img], [0], None, [256], [0,255]) print(type(hist)) print(hist.shape) print(hist.size) print(hist) ###### <class 'numpy.ndarray'> (256, 1) 256 [[ 88.] [ 31.] [ 48.] [ 66.] ...
函数cv2.calcHist()返回值的数据类型为“ndarray”。该数据的shape为(256,1),说明其有256行1列。
该数据的size为256,说明有256个元素,分别对应着256个灰度级在图像内出现的次数。
plot()函数的使用:
使用matplotlib.pyplot模块内的plot()函数,可以将函数cv2.calcHist()的返回值绘制为图像直方图。
绘制统计直方图:
使用函数plot()将函数cv2.calcHist()的返回值绘制为直方图。
import cv2 import matplotlib.pyplot as plt o=cv2.imread("./img/hand1.png") histb = cv2.calcHist([o], [0], None, [256], [0,255]) plt.plot(histb, color='b') plt.show()
使用函数plot()和函数cv2.calcHist(),将彩色图像各个通道的直方图绘制在一个窗口内。
import cv2 import matplotlib.pyplot as plt o=cv2.imread("./img/hand1.png") histb = cv2.calcHist([o], [0], None, [256], [0,255]) histg = cv2.calcHist([o], [1], None, [256], [0,255]) histr = cv2.calcHist([o], [2], None, [256], [0,255]) plt.plot(histb, color='b') plt.plot(histg, color='g') plt.plot(histr, color='r') plt.show()
在函数cv2.calcHist()中,参数mask用于标识是否使用掩模图像。
当使用掩模图像获取直方图时,仅获取掩模参数mask指定区域的直方图。
import cv2 import numpy as np mask=np.zeros([600,600], np.uint8) mask[200:400,200:400]=255 cv2.imshow('mask', mask) cv2.waitKey() cv2.destroyAllWindows()
使用掩模绘制直方图:
绘制掩模图像时,首先将函数cv2.calcHist()的mask参数设置为掩模图像,得到掩模处理的直方图信息,再使用plot()函数完成直方图的绘制。
函数cv2.calcHist()的语法格式:
hist = cv2.calcHist( images, channels, mask, histSize, ranges, accumulate )
其中,mask参数就是掩模图像。
绘制掩模结果图像的直方图
首先构造一个掩模图像,然后使用函数cv2.calcHist()计算掩模结果图像的统计直方图信息,最后使用函数plot()绘制掩模图像的直方图。
掩模图像要保持与原始图像相等的大小, 使用参数image.shape表示构造与原始图像等大小的掩模图像。
import cv2 import numpy as np import matplotlib.pyplot as plt image=cv2.imread("./img/hand1.png", cv2.IMREAD_GRAYSCALE) mask=np.zeros(image.shape, np.uint8) mask[200:400,200:400]=255 histImage=cv2.calcHist([image], [0], None, [256], [0,255]) histMI=cv2.calcHist([image], [0], mask, [256], [0,255]) plt.plot(histImage,color="b") plt.plot(histMI,color="g") plt.show()
如果一幅图像拥有全部可能的灰度级,并且像素值的灰度均匀分布,那么这幅图像就具有高对比度和多变的灰度色调,灰度级丰富且覆盖范围较大。
在外观上,这样的图像具有更丰富的色彩,不会过暗或过亮。直方图均衡化的主要目的是将原始图像的灰度级均匀地映射到整个灰度级范围内,得到一个灰度级分布均匀的图像。这种均衡化,既实现了灰度值统计上的概率均衡,也实现了人类视觉系统(Human Visual System, HVS)上的视觉均衡。
直方图均衡化的算法主要包括两个步骤:
在此基础上,再利用人眼视觉达到直方图均衡化的目的。
在累计直方图的基础上,对原有灰度级空间进行转换。可以在原有范围内对灰度级实现均衡化,也可以在更广泛的灰度空间范围内对灰度级实现均衡化。
在原有范围内实现均衡化
用当前灰度级的累计概率乘以当前灰度级的最大值,得到新的灰度级,并作为均衡化的结果。
在更广泛的范围内实现均衡化
用当前灰度级的累计概率乘以更广泛范围灰度级的最大值,得到新的灰度级,并作为均衡化的结果。
通过如下两个步骤,可以让直方图达到均衡化的效果。
直方图均衡化使图像色彩更均衡、外观更清晰,也使图像更便于处理,它被广泛地应用在医学图像处理、车牌识别、人脸识别等领域。
OpenCV使用函数cv2.equalizeHist()实现直方图均衡化。
该函数的语法格式为:
dst = cv2.equalizeHist( src )
例子: 使用函数cv2.equalizeHist()实现直方图均衡化
#-----------导入使用的模块--------------- import cv2 import matplotlib.pyplot as plt #-----------读取原始图像--------------- img = cv2.imread('./img/hand1.png', cv2.IMREAD_GRAYSCALE) #-----------直方图均衡化处理--------------- equ = cv2.equalizeHist(img) #-----------显示均衡化前后的图像--------------- cv2.imshow("original", img) cv2.imshow("result", equ) #-----------显示均衡化前后的直方图--------------- plt.figure("原始图像直方图") #构建窗口 plt.hist(img.ravel(),256) plt.figure("均衡化结果直方图") #构建新窗口 plt.hist(equ.ravel(),256) plt.show() #----------等待释放窗口--------------------- cv2.waitKey() cv2.destroyAllWindows()
语句“plt.figure("原始图像直方图")”用于构造名为“原始图像直方图”的新窗口。
均衡化是指综合考虑了统计概率和HVS的均衡化结果。
matplotlib.pyplot模块提供了一个类似于MATLAB绘图方式的框架,可以使用其中的函数方便地绘制图形。
模块matplotlib.pyplot提供了函数matplotlib.pyplot.subplot()用来向当前窗口内添加一个子窗口对象。该函数的语法格式为:
matplotlib.pyplot.subplot(nrows, ncols, index)
序号是从“1”开始而不是从“0”开始的。
如果所有参数都小于10,可以省略彼此之间的逗号,直接写三个数字。例如,subplot(2, 3, 4)可以直接表示为subplot(234)。
import cv2 import matplotlib.pyplot as plt img = cv2.imread('./img/hand1.png', cv2.IMREAD_GRAYSCALE) equ = cv2.equalizeHist(img) plt.figure("subplot示例") plt.subplot(121), plt.hist(img.ravel(),256) plt.subplot(122), plt.hist(equ.ravel(),256) plt.show()
模块matplotlib.pyplot提供了函数matplotlib.pyplot.imshow()用来显示图像。
其语法格式为:
matplotlib.pyplot.imshow(X, cmap=None)
使用函数matplotlib.pyplot.imshow()显示彩色图像
import cv2 import matplotlib.pyplot as plt img = cv2.imread('./img/hand1.png') imgRGB=cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.figure("显示结果") plt.subplot(121) plt.imshow(img), plt.axis('off') plt.subplot(122) plt.imshow(imgRGB), plt.axis('off') plt.show()
使用函数matplotlib.pyplot.imshow()显示灰度图像。
尝试使用不同的形式显示灰度图像
import cv2 import matplotlib.pyplot as plt o = cv2.imread('./img/hand1.png') g=cv2.cvtColor(o, cv2.COLOR_BGR2GRAY) plt.figure("灰度图像显示演示") plt.subplot(221) plt.imshow(o), plt.axis('off') plt.subplot(222) plt.imshow(o, cmap=plt.cm.gray), plt.axis('off') plt.subplot(223) plt.imshow(g), plt.axis('off') plt.subplot(224) plt.imshow(g, cmap=plt.cm.gray), plt.axis('off') plt.show()
只有使用灰度图像作为参数,并且将色彩空间参数值设置为“cmap=plt.cm.gray”,灰度图像才被正常显示。
使用函数matplotlib.pyplot.imshow()以不同的参数形式显示灰度图像。
import cv2 import matplotlib.pyplot as plt o = cv2.imread('./img/hand1.png') g=cv2.cvtColor(o, cv2.COLOR_BGR2GRAY) plt.figure("灰度图像显示演示") plt.subplot(221); plt.imshow(g, cmap=plt.cm.gray) plt.subplot(222); plt.imshow(g, cmap=plt.cm.gray_r) plt.subplot(223); plt.imshow(g, cmap='gray') plt.subplot(224); plt.imshow(g, cmap='gray_r') plt.show()
色彩空间参数cmap的参数值“plt.cm.gray_r”及“gray_r”中的“r”是英文“reverse”的缩写,表示逆转的意思。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
python中temp是什么?根据操作的过程进行临时保存的文件技术。python中临时文件及文件夹使用。使用的是tempfile包
内容介绍导语013Dplot1.基本语法2.PythonCmd3.举例02绘制Scatter03绘制3DSurface导语很多情况下,为了能够观察到数据之间的内部的关系,可以使用绘图来更好的显示规律。
今天在做项目的时候遇到了要把图片转成base64格式,转成base64格式后可以直接显示,不用请求图片url,减少了http请求,但是转换成base64后,代码比图片的大小反而要大一点,所以各有利弊,可以根据自己的需要选择
如果要考察某公司的牛奶产品质量,可以从100袋牛奶中抽取30袋,在随机数表中选中一数,并用向上、下、左、右不同的读法组成30个数,并按牛奶的标号进行检测,虽然麻烦,但很常用。在日常生活中,随机数起着很大的作用,所以很多人会专门去寻找随机数生成器。
这篇文章主要介绍了关于python中range()的参数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008