OpenCV3 直方图均衡化

图像的直方图直白点说就是图像中灰度值和该灰度值像素数目之间的坐标图。例如,一幅图像中灰度值125的像素点有10个,则直方图中就会有一个坐标点是(125, 10)。


那么,什么是直方图均衡化呢?OpenCV官网的图像很形象,这里拿来引用


假设左边是原图像的直方图,可以看到,直方图高的地方很高,而灰度值较低和较高的部分却没有像素,经过直方图均衡化(右图),图像像素的灰度值分配更加均匀,也就是说图像包含的像素灰度值更加丰富,对比度更高。这就是直方图均衡化的作用。


了解了一些简单的原理,下面回到代码,import的模块不再赘述,先来看看使用OpenCV如何计算直方图。只需要两行代码:

image = cv2.imread(r'pics/lena.png', cv2.IMREAD_GRAYSCALE)
hist = cv2.calcHist([image], [0], None, [256], [0, 256])

第一行,载入图像,第二行,calcHist计算直方图。参数依次是:

images:输入图像,可以是多个;

channels:需要计算哪一个通道的直方图,我们的示例只有一个通道;

mask:限定计算直方图的图像区域的掩码;

histSize:对应通道的直方图中bin的个数,说白了,就是计算几个灰度值的直方图,灰度图像256个像素值,当然写256;

ranges:计算直方图的坐标范围,灰度范围0-255,也就是[0, 256)。


接下来,进行直方图均衡化:

equ_image = cv2.equalizeHist(image)
equ_hist = cv2.calcHist([equ_image], [0], None, [256], [0, 256])

使用equalizeHist可以进行全局直方图均衡化,也就是直接对整个图像的直方图进行均衡化,不过,这样做,对于直方图分布及其不均匀的,会有问题,不巧,本文的图像正好就是这样,后面绘制出图像就可以看到。


OpenCV还为我们提供了一种直方图均衡化的方式,称为CLAHE(Contrast Limited Adaptive Histogram Equalization),就是限制对比度的自适应直方图均衡化,网上有很多关于这种算法的介绍,直白来说,该算法会将直方图中的山顶削掉,然后抹平放到山脚下,有点填海造陆的感觉,只不过填海用的土,来源于高山的山顶。代码如下:

clahe = cv2.createCLAHE(clipLimit=3.0)
clahe_image = clahe.apply(image)
clahe_hist = cv2.calcHist([clahe_image], [0], None, [256], [0, 256])

createCLAHE创建CLAHE直方图均衡器,其中参数clipLimit会影响到上面说的削掉山顶的量。现在,我们将上面的所有图像绘制出来,看看结果

plt.subplot(231), plt.imshow(image, 'gray'), plt.title('Origin')
plt.subplot(232), plt.imshow(equ_image, 'gray'), plt.title('Equalize')
plt.subplot(233), plt.imshow(clahe_image, 'gray'), plt.title('Clahe')

plt.subplot(234)
plt.hist(hist.flatten(), 256, [0, 256], color='b')
plt.title('Origin Hist')

plt.subplot(235)
plt.hist(equ_hist.flatten(), 256, [0, 256], color='b')
plt.title('Equalize Hist')

plt.subplot(236)
plt.hist(clahe_hist.flatten(), 256, [0, 256], color='b')
plt.title('Equalize Hist')
plt.show()

结果如下图:



可以看到,第一列原图像有很多的低灰度值像素,而且比其他的灰度值多得多。使用全局直方图均衡化后,高山变得更高了,但是原本不是很高的部分,却被分配到了其他的更矮的部分,图像显得更白了。第三列使用了CLAHE,可以看到,直方图得到了很好的修正,由于图像像素的灰度值更加均匀,对比度更高,图像的细节暴露的更多了,可以清楚地看到帽子上的纹理。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值