基于C++AMP的计算机图像视频处理

2018-05-28 01:24马明栋
计算机技术与发展 2018年5期
关键词:邻域算子图像处理

苏 锦,马明栋

(南京邮电大学 通信与信息工程学院,江苏 南京 210003)

0 引 言

现今,计算机技术飞速发展,数字图像处理技术也随之快速发展,因此人们对数字图像处理的要求越来越高。如现在的智能手机不单单仅只是靠处理器的性能作为卖点,更加寻求在拍照方面的提升,清晰的图片以及更高的分辨率能够提供更好的体验。图像并行技术融合了数字图像处理和并行计算两个方面的特性[1]。计算机图像处理通过目前非常流行的并行技术和数字图像处理实现并行化,不仅能够处理大规模的数据,并且在处理速度上也大大提升。这点在图像处理中的作用尤为显著,在图像处理的过程中提升了不少速度,节省了很多时间,并且对于边缘的提取也很有成效[2]。

目前,国内在计算机并行计算技术研究方面颇有成效,在很多对性能要求很高的并行计算应用方面都取得了一定的成果。使用比较多的并行技术有三种,除了CPU并行技术和GPU并行技术外,用到最多的是异构平台CPU+GPU,它结合了前两种的优势。这三种技术都有自己独特的优势,可以根据需求使用。

计算机图像视频的处理在各领域应用广泛。视频监控在生活中无处不在,无论是道路监控还是其他方面的视频监控都需运用计算机图像处理技术,但是对于监控视频图像,大多在数据处理上很欠缺,大部分监控视频的分析处理都是由人工完成的。如在小区安全监控方面,当有偷窃安全事故发生时,往往需要花大量时间来翻看近段时间的监控视频,加上视频的画质非常模糊,获取到有用的信息非常困难,这给案件的处理造成了极大的不便。因此获取高质量以及快速的视频监控是非常急需的。

在当前视频图像处理的基础上,基于C++AMP并行处理对传统Canny算法进行改进,使得在图像边缘处理、图像的连续性以及图像处理的速度方面获得一定的提升。

1 C++AMP基础概念

C++AMP作为一种新的GPU并行计算技术,是对C++的一种扩展,模板类型是在进行并行时所需的。为了降低并行软件在开发上的难度,且避免在开发过程中的一些安全问题,C++AMP的开发者提供了类型安全的泛型,保证在使用时不会出现错误的数据类型。

C++AMP作为并行库和语言的扩展,可以在程序中实现异构计算。通过使用C++AMP创建不会过时以及可移植的应用程序,可以让那些适合并行计算的程序的运行速度显著提高。

如果GPU获取处理数据以及获取输出结果的时间比GPU节省的时间更长,那么将会使程序变得非常复杂。可以使用工具来获取GPU性能,保证在GPU处理大量数据时获取实时性能。使用开发工具Visual Studio中的一些新功能有助于研究它的性能[3]。

C++AMP编写的可执行程序可以在各种计算机上运行,它还有一个非常重要的特征就是不会过时,可以将用它编写的程序部署在云端,供其他计算机使用。C++AMP中的GPGPU编程可以使开发者获得很多益处。它是通过GPU和CPU的向量处理单元,利用异构计算的一种方法。随着不断地发展,其规模越来越大,应用越来越广泛。

C++AMP经历了CPU并行的发展过程,现在已经是CPU+GPU的异构并行阶段[4]。C++AMP和Visual Studio作为主流开发人员所需要的工具、库和框架,使得异构计算变得更加容易[5]。基于这些,在图像处理方面会有极大的提高,以后人们就不会再面对长达几十甚至上百个小时的监控视频发呆,而是直接分析计算机给出的数据,当前画面中有多少人、都是谁、谁的动作可疑等。总之,智能监控将会迅速发展。

2 传统Canny算子

在图像处理的过程中,滤除噪声是非常重要的一步。图像噪声很容易影响图像的边缘检测结果,为了使得到的图像更加平滑,可以先对图像进行高斯滤波,然后再进行卷积,这样得到的图像相对更加平滑[6]。

传统的Canny算法是利用二维高斯函数的一阶导数来实现平滑处理,设二维高斯函数为:

(1)

梯度向量为:

(2)

(3)

(4)

然后将图像f(x,y)分别与得到的两个滤波器卷积,从而得到图像I(x,y),且

(5)

(6)

上式中,k为一个常量;σ为一个决定高斯滤波器宽度的分布参量。相比σ小的滤波器信噪比低;比σ大的滤波器虽然精度相对低一点,但是它的信噪比高,得到的图像会更加平滑。

梯度的方向和幅值可以用有限差分计算,一阶差分卷积为:

(7)

φ1(m,n)=f(m,n)*H1(m,n)

(8)

φ2(m,n)=f(m,n)*H2(m,n)

(9)

(10)

(11)

边缘检测点的位置只有当沿θφ方向两个相邻像素点的梯度幅值小于等于φ(m,n)时,才有可能是该位置[7]。

双阈值算法使用高、低两个阈值检测与连接边缘,分割得到两个阈值边缘图像T1(i,j)和T2(i,j),因此得到的图像边缘信息是正确的。为了保证T1(i,j)中在图像上没有间断,双阈值算法需要把边缘连接成完整的轮廓,遇到轮廓端点时,为了让轮廓上的边缘连接起来,该算法就在由低阈值得到的边缘图像T2(i,j)的8邻域位置寻找。然后利用递归算法在T2(i,j)中寻找边缘,直到T1(i,j)中的轮廓形成一个完整的图像为止[8]。

3 Canny算子优化及其并行化

3.1 Canny算法优化

对于传统Canny算法,为了求图像梯度幅值,可以通过2×2邻域内的有限差分来计算。但是这种方法对噪音的要求很高,只要有一点检测出来的边缘效果就很差。改进的Canny算法可以很好地解决这个问题。首先采用3×3邻域代替2×2邻域,然后在x方向、y方向、45°方向和135°方向计算一阶偏导的差分,利用差分结果计算图像的梯度幅值[9]。这种方式可以准确地定位边缘信息,得到非常好的处理效果,避免噪声带来的影响。

x方向的偏导数为:

Fx(x,y)=I(x+1,y)-I(x-1,y)

(12)

y方向的偏导数为:

Fy(x,y)=I(x,y+1)-I(x,y-1)

(13)

45°方向的偏导数为:

F45°(x,y)=I(x-1,y+1)-I(x+1,y-1)

(14)

135°方向的偏导数为:

F135°(x,y)=I(x+1,y+1)-I(x-1,y-1)

(15)

水平方向的差分为:

Ex(x,y)=Fx(x,y)+[F45°(x,y)+F135°(x,y)]/2

(16)

垂直方向的差分为:

Ey(x,y)=Fy(x,y)+[F45°(x,y)-F135°(x,y)]/2

(17)

像素的梯度幅值表示如下:

M(x,y)=[Fx(x,y)2+Fy(x,y)2+

(18)

梯度方向为:

(19)

传统的边缘检测检测到的边缘信息比较模糊,可能会看到一个假的边缘。Canny算法采用3×3大小的邻域,沿梯度方向使用8方向的邻域对梯度幅值阵列M[x,y]中的所有像素插值,边缘点就是幅度的极大值点[10]。

3.2 C++AMP处理流程

现今比较流行的有CUDA、OpenCL以及C++AMP[11]。在众多并行算法中,C++AMP有很好的移植性,可以将写好的并行算法移植到不同的硬件平台下,而且代码不会过时,因此可以被更多的程序开发人员使用。

文中采用的Canny边缘检测算法具有非常好的并行性,具有边缘梯度方向和边缘强度的信息,能检测出更多的边缘信息,并与周边的边缘信息明显地隔离开,可以很好地使用C++AMP进行并行化[12]。

为了实现图像的并行运算,在C++AMP平台下进行操作。实验过程用的是并行流水线,通过异步代理库和PPL来实现[13]。它可以同时处理4幅图像,以并发序列的方式将各个流水线阶段作为独立的并发代理运行。

处理流程如图1所示。

图1 流水线处理流程

3.3 并行化Canny算子优化

传统的Canny算子由于其单纯采用高斯滤波器进行滤波,导致去噪和边缘细节的不稳定,容易造成高频边缘丢失[14]。以前在CPU上运行时,速度受限,采用四方检测使图像漏掉较多细节,导致边缘不清晰,而且CPU上串行执行的算法速度较慢[15]。

针对上述传统算子的缺陷,利用基于C++AMP的改进Canny算子。在GPU上综合使用高斯滤波和图像直方图,避免高频边缘丢失,采用3×3邻域代替2×2邻域可以很好地抑制噪声,准确定位边缘信息。使用C++AMP编程模型,将Canny算子中可并行化处理的部分放在GPU上进行并行化处理,能够合理分配GPU的存储空间,减少重复计算点元[16]。为了最大程度地发挥C++AMP利用GPU处理的能力,利用GPU来控制性能相异的多GPU协作,还可以利用CPU对数据进行预处理核后处理。

3.4 C++AMP的并行化具体实现

3.4.1 C++AMP环境搭建

(1)文中主要在Microsoft Windows7系统环境下进行并行运算。

(2)安装Microsoft Visual Studio 2013,它自带所需的DirectX SDK。

(3)为了看到GPU计算带来的性能提升,DirectX 11驱动程序的显卡也是必不可少的。

实验环境配置如下:

CPU:Intel(R) Core(TM) i3-2 310 M CPU@ 2.10 GHz;

GPU:NVIDIA GeForce GT 520 M 1 GB;

操作系统:64位操作系统,基于x64的处理器;

内存(RAM):6.0 GB。

3.4.2 实现过程

利用C++AMP在GPU上使用Canny算子优化处理图像,算法在CPU和GPU之间有数据传递的I/O操作,主要对图像的边缘部分进行处理,仅在CPU上执行分割图像和判断大小的这些必要的串行时长操作,大部分可并行化的循环、迭代操作在GPU的工作组中执行[17]。GPU端处理图像比CPU端多了在加速器上复制图像数据和转换图像数据这两个步骤。

(1)在Microsoft Visual Studio 2013运行C++AMP程序,从输入源文件夹中选择图片,点击处理图像。应用程序以ARGB32格式加载图像文件和视频帧格式;

(2)点击运行按钮,程序会创建对应的文件读取的实例和一个新的图像代理来处理图像或视频帧序列,然后调用start()方法进行处理;

(3)先创建存储输入、输出图像和原始图像的存储区域,然后将数据复制到GPU中;

(4)配置流水线,把图像送入流水线中,使用消息块连接缩放器、图像处理器和显示代理,也会同时连接取消消息源以便随时取消执行;

(5)启动流水线代理,在迭代过程中反复简化颜色,然后执行Canny边缘检测算法;

(6)将GPU上的数据移回destFrame位图中的像素数据;

(7)流水线等待所有代理完成工作,发出结束信号,通知关闭流水线;

(8)输出C++AMP处理过后的图片,以及各阶段处理的时间。

4 实验结果与分析

为了对比并行运算与串行运算的运算时间及图片效果,选取6幅不同分辨率的图像进行实验。图2~4分别为分辨率535×610的原始图像,Canny算子串行图像,改进后的并行算法图像[18]。根据结果可知,使用串行算法获得图像的对比度较低,边缘位置较少,且伪边缘较多。改进后并行化的图像边缘细且图像对比度增加,边缘信息更多,图像细节更清晰,人物特征更明显,更有利于人物视频图像的判别。

图2 原始图片

图3 Canny算子生成的串行图片

图4 改进并行算法生成的图像

如表1所示,分别对6幅分辨率不同的图片进行串行化和在C++AMP中CPU+GPU模式下的并行化处理。串行和并行算法都计算了图像加载、处理和显示总的时间,然后计算了加速比。从数据可以看出,随着图像分辨率的增加,串行所用时间相比于并行所用时间的加速比越来越大,加速效果明显,图像的分辨率越大,GPU并行化算法的效果越明显。在视频监控中,现在的监控设备越来越先进,视频的分辨率也越来越清晰,使用并行算法可以更加快速地处理视频图像,而且处理效果更好,边缘信息更清晰,图像显示更好,为用户带来了便利,省去了大量时间。

表1 图片串行化和改进后的并行化处理时间

5 结束语

针对视频图像领域中存在的问题,提出了改进的Canny算子,并且基于C++AMP实现了改进的Canny算法的并行处理,不仅提高了图像处理效果,使得边缘信息更多、更明显,而且加快了处理速度。

C++AMP在并行处理上高速且高效,由于C++AMP的可扩展性使得C++AMP作为一种新的异构并行技术得以快速发展[19]。C++AMP是一种新的具有集成优势的并行化技术,而基于C++AMP的图像并行化技术对于图像处理的速度以及效率都有很大的优势。C++AMP在图像处理中应用广泛,也可以在其他需要并行的地方使用。随着C++AMP技术的不断成熟与改进,C++AMP在并行计算领域会占据更重要的地位[20]。

参考文献:

[1] 胡 琼,秦 磊,黄庆明.基于视觉的人体动作识别综述[J].计算机学报,2013,36(12):2512-2524.

[2] 董荣胜.《九校联盟(C9)计算机基础教学发展战略联合声明》呼唤教育的转型[J].中国大学教学,2010(10):14-15.

[3] 陈冠诚.C++AMP异构并行编程解析[J].程序员,2012(4):104-106.

[4] 肖 汉.基于CPU+GPU的影像匹配高效能异构并行计算研究[D].武汉:武汉大学,2011.

[5] 丁 鹏,陈利学,龚 捷,等.GPU通用计算研究[J].计算机与现代化,2010(1):12-15.

[6] 陈宏希.基于边缘保持平滑滤波的Canny算子边缘检测[J].兰州交通大学学报,2006,25(1):86-90.

[7] 唐志文.浅析数字图像处理技术的研究现状及其发展方向[J].硅谷,2010(5):30.

[8] 吴学明,李灿平.边缘检测算法在不同分辨率图像中的性能研究[J].计算机测量与控制,2006,14(2):166-169.

[9] 王 兰,吴 谨.一种改进的Canny边缘检测算法[J].微计算机信息,2010,26(2):198-199.

[10] LIANG L R,LOONEY C G.Competitive fuzzy edge detection[J].Applied Soft Computing,2003,3(2):123-137.

[11] PELLEGRINO F A,VANZELLA W,TORRE V.Edge detection revisited[J].IEEE Transactions on Systems,Man and Cybernetics,2004,34(3):1500-1518.

[12] 王 蓉,高立群,柴玉华,等.综合Canny法与小波变换的边缘检测方法[J].东北大学学报:自然科学版,2005,26(12):1131-1133.

[13] 朱仲涛,张 钹,张再兴.图像关于边缘提取算子的微分不变性[J].计算机学报,1999,22(9):903-910.

[14] 姚 平.CUDA平台上的CPU/GPU异步计算模式[D].合肥:中国科学技术大学,2010.

[15] SANDERS J.GPU高性能编程CUDA实战[M].聂雪军,译.北京:机械工业出版社,2011.

[16] COOK S.A developer’s guide to parallel computing with GPUs[M].[s.l.]:Morgan Kaufmann,2012.

[17] 宗露艳,吴 陈.一种改进的Canny算子边缘检测算法[J].现代电子技术,2011,34(4):104-106.

[18] 张焕龙,胡士强,杨国胜.基于外观模型学习的视频目标跟踪方法综述[J].计算机研究与发展,2015,52(1):177-190.

[19] GOMEZ-LUNA J,GONZALEZ-LINARES J M,BENAVIDES J I,et al.An optimized approach to histogram computation on GPU[J].Machine Vision and Applications,2013,24(5):899-908.

[20] DESTREMPES F,MIGNOTTE M.A statistical model for contours in image[J].IEEE Transactions on Pattern Analysis and Machine Intelligence,2004,26(5):626-638.

猜你喜欢
邻域算子图像处理
基于混合变邻域的自动化滴灌轮灌分组算法
海战场侦察图像处理技术图谱及应用展望
人工智能辅助冠状动脉CTA图像处理和诊断的研究进展
有界线性算子及其函数的(R)性质
含例邻域逻辑的萨奎斯特对应理论
基于邻域漂移的点云法向估计算法研究
Domestication or Foreignization:A Cultural Choice
基于ARM嵌入式的关于图像处理的交通信号灯识别
基于图像处理的废有色金属自动分选算法研究
QK空间上的叠加算子