1.对比度增强原理
对比度增强是个广泛的话题,前文中关于直方图均衡的方法,其实就是一种对比度增强。而对比度增强,就是提高明暗之间的差异,从而达到提高图像对比度、改善主观视觉效果的目的。
采用直方图均衡的方法,其实是对图像灰度的拉伸,但本文将介绍的,是基于曲线灰度映射变换。典型的比如指数变换,对数变换,Gamma变换等等。
为了直观的说明对比度增强的效果,我们先生成一张灰度对称分布图,以指数对比度增强为例,效果如下所示。可见对比度增强后的图,黑色部分更黑了,白色部分更白了,对比更明显了。
然后我们进一步分析增强前后的直方图,可见增强后图像的直方图,暗的像素值更暗的,亮的像素值也更亮了,敏感之间的对比更大,那么对于对比度较低的图像,增强后确实可以提高可视度。
相关代码如下:
指数对比度增强有很多方法,但万变不离其宗,即以一定阈值为中心,提高阈值以上的亮度,并降低阈值以下的亮度。典型的以对数对比度增强函数为例,公式如下所示:
针对阈值=127,E取2/4/6的曲线,使用Matlab绘制,如下所示:
如上图所示,分别是E=2,E=4,E=6的指数对比度增强曲线,横坐标为原始像素,纵坐标为映射后的像素。从曲线可见,E的值越大,对暗区的压缩及亮区的提升程度就越大,那么明暗之间的对比就越明显,即E可以表示为图像对比度增强的程度。图中三条曲线交汇在阈值127处,那么也可以采用不同程度增强曲线的融合模式,比如阈值以下采用E=2,阈值以上采用原值或E=6方式,区别对待图像明暗区域的对比度。
2.指数对比度增强Matlab实现
这里以阈值=127,E=7为例,我们看一下对比度增强后的图像效果。其中matlab代码如下:
对比度增强后的图如下所示,可见原图对比度较低,整体给人灰蒙蒙的效果,而右图则看起来更通透,明暗之间的对比度更加鲜明,整体视觉效果也更好了。
结合之前讲过的直方图均衡算法,与现在指数对比度增强效果以及各自的直方图进行对比,如下图所示:
我们从以下几个方面去对比效果:
1)对比度:
由灰度图可见,明暗对比不明显。通过对比度增强,压缩了暗区并提高了亮区,明暗对比度提高了;通过直方图拉伸后,将图像灰度拉伸到0-255,自然明暗之间的对比度也提高了。不过对比效果,直方图对比度更高,同时也引入了局部过曝的问题。
2)直方图
由直方图可见,原图像素集中在100左右,对比度增强后,压缩/拉伸到25-150,而直方图均衡后拉伸到了0-255,因此从当前测试图来看,直方图拉伸后的动态范围更宽,不过这也因图而异,比如原图就比较亮的图,对比测试效果如下,对比度增强后效果还差强人意,而直方图拉伸后图像过暗,因为本身偏亮,拉伸后则整体亮度降低了。
3.指数对比度增强FPGA实现
直方图拉伸,本质上是对像素概率的统计,然后进行扩展拉伸。
而对比度增强,无论是指数函数,还是各类曲线映射,其本质上就是一种像素映射操作。由于指数函数、对数函数等,实时的计算比较耗时。并且当选定参数后,其结果是固定的,因此可以根据参数提前计算好函数的映射结果,再以数组的方式进行索引,得到计算后的结果。这种方法,在学术领域通俗的讲就是Mapping操作,可在X-Y坐标上找到各自的映射点。
以E=7,THRESHOLD=127为例,指数对比度产生的结果如下所示(reshape是为了方便在Command Windows中显示,实际上是一个一维数组),在matlab中可以直接根据如下结果进行索引映射。
在FPGA中进行Mapping操作时,可以将数组存放在RAM或者以RTL源码的方式进行映射。FPGA的RAM采用的是mif或hex的格式进行存储,并且在生成RAM的时候需要进行文件的指定。由于256Byte的存储不大,同时为了提高移植的灵活度,这里我推荐使用RTL源代码的方式,并且使用matlab直接生成verilog文件。以指数对比度增强为例,生成文件的源码如下所示:
在当前文件夹下将会生成Curve_Contrast_Array.v文件,即为Matlab生成的曲线对比度映射verilog文件,由于最终实现只是一个简单的地址译码,电路相对比较简单,因此直接采用组合逻辑实现,生成的代码如下所示:
至此,我们已经生成好了Mapping的数组,那么在FPGA中只需要简单的映射就可以完成指定强度的对比度增强算法,即只需要例化该模块,进行原始数据的映射,输出增强后的数据即可,相关代码如下所示:
4.RTL仿真结果及实测
原文标题:图像指数对比度增强之Matlab&FPGA实现
文章出处:【微信公众号:FPGA技术江湖】欢迎添加关注!文章转载请注明出处。
全部0条评论
快来发表一下你的评论吧 !