直方图均衡数学证明及Python实现

2019-05-24  本文已影响0人  iwuqing

前言

直方图均衡的核心思想是将图像中每个灰度级的概率均匀化。从直方图上,可以明显观察到均衡化后的图像直方图较处理器的更加平坦,亦即分布均匀。下面给出数学证明及Python实现。


1 数学证明

目标变换

S = T(r) = (L-1)\int_0^rp_r(w)dw

  • T(r)为严格单调函数,可保证反映射时,消除二义性
  • p_r(w)为源图像归一化后的直方图

1.1 假定

1.2 归一化后的直方图

p(r_k) = n_k / n
p(r_k)即为灰度级r_k在源图像中出现的概率估计

1.3 证明

概率密度函数的积分为分布函数,即对分布函数的导数为概率密度函数。

因为p_r(r)T(r)已知,则由
\frac{{\rm d}r}{{\rm d}S} = \frac{p_s(s)}{p_r(r)}
又因为
S = T(r)

\frac{{\rm d}S}{{\rm d}r} = \frac{T(r)}{r}
联立上三式及目标变换
S = T(r) = (L-1)\int_0^rp_r(w)dw
可得
p_s(s) = \frac{1}{L-1}
故,这意味着变换之后的图像的灰度级为均匀分布,证毕。


2 Python实现

import numpy as np


def hist_equalization(intput_signal):
    '''
    直方图均衡(适用于灰度图)
    :param intput_signal:   输入图像
    :return:    直方图均衡化后的输出图像
    '''

    output_signal = np.copy(intput_signal)   # 输出图像,初始化为输入

    intput_signal_cp = np.copy(intput_signal) # 输入图像的副本

    m, n = intput_signal_cp.shape # 输入图像的尺寸(行、列)

    pixel_total_num = m * n  # 输入图像的像素点总数

    p_r = []   # 输入图像的概率密度
    p_s = []   # 输出图像的概率密度

    # 求输入图像的概率密度函数
    for i in range(256):
        p_r.append(np.sum(intput_signal_cp == i) / pixel_total_num)

    # 求输出图像的概率密度函数
    single_pixel_class_probobility_t = 0  # 临时存储某一灰度级的概率
    for i in range(256):
        single_pixel_class_probobility_t = single_pixel_class_probobility_t + p_r[i]
        p_s.append(single_pixel_class_probobility_t)

    # 求解变换后的输出图像
    for i in range(256):
        output_signal[np.where(intput_signal_cp == i)] = 255 * p_s[i]

    return output_signal

3 对比

我这里使用的是Python第三方库skimage中内置的图片

moon moon的直方图对比 camera camera的直方图对比

4 GitHub

click me

上一篇 下一篇

猜你喜欢

热点阅读