python 直方图每个bin中的值_OpenCV-Python Histogram-2: 直方图均衡| 27

b4256e72a7404ee691827d1c1417554d.jpg

目标

在本节中,

我们将学习直方图均衡的概念,并将其用于改善图像的对比度. 理论

请考虑将像素值限制在特定值范围内的图像. 例如,较亮的图像会将所有像素限制为较高的值. 但是,好的图像将具有图像所有区域的像素. 因此,您需要将此直方图拉伸到两端(如下图所示,来自维基百科),这就是直方图均衡化的作用(简单来说). 通常可以改善图像的对比度.

ca1349540923dd54176e180c1a40bfd89c824800.jpeg?token=812436f5d615804a74db424edce32039&s=8BA77B22B1B1699A4A5485D20000D0B0

我建议您阅读直方图均衡化上的Wikipedia页面,以获取有关它的更多详细信息. 它很好地解释了示例,因此您在阅读示例后几乎可以理解所有内容. 相反,在这里我们将看到其Numpy实现. 之后,我们将看到OpenCV功能.

t01c9f2a0931c17b106.jpg

将numpy导入为np,将cv2导入为cv,从matplotlib导入pyplot,作为pltimg = cv.imread('wiki.jpg',0)hist,bins = np.histogram(img.flatten(),256,[0,256])cdf = hist.cumsum()cdf_normalized = cdf * float(hist.max())/ cdf.max()plt.plot(cdf_normalized,color ='b')plt.hist(img.flatten(),256,[0,256] ,color ='r')plt.xlim([0,256])plt.legend((''cdf','histogram'),loc ='upper left')plt.show()

91ef76c6a7efce1b795f32856118ffd8b58f65dd.jpeg?token=e93f7128c60d1435d48f85eed2802a73&s=FF08106335B7D03B867165DA010080B2

您可以看到直方图位于较亮的区域. 我们需要全方位的服务. 为此,我们需要一个转换函数,将亮区域的输入像素映射到整个区域的输出像素. 这就是直方图均衡化的作用.

现在,我们找到最小的直方图值(不包括0),并应用Wiki页面上给出的直方图均衡方程. 但是我在这里使用了它,这是来自Numpy的遮罩数组的概念数组. 对于掩码数组,所有操作都在非掩码元素上执行. 您可以从Numpy文档中了解有关掩码数组的更多信息.

cdf_m = np.ma.masked_equal(cdf,0)cdf_m =(cdf_m-cdf_m.min())* 255 /(cdf_m.max()-cdf_m.min())cdf = np.ma.filled( cdf_m,0).astype('uint8')现在,我们有一个查找表,可为我们提供有关每个输入像素值的输出像素值是什么的信息. 因此,我们仅应用转换.

img2 = cdf [img]现在,我们像以前一样计算直方图和cdf(这样做),结果如下:

i_5_2931382133x2200275646_26.jpg

42a98226cffc1e17811199dd80d9fa05728de97b.jpeg?token=a9a048b759725899131059273e492600&s=DCCA7A2BB8745C9A9C7545D20100C0B2

另一个重要特征是,即使图像是较暗的图像(而不是我们使用的较亮的图像),在均衡后,我们将获得几乎相同的图像. 因此,它被用作“参考工具”,以便所有图像具有相同的照明条件. 这在许多情况下很有用. 例如,在面部识别中,在训练面部数据之前,对面部图像进行直方图均衡处理,以使其具有相同的照明条件.

OpenCV中的直方图均衡化

OpenCV具有函数cv.equalizeHist()来执行此操作. 它的输入只是一个灰度图像,输出是我们的直方图平衡图像. 这是一个简单的代码片段,显示了我们使用的同一张图片的用法:

img = cv.imread('wiki.jpg',0)equ = cv.equalizeHist(img)res = np.hstack((img局部直方图均衡化opencv2,equ))#并排堆叠图像cv.imwrite('res .png',res)

4e4a20a4462309f7af3cbe31b94700f5d7cad615.jpeg?token=e669603d79b2b6e54959f36e25c205b8&s=FF0810635A41775E9898C30100A0B1

7aa4978e441454b299e4c9c5bac1c6.jpg

因此局部直方图均衡化opencv2,您现在可以在不同的光照条件下拍摄不同的图像,对其进行均衡并检查结果.

当图像的直方图限制在特定区域时,直方图均衡效果非常好. 直方图的强度覆盖较大区域(即,既有亮像素又有暗像素)时,效果不好. 请检查其他资源中的SOF链接.

CLAHE(对比度受限的自适应直方图均衡化)

我们刚刚看到的第一个直方图均衡化考虑了图像的整体对比度. 在许多情况下,这不是一个好主意. 例如,下图显示了输入图像及其在全局直方图均衡后的结果.

9f2f070828381f30aaff47106548400e6f06f071.jpeg?token=0250a3cf326ea41bd48040d42186bffa&s=0CC27A231A22248878B4308A01008091

在直方图均衡后,背景对比度确实得到了改善. 但是在两个图像中比较雕像的脸. 由于亮度很高,我们在那里丢失了大多数信息. 这是因为它的直方图并不局限于前面的案例(尝试绘制输入图像的直方图,您将获得更多的直觉).

i_3_3390841059x353456148_26.jpg

因此,为了解决该问题,使用了自适应直方图均衡. 在这种情况下,图像被分成称为“ tiles”的小图块(在OpenCV中,tileSize默认为8x8). 然后,照常对每个这些块执行直方图均衡化. 因此,在较小的区域内,直方图将被限制在较小的区域内(除非存在噪声). 如果有噪音,它将被放大. 为避免这种情况,将应用对比度限制. 如果任何直方图bin超出指定的对比度限制(在OpenCV中默认为40),则在应用直方图均衡之前,这些像素将被裁剪并均匀地分布到其他bin中. 均衡后,要消除块边界中的伪影,请应用双线性插值.

以下代码段显示了如何在OpenCV中应用CLAHE:

将numpy导入为np将cv2导入为cvimg = cv.imread('tsukuba_l.png',0)#创建一个CLAHE对象(参数是可选的).clahe = cv.createCLAHE(clipLimit = 2.0,tileGridSize =(8,8 ))cl1 = clahe.apply(img)cv.imwrite('clahe_2.jpg',cl1)查看以下结果并将其与上述结果进行比较,尤其是雕像区域:

9825bc315c6034a89aae8d005a455208237679.jpeg?token=fd2e643ea70f1c646dfa04ff3e02269d&s=8CC27A234A0324DA038D951B01008091

其他资源

直方图均衡化的维基百科页面: Numpy中的蒙版阵列:)有关对比度调整的问题:

如何在C中的OpenCV中调整对比度?如何使用opencv均衡图像的对比度和亮度? )

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-189378-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值