教程】Opencv"/>
【Opencv3教程】Opencv
【Opencv3教程】Opencv-python入门篇(二)直方图均衡化
- 直方图均衡化:
- 1 直方图:
- 2 直方图均衡化的原理:
- 3 直方图均衡化的 python 实现:
- 4 自适应直方图均衡化:
直方图均衡化:
1 直方图:
对于灰度图,直方图用于统计 [ 0 , 255 ] [0,255] [0,255] 区间内每个像素值出现的次数;
import cv2import matplotlib.pyplot as pltimport numpy as npimage = cv2.imread('./sample.jpg')image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)plt.imshow(image, cmap='gray')
plt.show()plt.hist(image.ravel(), 256, [0, 256])
plt.show()
我们读入测试图像并统计直方图:
2 直方图均衡化的原理:
可以看到像素值的分布是不均衡的,而直方图均衡化可以使图像具有较大的灰度动态范围和较高的对比度,同时图像的细节更为丰富;
即,假设我们有如图数据:
我们从小到大统计每个像素值出现的概率 p i p_i pi,并计算累积概率 P i P_i Pi,其中:
P i = ∑ j = 0 i p i P_i=\sum_{j=0}^{i}p_i Pi=∑j=0ipi
即:
则第 i i i 个值 a i a_i ai 经过均衡化的新灰度值 A i A_i Ai 为:
A i = [ P i × ( a m a x − a m i n ) ] A_i=[P_i×(a_{max}-a_{min})] Ai=[Pi×(amax−amin)],其中对于灰度图 a m a x = 255 , a m i n = 0 a_{max}=255,a_{min}=0 amax=255,amin=0;
得到的经过转换的图像为:
3 直方图均衡化的 python 实现:
import cv2import matplotlib.pyplot as pltimport numpy as npimage = cv2.imread('./sample.jpg')image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)equal = cv2.equalizeHist(image)plt.hist(equal.ravel(), 256, [0, 256])
plt.show()
经过直方图均衡化的图像的直方图如图所示:
左图为原图,右图为均衡化之后的结果:
4 自适应直方图均衡化:
由于不同物体对应图像不同区域,因此首先对图像分区,再分别对每个区域进行直方图均衡化似乎更合理一些,我们就称这种方法为自适应直方图均衡化:
import cv2import matplotlib.pyplot as pltimport numpy as npimage = cv2.imread('./sample.jpg')image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)equal = cv2.equalizeHist(image)result = np.hstack([image, equal])clahe = cv2.createCLAHE(2.0, (8, 8))
# clipLimit:颜色对比度的阈值
# titleGridSize:进行像素均衡化的网格大小
res = clahe.apply(image)
result = np.hstack([result, res])plt.imshow(result, cmap='gray')
plt.show()
从左至右依次为:原图,直方图均衡化,自适应直方图均衡化
更多推荐
【Opencv3教程】Opencv
发布评论