直方图均衡化
数学原理
考虑连续灰度值,并用变量表示待处理图像的灰度。通常,我们假设的取值区间为,且表示黑色,表示白色。
设所对应输出的灰度值为。即
灰度经过一系列映射成灰度。
设满足一下条件
- 为在区间上的单调递增函数
- 的取值区间为
则存在
其中条件1时为了保证s到r与r到s为单值映射,只会出现一对一的情况。
把一副图像所对应的灰度值视为一个随机变量,则可以把与视为灰度值为r与s的概率密度曲线。
因为是单调递增的,所以与的分布情况是一样的,于是存在
其中与分别为与的概率分布函数
对于上式等号两边分布求导,于是存在
于是的概率密度函数由的概率密度函数与映射函数所决定
对于有
即可完成在区间上的映射,且保证与的分布一致。
注:对于离散型随机变量
其中
于是
所以为在区间上的均匀概率密度函数
图1
图二
即完成上图1到图2的映射
步骤总结:
- 统计原图中相同灰度值出现的次数
- 计算灰度值的概率分布CDF
- 将相应的灰度值完成映射操作CDF*(L-1)并取整
代码示例
# 直方图均衡化
def HistogramEQ(src_img):
h, w = src_img.shape
# 统计灰度值的个数
src_hist, bins = np.histogram(src_img.flatten(), bins=256, range=(0, 256))
# 计算概率分布函数,并对其进行归一化操作
src_cdf = src_hist.cumsum()
src_cdf_normal = (src_cdf - src_cdf.min()) / (src_cdf.max() - src_cdf.min()) * 255
src_cdf_normal = [round(i) for i in src_cdf_normal]
# 计算输出图像各位置所对应对灰度值
hist_eq_img = np.zeros_like(src_img)
for i in range(h):
for j in range(w):
hist_eq_img[i][j] = src_cdf_normal[src_img[i][j]]
return hist_eq_img