一种基于线程级并行的铅笔画生成方法与流程

文档序号:18707410发布日期:2019-09-17 23:54阅读:282来源:国知局
一种基于线程级并行的铅笔画生成方法与流程

本发明属于计算机绘图领域,具体涉及一种基于线程级并行的铅笔画生成方法。



背景技术:

铅笔画是一种非常普及的艺术形式,被广泛应用于美术、海报和建筑草图绘制等领域。由于其学习成本低,艺术表现能力强,受到很多人的青睐。但是,绘制一幅铅笔画需要耗费大量的时间。随着计算机技术的不断发展,人们开始使用计算机软件进行铅笔画创作。在计算机软件中,人们可以通过计算机软件快速的生成铅笔画图像,在艺术、游戏、影视和动漫领域发挥着巨大的作用。

自动铅笔画生成技术主要可以分为两类:基于三维模型的铅笔画自动生成技术和基于二维图像的铅笔画自动生成技术。基于三维模型的铅笔画生成技术主要是对输入的三维模型的纹理和轮廓进行渲染,主要运用计算机图形学相关技术,但此类技术在实际应用中必须建立完整的三维模型才能生成铅笔画,具有较大的局限性,因此,目前未能得到普遍应用。另一种是基于二维图像的铅笔画生成技术,该技术主要是根据已知的二维图像,使用数字图像处理相关技术来获取图片轮廓和纹理信息,从而合成具有铅笔画效果的图片,具有较为广泛的运用。基于图像的铅笔画生成技术有两种技术路线,基于线性卷积积分(lic)算法和基于数字图像处理(dip)算法。然而,lic算法生成的铅笔画距离真实铅笔画效果相差较远,往往不作为铅笔画生成算法。现有的基于dip的软件有akvissketch和pencilsketch,但是它们的运算时间太长,无法满足实时渲染的要求。这些基于dip的技术的方案都是通过串行算法完成处理,正是由于这些方案采用了串行算法进行实现,因而会导致在处理大尺度图像时,处理速度慢,耗时太长,无法满足实时快速生成的需求。



技术实现要素:

本发明的目的在于克服现有铅笔画生成算法运行速度慢,耗时过长的缺点,提供一种基于线程级并行的铅笔画生成方法,以加速铅笔画的生成过程。该方法采用cuda编程模型并行设计铅笔画生成算法,并通过线程级并行技术并行执行实时渲染过程,缩短了铅笔画生成算法的运行时间,提高了铅笔画生成算法的加速比性能。

为达到上述目的,本发明采用以下技术方案予以实现:

一种基于线程级并行的铅笔画生成方法,包括以下步骤:

步骤1,轮廓提取,包括以下步骤:

步骤1.1中值滤波;

针对m×n个像素的图像,启动m×n个并行线程,每一个并行线程读取一个像素值;m×n个像素同时进行中值滤波,得到m×n个像素的中值滤波后的结果图;

步骤1.2梯度运算;

针对m×n个像素的中值滤波后的结果图,启动m×n个并行线程,每一个并行线程运算一个像素的梯度,得到m×n个像素的梯度结果图;

步骤1.3卷积运算;

针对m×n个像素的梯度结果图,启动m×n个并行线程,每一个并行线程进行一个像素的卷积运算;卷积运算过程设置8个卷积模板,每一个卷积模板进行一次卷积运算,得到8个m×n像素的响应图;

步骤1.4分类运算;

对于8个m×n像素的响应图,启动m×n个并行线程,一个并行线程计算同一个坐标点在8个响应图中像素值的最大值,得到8个分类结果图;

步骤1.5绘制线条;

对于8个分类结果图,分别进行卷积运算,得到8个子轮廓图;将8个轮廓子图叠加后,提取出轮廓图;

所述线程并行运算基于cuda编程模型;

步骤2,纹理渲染,包括以下步骤:

步骤2.1针对目标铅笔画,结合线程并行运算计算出0-255个灰度中每一个灰度在目标铅笔画出现的次数,得到目标直方图;

步骤2.2针对原图像,结合线程并行运算计算出0-255个灰度中每一个灰度在原图像中出现的次数,得到原图像的灰度直方图;

步骤2.3结合0-255个灰度分别在目标直方图和灰度直方图中出现的次数,通过m×n个并行线程将原图像转换为铅笔画色调图;

步骤2.4针对铅笔画色调图,通过m×n个并行线程,同时将m×n个像素进行纹理渲染,得到纹理渲染图;

所述线程并行运算基于cuda编程模型;

步骤3,合并结果;

将步骤1提取出的轮廓图和步骤2得到的纹理渲染图进行加权平均,得到最终的铅笔画。

本发明的进一步改进在于:

优选的,步骤1.1中,所述中值滤波的过程为,针对一幅m×n像素的图像,启动m×n个并行线程,每一个并行线程读取一个像素值,m×n个并行线程同时读取m×n个像素值,将读取出的像素值放置于cuda的共享内存中;每一个并行线程能够从共享内存中读取一个像素的8临域值,通过排序算法,得到该像素及其8领域共,9个像素的中位数,将该像素对应的中位数回写至内存中,得到该像素的中值滤波结果,将所有像素的中值滤波结果回写至内存中,得到中值滤波后的结果图;

所述排序算法为,对任意一个像素,将该像素值和该像素的8临域值进行排序,排序过程中只排序一半的值则确定中位数。

优选的,所述步骤1.2中,每一个像素的梯度运算包括沿x方向的梯度运算和沿y方向的梯度运算,将x方向梯度运算结果的绝对值和y方向梯度运算结果的绝对值相加后,求得中值滤波后每一个像素点的梯度结果,将所有像素的梯度结果并行回写至内存,得到梯度结果图。

优选的,所述步骤1.3中,每一个像素卷积运算过程为,卷积模板从共享内存中读取该像素周围的8个像素值,8个像素值及该像素值分别和卷积模板中对应位置的数据相乘,将所有相乘后的数据相加,得到该像素值的卷积运算结果,为响应结果,所有像素的响应结果组成响应图,针对一个卷积模板得到一个响应图;

针对8个卷积模板得到8个m×n像素的响应图,8个卷积模板朝图像中的所有像素,8个模板检测8个不同方向,每一个像素有8个响应结果。

优选的,所述8个卷积模板中的7个模板由第i=1个模板旋转(i-1)×22.5度得到,i为模板的序号;第i=1个模板中水平中线的像素值均为1,其余像素值均为0;每一个卷积模板的长为原始图像长的三十分之一,宽为原始图像宽的三十分之一。

优选的,所述步骤1.4中,分类运算的具体过程为,对于8个m×n像素的响应图,启动m×n个并行线程,一个并行线程计算同一个坐标点在8个响应图中的最大值,m×n个并行线程同时计算m×n个元素,在同一个卷积模板上出现最大值的像素被分为同一类,共得到8个分类结果图。

优选的,所述步骤1.5中,所述绘制线条的具体过程为,8个分类结果图分别使用其对应的卷积模板再次进行卷积运算,得到该分类结果对应的轮廓子图,共得到8个轮廓子图。

优选的,步骤2.1的具体过程为,针对目标铅笔画图,设置256个并行线程,每一个并行线程读取目标铅笔画图中每一个像素的灰度;计算0-255个灰度中,目标铅笔画图中每一个灰度出现的次数,得到目标灰度直方图;

步骤2.2的具体计算过程为,将一幅m×n像素的原图像转化为灰度图像;设置m×n个并行线程,每一个并行线程读取灰度图像中每一个像素的灰度值,计算0-255个灰度中,灰度图像中每一个灰度出现的次数,得到原图像的灰度直方图;

步骤2.3的具体计算过程为,首先将目标灰度直方图和原图像的灰度直方图各自从小到大进行累加,得到两个中间结果,分别为目标累计直方图和原图像累计直方图;设置256个线程,每个线程进行目标累计直方图和原图像累计直方图中灰度值的匹配,匹配目标累计直方图和原图累计直方图中灰度值出现的数量最相近的灰度值,用目标累计直方图中灰度值替换掉原图像的灰度值,替换过程中通过m×n个并行线程替换。

优选的,步骤2.4中,针对m×n像素的铅笔画色调图,设置m×n个并行线程,每一个并行线程读取一个像素值,同时对m×n个像素分别进行线性变换计算,得到m×n个像素线性变换结果,将所有的变换结果组合后,得到纹理渲染图。

优选的,线性变换计算的公式为:

β=1-j*(6);

其中β是纹理渲染图,j*是铅笔画色调图。

与现有技术相比,本发明具有以下四点有益效果:

本发明公开了一种基于线程级并行的铅笔画生成方法,该方法将并行线程运算融合在轮廓提取和纹理渲染的过程中,使得每一步中,所有的像素点能够同时进行运算,在保证了铅笔画视觉效果的同时,通过高度的并行执行线程达到快速实时生成,相对串行铅笔画算法加速比性能得到显著的提升,加速比可高达448.59倍,彻底解决了铅笔画生成速度慢的问题。实际测试中,在1024×768到2560×1920分辨率的50张图像上进行测试,加速达到137.04到448.59倍不等,实现了极大的速度提升。无论图片的尺寸大小是多少,生成的时间保证在0.5毫秒以下。除此之外,本发明还有以下有益效果:

1.本发明对现有的铅笔画生成算法进行了并行设计和优化,首次将并行后铅笔画生成算法移植到cuda平台,实现了铅笔画加速比性能的显著提升和计算速度更快的并行铅笔画算法。

2.本发明通过理论分析,运用cuda编程模型并行设计了铅笔画生成算法,最大程度的挖掘了算法的内在并行性。并充分利用cuda的潜在计算力,通过多线程技术指派并行线程实现了高并发的并行铅笔画生成算法。

3.本发明设计了一个优化策略,将整个铅笔画拆分成若干个相互独立的子任务,利用cuda流技术,指派这些子任务为单独的步骤,重叠执行,实现了任务级的并行,进一步提高了程序执行速度。

进一步的,将并行线程融入到中值滤波过程中,能够减少中值滤波的计算时间,同时只对一半的元素进行排序确定中位数,将计算时间减少一半。

进一步的,将并行线程融入到梯度运算过程中,能够减少梯度运算的计算时间。

进一步的,设置8个卷积模板,使铅笔画纹理更自然,线条丰富。

进一步的,通过8的分类结果,得到8个子轮廓图,将真实图片的边缘转换为铅笔画的边缘。

【附图说明】

图1为本发明的轮廓提取流程图;

图2为本发明的边缘检测模板图;

图3为本发明的纹理渲染流程图;

图4为不同的软件绘制出的铅笔画图,其中,(a)图为原图;(b)图为lic算法;(c)为akvissketch软件;(d)为pencilsketch软件;(e)本发明中的方法;

图5为本发明实施例的铅笔画绘制流程图。

【具体实施方式】

下面结合附图和具体实例对本发明做进一步详细描述,本发明公开了一种基于线程级并行的铅笔画生成方法,该方法提出了一种并行非真实渲染算法,可以将数字图像转换为铅笔画图;该方法基于高性能运算平台,借助cuda编程模型在图像处理中的巨大优势,通过单指令多数据(simd)并行计算机体系结构来指派多线程并行地执行任务。通过将像素级地运算绑定到多个线程以完成线程级地并行操作,随着图像尺寸的增加,算法的运算时间不会呈现出几何式地增长。

本发明在cuda平台上并行设计和实现铅笔画生成算法。整个算法由多个子算法组成,包括卷积运算,中值滤波,梯度计算,直方图生成和直方图匹配。首先,每个子算法使用cuda编程模型并行设计和实现,并通过线程级并行技术同时执行。然后,待处理数据被数据划分技术最细粒度分割,以便使用更多线程进行单指令多数据流的并行计算。其次,频繁使用的数据被放置在高速缓存,共享存储器和常量存储器中,以最小化存储器的访问时间。运用cuda流技术同时执行多个独立任务,通过重叠每个子任务的独立部分(如数据传输和计算)来实现任务级的并行执行。由于对子任务进行重叠,相同时间内执行任务的效率变高,执行的总时间缩短,加速比得到显著地提升。

基于线程级并行的铅笔画生成方法主要包括两个步骤:轮廓提取和纹理渲染,完成这两个步骤后,合并结果,得到最终的结果铅笔图。参见图1,该方法具体包括以下步骤:

步骤1,轮廓提取。轮廓提取是指将二维图像中的轮廓和线条提取出来,再模拟铅笔绘制线条的过程。利用卷积操作提取轮廓和对象边缘,并且利用线条绘制模板描绘铅笔画的线条轮廓;在纹理轮廓提取过程中最频繁使用的操作为卷积运算,该操作在铅笔轮廓提取算法中具有十分重要的作用。但是二维卷积运算是一个十分耗时的过程,通常涉及大量的算术运算,尤其是对于高清的视频和图像,其计算量是非常巨大的,所以将程序并行化可以非常有效的加速卷积过程。整个轮廓提取可以分为中值滤波、梯度计算、卷积、分类、绘制线条和叠加6个子步骤。

步骤1.1结合cuad并行编程,使用中值滤波对原始图像进行去噪,得到降噪结果图;

中值滤波是一种降噪手段,它使用领域的中值代替原有像素的值,是一种非线性图像平滑过程。中值滤波的并行实现方法和卷积操作大致相同,其中每个像素点的运算需要8临域像素的值,因此,中值滤波器需要填充边界。确定中值一般是通过排序算法,由于排序的元素数量很少,本发明中简化了排序方法,即只需要对一半元素进行排序就可以确定中位数,这种技术理论上将计算时间减少了近一半;结合cuda并行编程进行中值滤波的具体思路为:利用cuda并行编程模型并行处理中值滤波,对于一幅m×n像素的图像,启动m×n个并行线程,让每个并行线程负责一个像素点的运算;下述所有步骤中的m和n均为大于等于2的自然数,具体的运算过程为:

步骤1.1.1数据准备过程

对于一幅m×n像素的图像,启动m×n个并行线程,每一个并行线程读取一个像素值,放入cuda的共享内存中,若某一并行线程处于线程块的边缘,则通过一个线程,重新读取该边缘外的像素值,填充至该边缘的元素像素值。

步骤1.1.2中值滤波计算过程

m×n个并行线程种的一个并行线程从共享内存读取该像素8临域值,执行本发明简化排序算法,即只对一半元素进行排序,以确定中位数进行;具体来说,除了像素的8临域值,连同该像素,共9个像素值,从大到小,或从小到大排列5个像素值,取第5个(中间的像素值),作为该像素值最后的中位数;得到结果后再次通过m×n各并行线程,将所有像素的计算记过(中位数)并行写回至内存中,得到降噪后的结果图。

步骤1.2针对降噪后的结果图,通过cuda并行编程模型,对降噪结果图求取梯度,得到梯度结果图;

梯度是图像上每个像素与其临域像素的差值,该算法使用矩阵运算来实现图像的梯度计算;基于矩阵减法的梯度计算必须在图像的x方向和y方向上执行相邻像素的减法,并且对减法结果的绝对值求和。在进行矩阵减法运算时,并不是对所有的元素进行减法运算,而是有选择的进行操作,如在沿x轴或y轴方向的减法操作中,减法矩阵的第一列或第一行元素和减法矩阵的最后一行或最后一列元素不参与该操作,否则会发生数组越界,导致程序出错。并行计算梯度的基本思路为:利用cuda模型对于一幅m×n像素的图像,启动m×n个并行线程,每个并行线程负责计算一个像素点的梯度;梯度运算的具体过程为:

一幅m×n像素的图像,启动m×n个并行线程,每一个并行线程并行读取一个像素值以及该像素点右方和下方的像素值;首先计算该像素和右边的差值,即为x方向梯度;然后计算该像素和下边的差值,即为y方向梯度,再计算x和y方向梯度的绝对值的和,计算出该像素值的梯度;通过m×n个并行线程,同时计算出m×n个像素的梯度,最后通过m×n个并行线程将所有数据(所有像素的梯度)并行写回至内存,通过上述操作可得到梯度结果图。

步骤1.3针对梯度结果图,通过cuda并行编程模型,结合边缘检测模板并行进行卷积运算,得到响应图;

边缘检测模板和卷积运算的定义如下:边缘检测模板的大小由图像的尺寸确定,本发明中模板的长和宽均被设置为原图的三十分之一;模板的水平中线全被设置为1,其余均设置为0,得到i=1时的模板;其他模板是由i=1时的模板旋转(i-1)×22.5度得到,旋转360度,共得到8个模板;每一个模板只检测一个方向,每次检测的边缘角度不同,每次偏转22.5度,边缘检测模板的8个模板如图2所示。8个边缘检测模板即为下一步骤中的卷积模板,因此共有8个卷积模板,或者称为卷积核。

卷积运算操作步骤如下:首先将卷积模板放在梯度结果图的左上角,将度结果图点上的像素灰度值与对应卷积模板上的数值相乘,将所有相乘得到的值相加,作为卷积核中间像素对应图像上像素的灰度值,然后以一个像素为单位,依次向左向下终滑,完成所有像素的计算。

通过边缘检测模板并行进行卷积运算的并行计算的基本思路为:利用cuda并行编程模型,对于一幅m×n像素的图像,启动m×n个并行线程,每个并行线程负责并行计算某一像素点地卷积运算;具体过程为:

步骤1.3.1数据准备过程

对于一幅m×n像素的梯度结果图像,启动m×n个并行线程,每个线程并行读取一个像素值并且将之存入共享内存;若该并行线程处于线程块的边缘,该并行线程再读取一次边缘外部的像素值,放入共享内存中,填充边缘的元素像素值,保证m×n梯度结果图图像的完整;

步骤1.3.2一个卷积模板的卷积运算过程为,m×n个并行线程同时从共享内存中并行读取每一个像素周围八个像素的值,再和卷积模板依次并行相乘与求和,并行计算得到结果之后将m×n个数据并行写回,得到某一个卷积模板的得到的结果称为响应图。

步骤1.3.3因为卷积模板有8个,每一个卷积模板需要进行一次步骤1.3.2的运算,因此共得到8个响应图;因为有8个响应图,因此每一个像素值有8个响应结果。

步骤1.4针对步骤1.3得到的8个响应图,通过公式1对响应图进行分类,得到8个分类结果图。

针对8个响应图,通过公式1的计算,针对每一个像素得到8个响应结果,在同一个方向上出现最大值的点被分为同一类,因此共得到8个分类结果,称为结果图。结合cuda模型,可以将并行的将数据分类,具体思路为,对于8幅m×n像素的图像,启动m×n个并行线程,让每个并行线程并行,同时计算图像中一个坐标点在8个响应图中的最大值;该计算过程的具体过程为:

对于8幅m×n像素的图像,启动一次m×n个并行线程,每个线程并行读取一个坐标点在8个响应图中的8个像素值,后并行求取每一个像素的8个响应图中各自像素值的最大值,并且记录最大值所在响应图的序号,得到结果之后将该像素的最大值并行写入序号对应的分类结果图中,得到8个分类结果图;通过式(1)可知,该步骤中,每一个分类结果,除了保留了卷积运算后,该分类结果中具有像素最大值的像素外,其余像素点的像素值均为0;如对于卷积模板2,只保留在第二个响应图中具有像素最大值的像素点的像素值,在其余响应图中具有像素最大值的像素点,在第二响应图中像素值为0;该步骤使得针对m×n的图像中每一个像素点被保留了最大像素值。

其中p是图像中的像素点,m(p)是在p点的响应图中的值,ci(p)是在p点在分类结果图的值,其中i∈{1,2,3,4,5,6,7,8}。

步骤1.5针对步骤1.4得到的每个分类结果图,利用步骤1.3中每一个分类结果对应的卷积模板,针对该分类结果再次进行边缘检测模板卷积,得到8个轮廓子图;具体步骤为:针对第i个分类结果图,将第i个卷积模板放置在该图像的左上角,将图像点上的像素灰度值与对应卷积模板上的数值相乘,将所有相乘得到的值相加,作为卷积核中间像素对应图像上像素的灰度值,然后以一个像素为单位,依次向左向下终滑,完成该分类结果中所有像素的计算;

对于每一个分类结果图都需要使用其对应的卷积模板进行一次边缘检测模板卷积,因此步骤1.5重复8次后,得到每一个分类结果图对应的轮廓子图,共得到8个轮廓子图;通过该步骤,将真实图片的边缘转换为铅笔画的边缘。

步骤1.6将所有轮廓子图直接并行叠加,即直接将8个轮廓子图中相同位置的像素值相加,得到图像最终的提取出的轮廓图。

步骤2,纹理渲染

纹理渲染是首先通过灰度直方图变换将真实图像渲染成铅笔绘制的灰度分布,再通过铅笔纹理渲染添加真实的铅笔纹理。灰度直方图变换需要输入两个灰度直方图,一个是待变换的灰度直方图,即原图的灰度直方图。一个是变换目标的灰度直方图,即目标灰度直方图。所以需要先准备好这两个灰度直方图再执行直方图变换。参见图3,纹理渲染的具体步骤如下:

步骤2.1通过公式2计算目标灰度直方图;

度直方图计算就是统计每个灰度在图像中的出现次数,所述目标灰度直方图为当原始图像为铅笔画时,该铅笔画的灰度直方图;计算灰度直方图的方法如下公式(2)-(5)所示,其中式(1)代表目标灰度直方图的生成函数。其中v是彩色灰度值,归一化后的范围是0-1,z是归一化因子,使得pi(v),i∈{1,2,3}表示铅笔画中的三个色调层的概率密度函数,分别如公式(3)、(4)、(5)所示,ωii∈{1,2,3}表示不同色调层的权重,j是目标灰度直方图。

p1(v)是亮色调层,其由具有标准偏差σb的拉普拉斯分布表示。当v接近1时,该分布将收敛。

p2(v)是中间色调层,是在ua到ub范围内的均匀分布。

ua,ub分别为色调的下限和上限,由用户指定。

p3(v)是暗色调层,是一个方差为σd,均值为μd的正态分布。

在生成目标直方图计算的过程中,本方法利用原子操作确保线程并行地写入存储器时不会发生冲突。在cuda的实现过程中,首先需要申请一块全局内存用于存放整个图像的灰度直方图,使所有线程都可以访问和修改该内存中的数值,并行程序指派256个并行线程,每个线程负责计算一个0-255灰度中每一个灰度出现的次数,通过目标直方图表示,得到目标直方图结果,并行计算出相应0-255灰度分别在目标铅笔画中出现的次数后,将出现次数的结果写回全局内存,得到的就是目标直方图结果;执行过程中直接选择原子操作指令,使得得到目标直方图的过程利用原子操作。

步骤2.2计算原图的灰度直方图。

灰度直方图计算就是统计每个灰度在图像中的出现次数。需要首先将原图图片通过rbg三通道的加权平均转化为灰度图像,再扫描图像,统计每个灰度出现的次数。通过cuda并行模型计算的具体步骤为:首先在cuda全局内存空间中申请一个长度为256个整数的数组,每一个数组中用于保存对应灰度出现的次数i,即0-255中每一个灰度值统计结果,设置每一个数组中初始值i0=0;对于一幅m×n像素的图像,启动m×n个并行线程,每个并行线程读取一个像素值,m×n个并行线程读取到m×n个元素取到灰度值之后,就将数组中i的值加1;但是由于并行线程的并发读写会导致错误的读取和写入,于是需要利用原子操作。原子操作是cuda供的一种特殊操作,用于执行不可分割的计算事务,可以防止线程的读写冲突,保证结果的正确;通过调用cuda提供的原子操作函数,将并发线程排队执行,由并行执行改为串行执行,从而避免了线程之间的冲突。

步骤2.3通过两个灰度直方图进行灰度变换,得到铅笔画色调图。

通过修改原图的灰度直方图,使得原图的灰度直方图分布符合目标灰度直方图分布。此处使用的是单映射匹配方法。首先将目标灰度直方图和原图直方图各自从小到大进行累加,得到两个中间结果,即目标累计直方图和原图累计直方图。两个直方图中的每一个灰度都对应了一个灰度累计值,原图灰度累计值都被修改为目标累计直方图中最接近的值。通过cuda并行编程模型进行灰度直方图灰度的变换具体步骤为,指派256个线程,每个线程负责匹配一个一对灰度的匹配,寻找目标累计直方图和原图累计直方图中灰度出现的数量最相近的值,即两个直方图中i最相近的值,针对该i值对应不同的灰度值,使用目标累计直方图中的灰度值,替代原图累计直方图中灰度值,得到原图的直方图的值进行修改规则;修改规则的具体步骤为,对于一幅m×n像素的图像,启动m×n个并行线程,每个并行线程读取一个像素值,同时将m×n个原图中的像素值进行规则修改(灰度值的替代),通过这个规则并行的修改原图的图像,得到的就是笔画色调图。

步骤2.4通过公式6进行纹理渲染,得到纹理图;

纹理渲染的过程由下述公式6所示的线性变换实现,其中β是纹理图,j*是笔画色调图。由于像素点之间是独立的,通过cuda编程模型,对于一幅m×n像素的图像,启动m×n个并行线程,每个并行线程读取一个像素值,同时对m×n个像素分别进行线性变换计算,可以直接得到进行线性运算变换后的纹理渲染图。

β=1-j*(6)

3.结果合并

将步骤1提取出的轮廓图和步骤2得到的纹理渲染图进行加权平均,得到的就是最终的铅笔画。

参见图4为通过本发明中的方法和其他方法绘制出的铅笔画图,从图中可以看出通过本发明中的方法得到的铅笔画清晰度更高,更接近于实际绘画出的铅笔画。

本发明提出了一种基于图形处理单元(gpu)的线程级并行快速铅笔画生成算法,加快了铅笔画的实时绘制过程。首先通过理论分析,确定了铅笔图生成算法的并行性。然后,利用计算统一设备体系结构(cuda)编程模型并行设计了串行算法的子算法,并通过线程级并行技术实现。之后,使用共享内存和常量内存构造了一个最佳的数据缓存模式,以减少频繁使用数据的访问时间。最后,再通过cuda流技术实现任务级并行,使独立的子任务可以重叠执行,实现进一步加速。在cuda平台上,实验结果表明,该并行算法可以显著提高速度。该算法在2560×1920分辨率图像上的性能比串行算法提高了448.59倍,与真实的铅笔画保持了很高的相似性。因此,该算法适用于铅笔图的实时绘制,在非真实渲染中具有广阔的应用前景。本发明通过理论分析每个子算法的特点,为每个子算法分别设计一个最佳的内存访问模式,将算法中最频繁使用的数据放在高速缓存中,减少了并行线程读写数据的时间。

实施例

图像转化成铅笔画图,需要三步,轮廓提取、纹理渲染和结果合并。以图5为例首先输入一个彩色原始图像,分辨率为1920×1080,转换为灰度图像之后,拷贝到cuda平台上。(1)轮廓提取,首先利用中值滤波进行去噪,指派1920×1080个并行线程,每个线程并行计算一个像素点及其8邻域的中值。之后并行梯度计算,再次指派1920×1080个并行线程,计算得到梯度图像。再对梯度图像与8个边缘检测模板并行进行卷积,模板尺寸是原图像的1/30,即64×36(64=1920/30,36=1080/30)。紧接着,指派1920×1080个并行线程,每个线程通过并行卷积运算得到一个像素点的响应值,并并行写入内存,得到8个响应图。然后,通过分类函数,找出每个点在8个响应图中哪一个图中的响应值最大,记录最大的那个响应值,对于相同的模板具有最大值响应值的点将被归为一类。下一步,所有的像素点被归为8类,得到8个分类结果图。再次,使用边缘检测模板对这8个分类结果图,再进行并行卷积,得到8个轮廓子图。最后,将这8个轮廓子图相加,得到最终的轮廓图。(2)纹理渲染,首先根据给定的参数生成目标直方图,由于图像的灰度值范围是0到255,所以指派256个并行线程,每个并行线程负责并行计算一个灰度值对应的灰度级别。之后,根据原图的灰度图片,对原图的灰度直方图进行统计,在全局内存中申请一块长为256的整数数组并且全部设为0,再指派1920×1080个线程,每个并行线程并行计算一个像素的灰度值,并且通过原子操作递增直方图的值,例如:像素点的灰度为102,就使用原子操作将这个数组的第102个数字加一。接下来,通过直方图转换将原图的直方图转换为目标直方图,得到铅笔画色调图。最后输入纹理图,直接指派1920×1080个线程,计算出得到纹理渲染结果。(3)结果合并,将轮廓提取结果和纹理渲染结果进行加权平均,得到最后的铅笔画图像。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1