直方图均衡化

数学原理

考虑连续灰度值,并用变量直方图均衡化_灰度表示待处理图像的灰度。通常,我们假设直方图均衡化_灰度的取值区间为直方图均衡化_灰度值_03,且直方图均衡化_取值_04表示黑色,直方图均衡化_灰度_05表示白色。

直方图均衡化_图像处理_06所对应输出的灰度值为直方图均衡化_图像处理_06。即
直方图均衡化_灰度值_08
灰度直方图均衡化_灰度经过一系列映射成灰度直方图均衡化_图像处理_06

直方图均衡化_灰度_11满足一下条件

  1. 直方图均衡化_灰度值_12为在区间直方图均衡化_灰度_13上的单调递增函数
  2. 直方图均衡化_灰度值_12的取值区间为直方图均衡化_灰度_13

则存在
直方图均衡化_灰度_16
其中条件1时为了保证s到r与r到s为单值映射,只会出现一对一的情况。

把一副图像所对应的灰度值视为一个随机变量,则可以把直方图均衡化_灰度值_17直方图均衡化_灰度_18视为灰度值为r与s的概率密度曲线。

因为直方图均衡化_灰度_11是单调递增的,所以直方图均衡化_图像处理_06直方图均衡化_灰度的分布情况是一样的,于是存在
直方图均衡化_取值_22
其中直方图均衡化_图像处理_23直方图均衡化_灰度_24分别为直方图均衡化_图像处理_06直方图均衡化_灰度的概率分布函数

对于上式等号两边分布求导,于是存在
直方图均衡化_灰度值_27
于是直方图均衡化_图像处理_06的概率密度函数由直方图均衡化_灰度的概率密度函数与映射函数所决定

对于直方图均衡化_图像处理_06
直方图均衡化_灰度_31
即可完成直方图均衡化_灰度直方图均衡化_取值_33区间上的映射,且保证与直方图均衡化_灰度的分布一致。

注:对于离散型随机变量直方图均衡化_灰度_35

其中
直方图均衡化_灰度值_36
于是
直方图均衡化_灰度值_37
所以直方图均衡化_灰度_38为在直方图均衡化_取值_33区间上的均匀概率密度函数



直方图均衡化_图像处理_40


图1



直方图均衡化_灰度_41


图二


即完成上图1到图2的映射

步骤总结:

  1. 统计原图中相同灰度值出现的次数
  2. 计算灰度值的概率分布CDF
  3. 将相应的灰度值完成映射操作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