adxiaowei

浅谈基于FPGA的直方图均衡化

0
阅读(7001)

     本文声明,根据牛人博客,总结描述的。。。

     http://blog.chinaaet.com/detail/37431

     http://blog.chinaaet.com/detail/37437

     直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布,这样就增加了象素灰度值的动态范围从而可达到增强图像整体对比度的效果。

     无论是基于MATLAB 还是基于opencv 或是基于FPGA无非就是对算法进行描述,只不过是描述的方式不一样罢了,重要的是design。。。

    直方图均衡化在数字图像处理中,有很广泛的应用。比如低照度算法,透雾等,就可以用最基本的直方图均衡算法来实现。当然仅对于这两种算法优化而言,还是远远不够的。只不过对于理解图像而言,已经有很大的意义。

     

“直方图均衡算法,说白了,就是将一副低动态的图像,拉伸为宽动态。何为低动态,就是图像像素值集中在某一区域,没有在【0,255】内均匀分布,这使得我们看着图像很压抑,施展不开的感觉。而我们的目的,就是为了将一副低动态的图像,拉伸至宽动态,在一定程度上来增强图像的效果。在此只考虑256级的灰度图像,进行最基本的直方图均衡算法讲解。实现我们要知道每一级灰度的概率(PDF),继而计算[0,255]灰阶出现的累积概率,最后将初始值映射回去,得到最终的像素点。

   算法基于黑白相机MT9V034为数据源利用FPGA做处理,利用USB传输至上位机显示。

   直方图均衡化算法分为三个步骤,第一步是统计直方图每个灰度级出现的次数,第二步是累计归一化的直方图,第三步是计算新的像素值。

     详细步骤请看http://blog.chinaaet.com/detail/37431

    算法主要有两个步骤

         1、计算灰度的累积出现个数

     2、进行像素的映射  

  那么这样就需要一个帧缓存区,FPGA要想存640*480Byte的数据就需要外部存储器,很麻烦

  本设计利用两帧像素输出一帧像素的想法,即第一帧像素计算灰度的累计出现个数(FPGA中来个256的状态机就完事了),第二帧用来进行像素的映射(结果必然在[0,255],而且分母远大于分子,不会出现浮点

也就是s(IMG(x,y))/1205     对于1205是映射至0--255,由于本人利用FPGA的资源有限,直接除以1205出错如下:

想看到结果,设备却不给力,咋办。。。移位移位、、、、

将1205还成1216(19*64)

1205是这样来的255/307200=1/1205   对应映射灰度0-255   

1216很明显    252/307200=1/1216   对应映射灰度0-252

只能这样了 1216=19*64,也就是1/(19*64),先除以19之后右移6位(2的6次方等于64)

搞定,看一下效果:

原图



直方图均衡化之后(映射范围0--252)