基于FPGA的改进实时图像增强算法的设计与实现

当今社会,监控技术应用十分广泛。但是很多监控设备大都处于户外工作环境。而外界环境的多变性增加了监控的难度,典型的情况就是天气因素,比如大雾,阴天等等,这些因素会增加监控的难度,甚至使系统无法正常工作。为了保证监控能够在各种天气条件下正常进行,研究图像增强技术具有重大意义。图像增强是一种基本的图像预处理手段,其目的是为了改善图像的质量,针对给定图像的模糊状况以及它的应用场合,有目的的强调图像的整体或局部特性,提高图像可辨识度,改善人对图像的视觉效果,让观察者得到直观清晰的、适合于分析的依据,使图像更有利于观察和后期的分析处理。一般通过对图像的某些特征进行强调突出,从而显示我们有需要的信息,提高图像的使用价值和应用价值[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三个通道的图像增强处理功能。

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/108897518