(1)图像的模糊度估计
通常,图像各个部分的模糊度都是不一样的,前景往往比较清晰,而后景则比较模糊。下面图9是比较典型的一张图像,图像中的男子是前景,而树丛是后景。我们可以看到,作为前景的男子比作为后景的树丛清晰得多。因此,我们可以利用前后景之间模糊度信息的差异,把前后景分割开来。

图9聚焦图像
在一幅图像中,高频部分是像素值变化较快的像素集合,而低频部分则是像素值变化较慢的像素集合。图像中的前景是比较清晰的,保留了较为完整的细节信息,所以包含大量的高频分量。相反,图像中的后景是比较模糊的,主要包含的是低频分量。通过测量图像的空间频率,我们可以估计出图像中各部分的模糊度。
于是,我们采用小波变换来分析图像的空间域高频分量。如下图10所示,离散小波变换可以表示成由低通滤波器和高通滤波器组成的树状结构。通过小波变换,我们可以分离图像的高频分量和低频分量。

图10小波变换树
下图11是二维小波变换的子带结果图。该图表示了4个子带,LL表示水平和竖直方向均为低通滤波的结果,HL表示竖直方向是高通滤波而水平方向是低通滤波的结果,LH表示竖直方向是低通滤波而水平方向是高通滤波的结果,HH表示水平和竖直方向均为高通滤波的结果。

图11二维小波变换分带输出
HH子带的滤波结果中,非零系数的数目代表了高频分量的多少。因此,对图像执行二维小波变换,计算HH子带的滤波结果中非零系数的数目,即可估计图像的模糊度信息。由前面的分析可以知道,非零系数越多,模糊度越低。
在本系统中,我们采用了简单高效的基于提升算法的5/3小波变换,其公式为:

其中,x(n)表示图像灰度值,c(n)表示小波变换后的高频系数,d(n)表示小波变换后的低频系数,n是整数。
在实际中,我们可以按照如下步骤进行模糊度的估计:
Step1:用
的卷积核来对原始图像进行空间滤波,滤波结果即为二维小波变换的HH子带;
Step2:将滤波后的结果划分成多个8*8的宏块;
Step3:统计每一个宏块中非零系数的数目,作为该宏块的模糊度。非零系数越多,模糊度越低。
(2)颜色分割
由于图像的每一个像素的模糊度都有可能不同,甚至相邻像素的模糊度发生突变,所以为了保持图像的一致性,避免渲染3D图像时可能产生的大量空洞,我们引入了颜色分割来对图像分割区域。
在颜色分割中,需要进行颜色空间的转换,从RGB空间转换到YUV空间。而环境的光照强度是难以控制的因素,所以应该优先考虑U分量和V分量。在本设计中,我们利用K-means聚类算法对图像中每一个像素的V分量去分类,以达到颜色分割的目的。
K-means聚类算法能将某个属性值相近的对象划分为一类。其工作过程可以描述如下:首先从N(N为图像像素总数)个数据对象中任意选择K(K为聚类数)个数据对象作为初始聚类中心,而对于剩下的数据对象,根据它们与这些聚类中心的相似度(用欧式距离来衡量),将它们分配给最相似的聚类;然后,重新计算每种聚类新的聚类中心,新的聚类中心是聚类所有数据对象的平均值。如此不断重复,直到每种聚类新的聚类中心与初始聚类中心相同,聚类就结束。在实际中,只需要每种聚类新的聚类中心与初始聚类中心相差一个很小的值,就可以认为聚类结束。
(3)模糊度松弛
松弛算法是一种应用于边缘检测的算法,我们将其引入来对图像的模糊度信息进行处理。经过松弛算法处理后,图像的模糊度信息将会更加明显,便于我们将前后景分割开来。
松弛算法的步骤如下:
Step1:将图像划分为多个8*8宏块;
Step2:计算当前宏块的模糊度,作为该宏块的信度c(k)(e);
Step3:计算相邻8个宏块的平均信度,即平均模糊度caver(k)(e);
Step4:由c(k)(e)和caver(k)(e),更新当前宏块的信度为c(k+1)(e)。更新过程如下:若平均信度caver(k)(e)大于预设阈值Threshold,则c(k+1)(e)=c(k)(e)+q;否则,有c(k+1)(e)=c(k)(e)-q(其中q为常量);
Step5:重复10次Step3和Step4,算法结束。
(4)亮度规则
在渲染出左眼图像的时候,我们采用了自己设计的亮度规则。分析大量的红蓝3D图像可以知道,红蓝3D图像的出屏和入屏与周围环境的亮度有关。当周围环境亮度较高时,红色分量在青色分量左边会造成出屏效果,否则为入屏效果;当周围环境亮度较低时,红色分量在青色分量左边会造成入屏效果,否则为出屏效果。
而在本系统中,我们希望3D图像的前景有出屏效果,而中景和后景有不同程度的入屏效果。所以,我们采取了如下办法:
首先,判断当前像素是属于前景,中景还是后景。然后,判断当前像素的周围环境的明暗程度。分开3种情况讨论:
1、如果当前像素属于前景,当周围环境较亮时,根据预设深度把当前像素移动到右眼图像对应像素的左边;当周围环境较暗时,根据预设深度把当前像素移动到右眼图像对应像素的右边。
2、如果当前像素属于中景,当周围环境较亮时,根据预设深度把当前像素移动到右眼图像对应像素的右边;当周围环境较暗时,根据预设深度把当前像素移动到右眼图像对应像素的左边。
3、如果当前像素属于后景,当周围环境较亮时,根据预设深度把当前像素移动到右眼图像对应像素的右边;当周围环境较暗时,根据预设深度把当前像素移动到右眼图像对应像素的左边。
用下述方法判断当前像素的周围环境的明暗程度:计算图像中每一个像素3*3邻域的亮度平均值,若亮度平均值大于亮度最大值的一半,则认为当前像素的周围环境较亮;否则,认为当前像素的周围环境较暗。对于部分邻域像素超出图像边界的问题,可以采用边界扩展的方法去解决。
(5)算法的仿真测试
1、视频2D转3D算法仿真
在硬件实现之前,我们都采用Matlab来对算法仿真测试。Matlab提供的图像处理工具包,使测试变得简单可行。测试选择的是前后景较为明显的图像,如下图12所示:

图12原始图像
经过小波变换后,提取图像的高频部分,然后把图像分成8*8宏块,统计各宏块非零系数的数目作为该宏块的模糊度。非零系数越多,模糊度越低。整张图像的模糊度估计如下图13:

图13模糊度估计图
可以看到,这种方法较好地表明了图像中元素的前后关系。可以此为依据,对图像的元素归类。
同时,我们采用颜色分割的方法去分割图像区域,分成3类,分类效果如下图14:

图14颜色分割图
同样,分割的效果令人较为满意。当然,不排除有部分像素分类错误,但这不影响最终的3D效果。
最后,经过合成的红蓝3D图像:

图15红蓝3D图
戴上红蓝滤色眼镜后,我们能够较为明显地看到图像的景深,具有较强的立体空间感。
2、图片2D转3D的算法仿真
对图片的2D转3D,我们也是采用上面的图片来进行仿真。首先,运用了小波变换来估计图像的模糊度。所以,模糊度图如图13所示。接着,对图像的模糊度信息执行松弛算法,松弛后的效果如下图16:

图16松弛后的模糊度估计图
可以看到,松弛会使图像的模糊度信息区分得更加明显。于是,我们想到用阈值化的方式来把较为明显的前景提取出来。执行阈值化后如下图17:

图17二值掩膜
上图17是一个二值图像,前景为1,后景为0。最后,我们就利用此掩膜把图像中的前景提取出来。

图18图像前景
可以看到,尽管提取的前景中包含了一部分空洞,但是整体效果不错。
把图像分割成前景和后景,然后对前景赋予较小的深度,后景赋予较大的深度,则可渲染出3D图像,如下图19所示:

图19红蓝3D图
(6)软硬件协同设计
SOPC的最大特点就是它的可编程性,可配置性。Altera提供的SOPC Builder是一个非常强大实用的工具,只需几个步骤就能将自定义IP挂载到总线上,界面友好,方便易用。而且,在SOPC Builder中,Altera已经提供了很多常用的IP,高度可配置,使得我们构建系统更加灵活,真的是"From concept to system in minutes"。

图20SOPC系统界面
1、软硬件协调
本系统充分发挥软硬件各自的优势,在视频的2D转3D中,把颜色分割的算法用软件去实现,其余都由硬件实现。颜色分割把结果存放在SSRAM中,供硬件使用。
首先,CPU要得到硬件端采集到的图像去执行颜色分割处理,于是我们编写了一个接口模块,一边的端口与硬件逻辑相连,另一边的端口则是Avalon总线协议的标准端口。这个接口模块负责把硬件采集到的图像以Avalon的协议写到SOPC系统的存储器中,那么CPU则可从存储器中获得图像数据。由于两边的数据速率不一致,所以接口模块用了一个FIFO对数据缓冲同步。而硬件要得到颜色分割的结果,则必须遵循Avalon总线协议去与SSRAM通信,所以我们也同样编写了一个相似的接口模块,负责读取SSRAM的颜色分割结果到硬件端。在系统的多个地方,都可以看到我们这样的自定义接口模块。
下图21,是我们的自定义接口模块的RTL视图。

图21自定义接口模块的RTL视图
在软硬件协同中,我们通过一个Buffer来把软件和硬件分离,却又联系在一起。软件运算出来的结果存放在Buffer中,接着硬件自发性地去读取。

图22自定义IP
这样做的好处是,使得软件和硬件之间的协调工作变得容易。
2、硬件加速
在最初设计的SOPC系统中,所有的软件运算均由运行在100MHz的NIOS2完成。由于颜色分割和前后景提取的算法中涉及大量的浮点数运算,即使用了fast类型的NIOS2,而且加大了CPU的指令缓存和数据缓存,还是未能满足我们的设计要求。特别是执行颜色分割的程序,很长时间才能得到分割结果。
于是,我们想到了Altera提供的强大硬件加速功能。在自定义指令、自定义外设和C2H三种方案中,考虑到实现调试难易程度和性能的提升比例,我们选择了使用自定义指令和C2H。在软件代码中,重复循环是非常耗时的运算。而C2H对重复循环运算有很大的性能提升,所以我们将软件程序中很多的重复循环运算用了C2H的加速方案。另外,浮点数运算也会消耗CPU较长的时间。因此,我们采用了自定义指令的加速方案。
采用了以上的加速方案后,软件的运行速度得到了非常大的提高,满足了我们的设计要求。
(7)移植UCGUI图形界面
为了提供友好的人机界面,我们在作品中移植了UCGUI图形界面系统。UCGUI是一种专门为嵌入式应用而设计的开源图形支持系统,适用于任何带标准编译器的8/16/32位CPU,并能在单任务或多任务环境中完美运行。而且,它占用的资源较少,非常适合于我们构建经济实用的嵌入式系统。
移植UCGUI,需要修改GUIConf.h,GUITouchConf.h和LCDConf.h三个文件,以适应我们的硬件平台。GUIConf.h文件定义了UCGUI的系统参数,如是否支持操作系统,缓冲区大小等。GUITouchConf.h文件则定义了触摸屏的参数,本系统不支持触摸操作,所以可不必理会。而LCDConf.h文件则是移植过程的难点,它定义了液晶屏的硬件配置参数,如色深,分辨率等。本系统采用了888的RGB格式,分辨率为640*480。图形界面直接显示在VGA显示器上,所以我们编写了VGA硬件控制器来对显示器进行控制,并添加了相应的驱动文件支持。
(8)移植UC/OS2实时操作系统
UC/OS2是一种可移植的,可植入ROM的,可裁剪的,抢占式的实时多任务操作系统内核。它具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB。由于UC/OS2众多的优势,而且提供源代码,便于我们学习使用。于是我们选择了UC/OS2去扩展系统的性能,提高系统的执行效率。更为欣喜的是,Altera公司已经把UC/OS2移植到NIOS2上,我们可以直接使用。
(Revision: 2 / 2011-08-26 08:54:54)