版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
图像灰度直方图及直方图均衡化
1 直方图定义
图像的直方图表示图像中每一灰度级与该灰度级出现的像素或频数间的统计关系,其数学公式表达如下:
其中,N为一幅图像的总像素数,
是第
级灰度的像素数,
表示第
个灰度级,
是灰度级数,
表示该灰度级出现的相对频数。
对于灰度图像的直方图Python实现如下
def hist_gray(src):
assert src.ndim == 2
return np.histogram(src.flatten(),bins=256)
程序运行结果如下:
2 直方图均衡化
对一幅给定图像的灰度级进行归一化处理,分布在
,对任何一个在[0,1]区间内的r进行如下变换:
通过上述变换,每一个原始图像的像素灰度值r都会产生一个s值。变换函数
应满足如下条件:
- 1). 在 范围内, 是单值单调增加;
- 2).在 范围内,有
对于连续图像,当直方图均衡化(并归一化)后有
变换图像
与原图像概率密度函数
之间的关系为:
其中,
是积分变量
直方图均衡化累积分布函数的离散形式表示如下:
对于灰度图像直方图均衡化Python实现代码如下:
# 灰度图像直方图均衡化
def histeq_gray(im,nbr_bins=256):
assert im.ndim == 2
#计算图像的直方图
imhist,bins = np.histogram(im.flatten(),nbr_bins,normed=True)
cdf = imhist.cumsum() #累计分布函数
cdf = 255 * cdf / cdf[-1] #归一化
#使用累计分布函数的线性插值,计算新的像素
im2 = np.interp(im.flatten(),bins[:-1],cdf)
imhist,bins = np.histogram(im2.flatten(),nbr_bins,normed=True)
dst = np.clip(im2.reshape(im.shape),0,255)
dst = np.uint8(dst)
return dst,imhist
程序运行结果
原图像直方图如下:
直方图均衡化后的直方图如下: