马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
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实现的核心在于算法,弄清楚原理,写代码只是一个机械的过程。假设一副图像:384x240, 8bit,即共有92160个像素点,256个灰度级。参照上述直方图均衡化的步骤,用FPGA实现,例化2个Dual Port Ram,Ram1实现缓存,Ram2实现映射。最终效果展示如下:
欢迎各位关注我的微信公众号:FPGA干货架
|