【Opencv3教程】Opencv-python入门篇(二)直方图均衡化

直方图均衡化:

1 直方图:

对于灰度图,直方图用于统计 [ 0 , 255 ] [0,255] 区间内每个像素值出现的次数;

import cv2

import matplotlib.pyplot as plt

import numpy as np

image = 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 ,并计算累积概率 P i P_i ,其中:

P i = j = 0 i p i P_i=\sum_{j=0}^{i}p_i

即:
在这里插入图片描述

则第 i i 个值 a i a_i 经过均衡化的新灰度值 A i A_i 为:

A i = [ P i × ( a m a x a m i n ) ] A_i=[P_i×(a_{max}-a_{min})] ,其中对于灰度图 a m a x = 255 , a m i n = 0 a_{max}=255,a_{min}=0 ;

得到的经过转换的图像为:
在这里插入图片描述

3 直方图均衡化的 python 实现:

import cv2

import matplotlib.pyplot as plt

import numpy as np

image = 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 cv2

import matplotlib.pyplot as plt

import numpy as np

image = 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()

从左至右依次为:原图,直方图均衡化,自适应直方图均衡化

在这里插入图片描述

发布了100 篇原创文章 · 获赞 142 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44936889/article/details/104348945
今日推荐