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

前言

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

moon

moon的直方图对比

camera

camera

camera的直方图对比

4 GitHub

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值