导航菜单

三维图形纹理函数在二维图像处理中的应用

张天昊 何志毅

(桂林电子科技大学信息与通信学院,广西 桂林 541004)

【摘 要】针对邻域均值滤波算法在处理二维图像时占用了大量时间费用,设计了一种基于Direct3D技术的均值滤波方法。该方法在运用Direct3D函数对二维图像渲染的过程中,用着色器替换固定功能管线中的变换和光照阶段,并通过GPU对顶点格式中的纹理坐标进行操作,最终降低了均值滤波算法的时间复杂度。

教育期刊网 http://www.jyqkw.com
关键词 Direct3D;着色器;纹理;均值滤波

作者简介:张天昊(1989—),男,硕士研究生,研究方向为视频图像采集与处理。

指导教师:何志毅(1965—),男,教授,研究方向为光电显示与照明和计算机图形图像技术等。

0 引言

在采集视频图像的传输过程中,受诸多因素的影响,可能导致图像的退化。均值滤波是一种常用的线性平滑滤波器[1],因易于设计和在多处场合的优越性能而成为信号处理的重要手段,它直接在图像空间域上对图像局部窗口取均值代替窗口中心像素的值,可以在一定程度上对高斯噪声加以抑制。但由于其运算的时间复杂度高,因此不能满足帧速较高的实时视频图像的处理[2]。

然而图形硬件技术的飞速发展给予了我们这种契机。从90年代中期开始,Direct3D7.0 引入了基于硬件加速的“转换和光照(transform and light, T&L)”,并首先得到了NVIDIA公司的 GeForce 256(代号 NV10)芯片的支持,从而使得三维硬件加速从单一的光栅化发展成为具有多个阶段的渲染流水线[3]。运用Direct3D技术在加速处理图像和计算机视觉中的应用研究成果最为突出。Fung 等人利用 GPU的高速计算能力,实现了基于相机的人脸跟踪系统[4],Abate 等人实现了在GPU上基于Direct3D的三维人脸识别[5]; Ujaldón 等人利用 GPU 中的光栅器实现了 Hough 变换,用于在二维图像中检测圆[6]。现有的成果也以事实证明,将均值滤波移植到Direct3D中来,可以实现对其时间复杂度的降低。

1 邻域平均法的均值滤波

邻域均值滤波法是一种空间域图像增强法,是典型的线性滤波算法,它是指在图像上对目标像素给定一个模版,该模版包含了其周围邻域的像素(已目标像素为中心的周围8个像素,构成一个滤波器),再用模版中的全体像素的平均值来代替原来的像素值。

设定F(x,y)为N*N的输入图像,若平滑增强后的图像为G(x,y),则有

(1)

其中x,y=0,1,...,N-1;S为(x,y)邻域内像素坐标的集合;M表示集合S内像素的总数。根据M值的选取分为了如下几个常用的滤波模版:

(2)

采用1/8的模版用VC++对邻域均值算法加以实现,得到噪声图像的处理前后效果如图1所示。

均值计算占用了均值滤波处理的大量时间费用[7],接下来我们将介绍如何运用Direct3D进行图像的均值滤波并大幅度降低该算法的时间复杂度。

2 基于Direct3D渲染目标

2.1 Direct3D和GDI访问硬件的不同方式

目前在Windows上采用GDI(图形设备接口)的处理方法主要分为空域方法和频域方法,空域方法直接作用于图像中的像素点,该方法延伸的算法便于理解,但是每次处理都要遍历每一个像素点,占用大量内的内存和耗费很长的时间,因此不适用于对视频进行操作和处理。频域方法则将初始图像通过傅里叶变换至频率域,对频率域进行处理,经过傅里叶反变换后获取图像结果。因其基本采用的都是高精度的算法而经常运用在目标检测、目标跟踪等实际应用上。但是大量的数学运算需要占用一定的内存空间,因此一些高复杂度的算法会占用处理每帧图象的时间而无法达到帧同步既而无法完成要求较高的基于视频的目标检测。Direct3D技术的诞生则解决了一些帧同步的问题。由于其Texture直接对底层硬件进行操作,因此可以用很少的代码,就可以使用Direct3D的新接口完成二维图形处理而仅仅占用少量的时间。另外,还可以得到各种各样非常卓越的效果,例如缩放、旋转、透明以及光照等,而且Direct3D技术对硬件支持广泛,其显示效果完全能够达到视频逐帧图像处理的要求。

2.2 渲染流程

渲染3D对象的任务可分为两个阶段,第一阶段成为转换和照明。在这个过程中,未经转换和照明的顶点从一段进入,经过网格化和固定功能的管道从另一端出来。其中,固定管道包括世界变换、观察变换、背景剔除、灯光材质、裁剪、投影变换、视口变换几个步骤。第二阶段称为光栅化处理,图元用于将这些经过经过转换并添加了照明效果的顶点组织为点、线和三角形。光栅处理程序使绘制结果形成DireceDraw表面,该表面成为渲染目标,同时应用纹理映射图并添加多种属性,如两个相连顶点间的颜色。

3 基于Direct3D的均值滤波方法

邻域平均法的均值滤波是图像预处理中图像平滑和消噪常用的方法。由于均值滤波算法的时间复杂度较高而不被应用于视频帧处理中。本节主要讲述如何运用Direct3D中的顶点着色器和像素着色器来对纹理坐标进行操作来降低均值滤波算法的时间复杂度从而达到对每帧图像通过均值滤波进行平滑预处理的目的。

顶点着色器(Vertex Shader)是一个在图形卡的GPU上执行的程序,它可以进行编程,并将代码传给GPU进行计算,然后通过屏幕显示出来。它替换了在渲染3D对象中固定功能管线(fixed function pipeline)中的变换(transformation)和光照(lighting)阶段。顶点着色器通过顶点作为输入数据,只要将顶点缓存数据传入GPU就会执行;像素着色器(Pixel Shader)以从顶点着色器输出的值为基准,对画面输出的像素进行运算。下面给出每一步的具体实现原理:

3.1 初始化3D环境

Direct3D需要经历几个步骤来为应用程序做准备:

创建IDirect3D9对象。

检查IDirect3D9对象的性能并选择一个合适的设备类型。

为适配器选择一个显示适配器和显示模式。

创建并初始化IDirect3DDevice9对象。

将待处理的位图加载到纹理上。

3.2 在MFC中构建Mesh类

在Mesh中内置所有顶点缓冲、索引缓冲以及顶点格式的信息。顶点缓冲是储存顶点信息的一种方法,它的内存由Direct3D进行管理并存放在显存内,而不需要渲染每一帧时再将数据拷贝到显卡,从而提高了处理图像的性能。索引缓冲就像一个包含了数字的数组,而这些数字引用了顶点缓冲中的顶点,索引缓冲有点像将顶点缓冲作为顶点的调色板来使用。当顶点着色器和像素着色器对顶点数据进行处理后,使用DrawSubset()方法用纹理对Mesh中的表面进行渲染。以下为用处理后的纹理渲染Mesh的关键代码:

m_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR _ZBUFFER, 0x99999966, 1.0f, 0); //将后备场景清除为黑色

m_pd3dDevice->BeginScene();//开始场景

/*设置顶点渲染常量寄存器*/

m_pd3dDevice->SetVertexShader(m_pVsh); //顶点渲染

m_pd3dDevice->SetPixelShader(m_pPsh); //像素渲染

m_pd3dDevice->SetTexture(0, pM->m_pTex); //设置使用的纹理

pM->m_pD3DMesh->DrawSubset(0); //用DrawSubset方法渲染Mesh

m_pd3dDevice->EndScene();//结束场景

3.3 着色器对顶点坐标进行操作达到均值滤波效果

上述代码中的m_pVsh即为顶点着色器文件,m_pPsh为像素着色器文件。下列三行代码和两个着色器内的代码共同完成了对顶点坐标进行操作的任务。

float ifl = 0.001f;

m_pd3dDevice->SetVertexShaderConstantF(13, D3DXVECTOR4(ifl, -ifl, ifl*2, -ifl*2), 1);

m_pd3dDevice->SetVertexShaderConstantF(14, D3DXVECTOR4(0.0006f, 0.0016f, 0, 0), 1);

上述代码声明了常量寄存器来使着色器得到变换矩阵。由于着色器直接在GPU操作,因此采用汇编语言进行编码。

其中,每一个顶点信息中最多包含八组纹理坐标。我们的目的是将一组原始的顶点纹理坐标通过矢量的运算最终形成八组纹理坐标并储存在一个顶点信息内。每个形成的纹理坐标分别对应原始纹理坐标在二维平面上、下、左、右、左上、右上、左下、右下平移后的位置。平移的量值根据上述声明的常量寄存器而定。

顶点着色器的目的是将八组纹理坐标加载到顶点信息内,接下来的任务就交给像素着色器m_pPsh对纹理进行渲染。在m_pPsh内,分别用八组纹理坐标对原始纹理的像素进行加载,并把八组渲染结果累加在寄存器r0中,则当前每个像素点的值就相当于邻域八个点像素值的累加之和。对r0中的数据求均值,最终得到的纹理图像即可达到对原始纹理图像均值滤波的效果。

3.4 将渲染后的纹理加载到表面上进行处理

将处理后的纹理加载到表面上,通过对表面的操作既而达到了对纹理内的图像的操作。若想对预处理后的图像进行下一步的操作,只需处理表面内部的RECTs数组。它描述了表面所包含的矩形区域的像素,获得它之前需要锁定图像表面。锁定图像表面和传输顶点数据到顶点缓冲的采用的方式相似:

m_pMesh->m_pTex->LockRect(0, &m_pMesh->m_TexRect, 0, 0);//锁定图像表面

/*在这里对m_TexRect内的像素进行操作*/

m_pMesh->m_pTex->UnlockRect(0);//解锁图像表面

最终将表面内的内存数据显示在屏幕上,即完成了运用Direct3D技术对二维图像进行均值滤波预处理的全部流程。另外,在Mesh中创建不同大小的原始纹理坐标亦可对整幅位图进行插值或均值处理。由此可见,Direct3D技术在处理二维图像中还有广阔的发掘前景。

4 结语

本文介绍的这种用着色器配合Direct3D的渲染技术对二维图像的处理方法,不仅仅大幅度的降低了均值滤波算法的时间复杂度,还可以加速实现后续对纹理中整幅位图的全局处理,例如图像的缩放,旋转等等,并且对图像的处理速度较比于通过GDI访问硬件进行处理提升了三到四倍。

教育期刊网 http://www.jyqkw.com
参考文献

[1]王明翠,顾海明.均值均方差在基于 DCT 的图像压缩算法中的应用[J].计算机应用,2007,27(B06):162-163.

[2]张丽,陈志强,高文焕,等.均值加速的快速中值滤波算法[J].清华大学学报:自然科学版,2005,44(9):1157-1159.

[3]From Wikipedia. Graphics processing unit[OL]. http://en.wikipedia.org/wiki/Graphics _processing_unit.2009.

[4]Fung J, Mann S. Computer vision signal processing on graphics processing units[C]//Acoustics, Speech, and Signal Processing, 2004. Proceedings.(ICASSP´04). IEEE International Conference on. IEEE, 2004, 5: V-93-6 vol. 5.

[5]Noe K ?覫, Tanderup K, Lindegaard J C, et al. GPU accelerated viscous-fluid deformable registration for radiotherapy[J]. DAIMI Report Series, 2007,36(583).

[6]Ujaldón M, Ruiz A, Guil N. On the computation of the Circle Hough Transform by a GPU rasterizer[J]. Pattern Recognition Letters, 2008,29(3): 309-318.

[7]常瑞娜,穆晓敏,杨守义,等.基于中值的自适应均值滤波算法[J].计算机工程与设计,2008,29(16):4257-4259.

[责任编辑:汤静]

下载文本