前言
直方图均衡的核心思想是将图像中每个灰度级的概率均匀化。从直方图上,可以明显观察到均衡化后的图像直方图较处理器的更加平坦,亦即分布均匀。下面给出数学证明及Python实现。
1 数学证明
目标变换
- 为严格单调函数,可保证反映射时,消除二义性
- 为源图像归一化后的直方图
1.1 假定
- 图像灰度级为:
- 源图像中,灰度级的像素个数:
- 源图像像素总数:
- 原图像直方图
1.2 归一化后的直方图
即为灰度级在源图像中出现的概率估计
1.3 证明
概率密度函数的积分为分布函数,即对分布函数的导数为概率密度函数。
因为与已知,则由
又因为
即
联立上三式及目标变换
可得
故,这意味着变换之后的图像的灰度级为均匀分布,证毕。
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
- camera
网友评论