当今社会,监控技术应用十分广泛。但是很多监控设备大都处于户外工作环境。而外界环境的多变性增加了监控的难度,典型的情况就是天气因素,比如大雾,阴天等等,这些因素会增加监控的难度,甚至使系统无法正常工作。为了保证监控能够在各种天气条件下正常进行,研究图像增强技术具有重大意义。图像增强是一种基本的图像预处理手段,其目的是为了改善图像的质量,针对给定图像的模糊状况以及它的应用场合,有目的的强调图像的整体或局部特性,提高图像可辨识度,改善人对图像的视觉效果,让观察者得到直观清晰的、适合于分析的依据,使图像更有利于观察和后期的分析处理。一般通过对图像的某些特征进行强调突出,从而显示我们有需要的信息,提高图像的使用价值和应用价值[1]。不过值得注意的是,图像增强并不意味着能增加原始图像的信息,甚至会损失一些信息。但图像增强的结果却能加强对特定信息的识别能力,使图像中我们感兴趣的特征得以加强。
大多数成像系统具有一定的亮度范围,但实际情况中,由于各种因素的影响,图像常常表现为对比度不强、图像模糊不清,图像细节无法分辨的情况。所以我们需要通过某些算法来调整对比度,亮度,增大图像的动态范围,扩展图像对比度,改善图像的视觉效果,并最大程度上突出图像的细节信息。图像增强技术一般可分为空域算法和频域算法两类。空域算法是指直接对图像灰度级做运算,频域算法则通过FFT首先将图像变换到频域,然后在频域进行处理,对图像的变换系数值进行某种修正,是一种间接增强的算法[2]。
2.1 点运算图像增强
点运算处理是一种简单的图像增强算法处理技术,它通过改变像素点的灰度值来实现图像增强的效果,是图像增强的重要手段之一。通常情况下,点运算可以分为线性点运算和非线性点运算两类。
线性点运算:输出灰度级与输入灰度级呈线性关系,其一般可以用如下的式子表示:
当a =1,b=0时,输出图像与输入图像相同。
当a>1时,输出图像的对比度增强。
当a<1时,输出图像的对比度减弱。
当a =1,b≠0时,输出图像的整体像素点灰度级将增大或减小。
非线性运算:输出灰度级与输入灰度级呈非线性关系,其分为对数形式和指数形式,其表达式如下:
当原图像的灰度动态范围较大的使用对数形式。
当需要对图像的高灰度区给予较大的扩展时使用。
点运算处理的最大有点就是处理简单,即使在硬件上也非常方便的实现,但是其功能有限,无法处理图像的一些细节信息。
我们将在MATLAB中来实现Retinex算法。
>首先将图片类型转换为double型:
IM=double(image);
>将输入的图像放在对数域中处理:
I=log(IM+1);
>将增强后的结果图像中的像素点的灰度值都初始化为一个常数:
const=mean2(image);
r(i,j)=const;
>在水平位置上,令h=width/2,计算与之间的相对明暗关系:
relation(i,j)=I(i,j+h)-I(i,j);
r(i,j)=r(i,j)-relation(i,j);
r(i,j+h)=r(i,j+h)+relation(i,j);
>在垂直位置上,令l=height/2,计算与之间的相对明暗关系:
relation(i,j)=I(i+l,j)-I(i,j);
r(i,j)=r(i,j)-relation(i,j);
r(i+l,j)=r(i+l,j)+relation(i,j);
>最后输出:
mi=min(min(r));
ma=max(max(r));
Channel_out=(r-mi).*255/(ma-mi);
下面我们对多组测试图片进行仿真,其结果如下所示:
(c) (d)
(e) (f)
图1 retinex增强前后的效果对比
图3.1中a,c,e为增强前的模糊图像,b,d,f为增强后的图像。很明显,图像得到了增强,很多细节部分能够看的更加清楚,图像组中比较模糊的图像通过增强算法之后也变得更加的清晰了。上面的仿真我们只是从定性上分析了图像增强的功能,下面我们将通过结果分析定量上分析图像增强的具体变化,从而深入了解图像retinex增强算法的功能。
为了更进一步分析图像增强前后的图像变化,我们将对仿真结果进行分析,通常情况下,我们需要分析直方图,熵值。
·灰度直方图
任意选取一个图片,通过其灰度直方图进行增强分析,如图2所示。
(a)增强前的图像和图像灰度直方图
(b)增强后的图像和图像灰度直方图
图2灰度直方图
通过上面的直方图,我们可以看到增强前,直方图几种在100~200的范围内,而且值的变化比较快,通过增强处理后,直方图的值范围变宽,而且变化变得更加的缓慢,这样从视觉上看图像显的更加的柔和。
·熵
图像的熵值反映了图像的信息量,熵越大,信息量就越大,那么对应的图像的细节越丰富,下面我们对增强前后的图像计算其熵。
我们分别计算三组测试图片的熵,其计算结果如表1所示:
表1 图像熵值
图像 |
增强前的熵 |
增强后的熵 |
01.jpg |
11.1352 |
13.4288 |
02.jpg |
10.9280 |
12.9896 |
03.jpg |
9.9702 |
12.8364 |
通过上表结果可知,通过图像增强之后,图像的熵明显比增强前大,这说明图像增强对图像的细节有明显的改善。
4.1 系统总体结构
本系统我们将在Altera公司的FPGA下开发,使用的软件为QuartusII。系统主要包括串口接收模块,图像存储模块,图像处理模块和图像输出模块,系统的总体结构如下图所示。
图3 系统总体结构
其中图像处理模块包括对数模块,均值模块,相关求解模块,运算结果输出模块。本文我们首先将重点介绍图像处理模块的各个功能。
本系统图像是通过串口输入到FPGA中的,串口我们采用的是8位串行输入,即每个串行信号输入一个像素点,而对于彩色图像,则一个串行信号输入R,G,B中一个通道的像素信息。由于FPGA中资源有限,我们不可能像在MATLAB中做大规模的矩阵运算,我们需要修改该算法,使其以流水线的方式在FPGA中正常运行。通常在FPGA中,我们将采用如下的结构对Retinex算法进行实现。
图4 FPGA硬件实现总体结构
从上面的结构,我们可以看到,此系统主要包括对数,自然指数以及亮度估计三个主要模块,下面我们逐次进行介绍。
本系统考虑到DE2系统资源以及LCD显示的问题,我们统一使用128*128像素的图片资源进行设计与实现。图片像素通过串口进入FPGA,存入SDRAM中,按照地址,存储是按顺序依次排列的,我们在发送图像的时候,按每行一次发送,则在MATLAB中对于某个像素点坐标(i,j),其对应的SDRAM地址为:128i+j-128。比如第2行第3列的像素点,其坐标则为131。这样我们就可以对图像进行操作了。
我们通过查找表在FPGA中实现对数求解。由于图像的像素值在0~255之间,所以我们将输入的数值作为地址,而地址中的值储存对数结果,而对于对数结果的小数部分则通过放大的办法使其得到整形,然后在最后的运行结果除以对数部分扩大的倍数即可,本系统我们将求对数的值扩大2^9倍,那么其他数据也将扩大2^9倍,扩展后的对数结果其运行位宽为12位。
其仿真波形如图4所示。
图4 log仿真结果
如图4所示,当输入的是1的时候,其地址为0,其对数值为0,当输入的值为2,其地址为1,对应的值为0.6931,扩大2^9后值为354.8672,即仿真结果中的355,所以对数结果正确。
然后对自然指数进行查找表设计,由于图像中的像素值最大为255,所以在求指数查找表的时候,其指数最大为log(255)=5.5413,由于在求对数的时候,我们将数值扩到了2^9.即512倍,所以我们对应的指数最大值为5.5413*512=2837。即地址应该从0~2837。
其仿真波形如下图5所示。
图5 exp仿真结果
亮度的估计,我们在这里也是采用查表的方式进行解决,主要通过函数的像素值来通过查找表的方法来求得。
图6 反射G值的仿真结果
由于亮度值比较小,为了防止在FPGA运行中有限字长效应导致截位后变0,所以我们将G扩大了2^16倍,然后最后的运行结果中再移位16即可。
最后我们只要将这三个模块按照图4的结构进行顶层模块的调用就可实现图像增强系统,为了更能直观的看到FPGA设计的结构,我们使用顶层原理图模式对系统进行设计,顶层系统的基本结构如图7所示。
图7 单个通道的图像增强模块原理图
其仿真结果如下所示:
图8单个通道的图像增强模块仿真图
至此,我们完成一个通道的图像增强算法的FPGA实现,只要对该模块进行三次调用,我们就能实现彩色图像R,G,B三个通道的图像增强处理功能。