问道代码间

高校计算机教师,联系方式422591959@qq.com

导航

直方图的均衡化

引言

直方图均衡化被看作的图像降噪或者增强方式。

什么是直方图

学习这样的降噪方法首先要了解什么是直方图。直方图试图表示图像像素值得分布情况,对于灰度图像而言,直接统计不同灰度的出现频次。
0 2 2 4 5
2 1 0 1 2
0 2 3 2 2
1 3 1 0 4
1 4 0 3 1
上5*5表格代表了一个图像,0-5的数字表示了6中灰度级别,我们利用直方图来统计各个灰度出现的次数
(https://img2020.cnblogs.com/blog/2198110/202010/2198110-20201030153735682-1150889783.png)
上图k代表不同的灰度等级,h(k)代表为这个灰度等级的像素的数量

尝试用python来实现直方图
首先我们下载一张图片作为我们的素材

from PIL import Image
from pylab import *
from numpy import *

image = array(Image.open('timg.jpg').convert('L'))
#生成灰度图
figure()
gray()
contour(image,origin='image')
#使用hist()生成直方图
figure()
hist(image.flatten(),128)

show()


从上图,我们明显发现这是一个过于曝光的图片,像素过渡的集中在高灰度值区域。那么如何让图片变的更清晰呢,这时就需要进行直方图均衡化。

直接进行直方图均衡化

这里有一篇博客讲的很清楚,这里做简要讲解
https://blog.csdn.net/qq_15971883/article/details/88699218
0 1 2
1 2 2
2 0 1
上图代表图像的,灰度级从0到2,一共三个级别
我们直接进行计算
*step1
对原图直接生成直方图nk
n(0)表示灰度值为0的个数,显而易见n(0)=2,以此类推n(1)=3,n(2)=4。则n(k)=[2,3,4]

*step2
统计院原图总的像素个数

*step3
计算原图灰度分布频率

*step4
计算原图灰度累计分布频率

*step5
sk乘以L-1后进行四舍五入,这一步的作用是让均衡化之后的图像灰度级和之前相同

同理得到

*step6
以上步骤实际上是使用T(r)对原图进行了映射变换,在这一步输出变换后的图像
0 1 2
1 2 2
2 0 1
显而易见,本图在均衡化之后没有发生任何变化,那么直方图也就没有发生任何改变,当然现实生活中的图像不可能只有9个像素,灰度值的变化范围也要更为广泛。

使用python进行直方图均衡化

这里的关键是累计分布函数的使用(cumulative distribution function),简称cdf
在这里定义一个均衡化函数histeq

def histeq(image,nbr_bins=256):
    #计算原图直方图
    imhist,bins = histogram(image.flatten(),nbr_bins,normed=True)
    #计算累计分布频率
    cdf = imhist.cumsum()
    归一化
    cdf = 255*cdf / cdf[-1]
    #进行转化,生成新的像素值
    image2 = interp(image.flatten(),bins[:-1],cdf)
    return image2.reshape(image.shape),cdf

定义完我们试着去使用这个函数

image =array(Image.open('timg.jpg').convert('L'))
image2,cdf = imtools.histeq(image)



从直方图均衡化的结果来看,原始的高曝光图片亮度明显下降。值得注意的是转换后的图是不产生新的灰度级的,只会延展图片灰度级的范围(要理解这句话)。均衡化并不是指获得完全平坦的直方图,而是指使直方图获得延展,同时增加图片的对比度。

参考

《python计算机视觉编程》Jan Erik Solem 朱文涛 袁勇
https://blog.csdn.net/qq_15971883/article/details/88699218

posted on 2020-10-30 15:48  问道代码间  阅读(313)  评论(0编辑  收藏  举报