作者:romme
1、图像直方图概念
图像直方图用来反映一副图像的像素分布。其中,横坐标表示图像像素的灰度级,纵坐标表示每个灰度级对应的像素总数或占所有像素个数的百分比。
例如:灰度级为[0~255]的数字图像直方图,定义:
h(rk)= nk
其中,rk是第k个灰度级(k = 0~255),nk是该灰度级的个数。
若以每个灰度级的个数nk去除以图像像素总数n,则得到归一化的直方图,定义:
P(rk)= nk/n
即,P(rk)表示灰度级为rk发生的概率估计值。所以:一个归一化直方图,其所有部分之和应等于1。
2、为什么要做直方图均衡化
在图像处理应用中,若得到这样一副图片,其图像的灰度分布集中在较窄的范围内,那么视觉上就给人感觉,对比度较差,细节不够清晰。为了使图像变得清晰,就需要提升对比度。
如何提升对比度呢?即,对图像进行非线性拉伸,使得图像的灰度分布变宽,灰度值分布变得均匀。这样,在灰度级范围内,像素的个数分布大致相同,就会使得图像的对比度增强,细节更清晰。
那么,又如何使得灰度值分布均匀呢?即,直方图均衡化。
3、直方图均衡化原理
直方图均衡化,即将随机分布的图像直方图修改成均匀分布的直方图。
基本思想:对原始图像的像素灰度做某种映射变换,使变换后图像灰度的概率密度呈均匀分布。这就意味着图像灰度的动态范围得到了增加, 提高了图像的对比度。
作用:图像增强。
那么,我们使用哪种映射变换呢?答案是:累积分布函数。
说明:
①为什么要选用累积分布函数?
②为什么使用累积分布函数处理后,像素值会均匀分布?
直方图均衡化,必须保证:
①像素值经过映射变换后,原本的大小关系不能发生改变。即较亮的区域,依旧较亮;较暗的区域,依旧较暗。只是增大了对比度,绝对不能明暗颠倒,否则就不是原本的图像了。
②像素值经过映射变换后,不能越界。例如:8bit图像,像素值范围0~255;12bit图像,像素值0~4095。
由于累积分布函数是单调递增函数,可以满足条件①;又因为累积分布函数的值域为0~1,可以控制越界,满足条件②。
实则,有严谨的数学推导过程,在此直接给出公式,具体可以参考《数字图像处理---冈萨雷斯》一书。
其中,H(i)表示图像直方图,nk/n表示归一化。
所以,直方图均衡化实现过程:
(1)求图像直方图;(统计直方图每个灰度级出现的次数)
(2)做归一化处理;
(3)计算新的像素值。
4、FPGA实现
FPGA实现的核心在于算法,弄清楚原理,写代码只是一个机械的过程。假设一副图像:2464x2056, 8bit,即共有5065984个像素点,256个灰度级。参照上述直方图均衡化的步骤,用FPGA实现,效果展示如下:
本文转自: FPGA干货架,作者:romme
*本文由FPGA干货架授权转发,如需转载请联系作者本人