在线刊号(2278-8875)印刷版(2320-3765)
Shivang Ghetia1, Nagendra Gajjar2还有Ruchi Gajjar3. |
有关文章载于Pubmed,谷歌学者 |
更多相关文章请访问国际电气、电子和仪器工程高级研究杂志
离散余弦变换(DCT)是一种实现频率分离的技术。当对图像进行DCT处理时,由于DCT是由DC值和低频值到高频值的范围组成,因此会对图像进行频率偏析。DCT在图像压缩中非常有用。当从图像中剔除高频值时,可以在保证图像质量不受影响的前提下进行有效压缩。但是,瓶颈是在CPU上进行二维DCT时,由于计算阶数很高,需要很长时间。为了克服这个问题,图形处理器(GPU)为并行处理打开了大门。本文利用CUDA(计算统一设备架构)在NVIDIA图形处理器上实现了并行的二维DCT。通过应用本文提出的二维DCT算法进行图像处理,缩小了时间要求,并实现了97倍的速度,包括从CPU到GPU的数据传输时间,然后再返回CPU。因此,二维DCT算法在GPU上的并行处理达到了快速高效处理图像的目的。
关键字 |
DCT, GPU,压缩,CUDA |
介绍 |
对强大计算能力的需求正在迅速增长。说到计算机处理能力的提升,首先要考虑的是processorâ '  ' s的运算频率。但不能指望它会随着时间的推移而持续增长。事实上,由于各种因素,如过热等,时钟频率不能超过一定的限制,使并行计算成为性能增强的唯一选择。由于架构和编译器复杂性的增加,多核处理器一直是工程师的挑战。但在视觉计算和图形处理领域的公司,如NVIDIA、AMD已经迎接了这些挑战,并在并行和高性能计算领域打开了新的大门。 |
CUDA由NVIDIA授权,集成由附加功能组成的高端C语言,为开发人员和设备之间提供了一个接口,用于GPU和CPU[8]之间的数据传输和工作分配。它具有识别、编程、跟踪单个核心计算并根据用户需求并行执行多个任务的能力。 |
这种并行处理的灵活性吸引了图像处理领域的研究人员。在图像处理技术中,图像处理时间过长,导致系统非实时性。研究人员总是试图缩小这个问题的范围。GPU已经推出了新的翅膀来解决这个问题。像NVIDIA这样的公司已经开发了非常强大的硬件和软件,为并行处理提供了有效的速度。该发明在并行处理领域产生了革命性的影响。利用其强大的技术,优化的图像处理算法可以实现[10]。与图像处理一样,图像压缩在当今也非常重要。不同的压缩算法可以在GPU上实现,以实现对压缩的快速处理。离散余弦变换(DCT)是图像压缩中最有效的算法之一。 When DCT is applied on an image, it will segregate its frequency components. As image is in 2-dimentional format, to get complete segregation of an image 2-D DCT must be applied. This paper shows the method for applying 2-D DCT on an image on a GPU. This will reduce the processing time and will give much accurate results. |
并行的图像处理和压缩方法 |
随着科技的进步,图像处理已成为当今世界自动化和监控领域中最强大的领域之一。在使用图像处理之前,必须确保图像应在可用的时间范围内处理。这样才能使系统接近实时。快速处理图像的本质在当今是非常关键的。另一个瓶颈是,在大多数情况下,图像的大小是过高的,它有冗余数据。因此,必须隐含压缩算法来将这些冗余数据归零,但在CPU上处理和实现DCT压缩算法耗时太长,导致系统非实时性。在这种情况下,GPU提供了满足这种快速计算的解决方案。NVIDIA开发了CUDA来克服并行处理[1]的需要。 |
让大小为m × n的图像在GPU上按照二维DCT算法进行处理和压缩。在实现并行处理方法之前,必须了解如何组织GPU上的块大小和每个块的线程数。本文提出的图像压缩算法以行数(m)为块数,列数(n)为单个块[3]内的线程总数。例如,考虑大小为4 x 6的图像,如图1所示。BlockIdx(块索引)将在0到5之间变化,threadaddx(线程索引)将在0到3之间变化。 |
一旦确定了块的大小,就需要将原始图像数据转换为一维格式进行处理。原始数据(图像数据)使用行主格式转换为1-D数据。一旦1-D数据在手,提出的2-D DCT算法可以应用。二维DCT和压缩算法实现的不同部分如下: |
A.将N个点数据转换为2N个点数据 |
由于现在的数据是1-D格式,所以需要将这N个点数据转换为2N个点数据,其中N个点数据是每个块的数据。通过N点数据的镜像反射,将N点数据转换为2N点数据。每个块的镜像数据都应该追加到相应的块中。这个过程如图2所示。在该图中,第一部分是原始数据,后一部分是附加到其对应N点数据的镜像数据。 |
B.在2N点数据上应用2N点CUFFT |
一旦有2N个点数据在手,应用快速傅里叶变换(FFT)。在CUDA中,FFT可以直接使用。NVIDIA开发了“cufft.hâÂ′Â′”头文件,用于优化数据上的FFT。这个CUFFT库非常丰富,它提供了向前FFT和反向FFT[12]的选项。这里使用的数据是1-D的形式。因此,对于一维数据,CUFFT库提供了CUFFTPLAN1D。它还提供了CUFFTPLAN2D和CUFFTPLAN3D分别为二维和三维数据[12]。CUFFT库的另一个特点是它提供了不同类型的转换选项,如C2R(复杂数据到真实数据),R2C(真实数据到复杂数据)和C2C(复杂数据到复杂数据)[12]。在应用CUFFT (CUDA FFT)时,需要传递一些参数。这些参数是: |
1) FFT的点数,即2N |
2)批量大小,这将与图像的列数相同 |
3) FFT类型,这将是CUFFT_FORWARD,因为正变换需要[6]。 |
C.将2N个点数据转换为N个点数据 |
CUFFT数据可用后,需要将2N个点数据转换回N个点数据。CUFFT应用数据为2N点。在每个2N点数据中,前N点数据是显著的,其他N点数据是前N点数据的负镜像。因此,从每2N个点数据中,前N个点数据被保存,其余N个点数据被忽略。现在通过收集每个2N点数据的前N点形成原始数据。如图3所示。 |
D. N点数据转换,将行主格式转换为列主格式 |
上面提到的N点数据现在需要转换。最初,图像的数据是2-D形式,这2-D数据转换为1-D使用行主格式。在这一行主要格式化的数据CUFFT和上述步骤应用。下一步是将处理后的1-D n点数据转换为列主格式,以便进一步处理。为了将这个N点数据转换为转置的N点数据,内核必须进行大量的计算,启动线程并将这些线程标为[11]。在这里,线程索引从0到总行数不等。对于每个线程,将有若干列的时间迭代。对于每次迭代,线程索引的偏移量被添加到迭代索引与行数的乘法中。 |
E.将转置的N点数据转换为2N点数据并应用CUFFT |
转置的N点列主要格式化数据现在转换为2N点数据。这里,将N个点数据转换为2N个点数据的过程与前面相同。但唯一的区别是,现在每个块中的线程数等于行数,批处理的总数等于列数。块大小和块总数之间的这种交换是由于列的主要格式数据。一旦2N点数据准备使用,该数据用于应用CUFFT[6]。这里也必须注意将参数传递给CUFFTPLAN1D[12]。由于数据现在是列主格式,批处理大小将等于之前的块大小[6]。应用FFT的点数也是2N点。一旦CUFFT_FORWARD应用于这个2N点列主格式的数据,数据将与twiddle因子相乘。在旋转因子乘法中,点的总数为2N。 For each 2N point data, first N point data is multiplied with its corresponding twiddle factor of 2N point. |
当每个2N点数据的每个前N点数据乘以旋转因子后,需要将这2N点数据转换回N点,目的是使数据量化和压缩。为了将每个2N个点数据转换为N个点数据,首先收集N个点并将其放在一起。现在可以对收集到的数据进行量化和压缩了。如果我们将这N个点的一维数据转换为二维数据,再用它生成一个图像,就会导致图像的频率分离,类似于图像的DCT。左上角包含图像的DC值,从上到下或从左到右,频率增加[13]。显示频率分离的示例图像如图4所示。 |
F. N点数据的量化 |
需要N个点数据以特定的方式进行扫描。锯齿扫描是为了使数据呈现从左到右频率逐渐上升的形式[15]。锯齿扫描模式(从0开始,以63结束)如图5所示。 |
为此,内核必须谨慎编写。应该启动的线程总数取决于两个条件。这些条件在部分循环索引小于图像宽度和部分循环索引大于图像宽度方面有所不同。循环索引将是锯齿扫描中对角线扫描行的总数。在图5中,循环索引将从0变化到12,因为有13条对角线扫描线。用标志来了解扫描线的当前状态。对于小于图像宽度的循环索引, |
国旗= loop_index + 1; |
但对于循环索引大于宽度图像线程索引将有所不同。具体如下: |
Flag =width - (loop_index+1)%(width); |
现在需要检查数据是在图像的上半三角形还是在下半三角形。一旦确定了这一点,还需要检查循环索引是奇数还是偶数。因此,根据上半部分或下半部分以及偶数或奇数索引,总共有四种情况需要检查。 |
让,width =图像的宽度 |
高度=图像的高度 |
Id =线程索引 |
loop-indexing =我= + hight-1宽度 |
一旦扫描结束,我们就得到了一维格式的频率分离数据。现在这些数据可以用来实现量化算法。为了压缩,忽略扫描到的一维数据的下半部分,使用标准量化表对前者进行量化。这将消除高频成分,并将冗余归零。运行长度编码可用于压缩这样的冗余数据[16]。其他压缩技术也可以应用。 |
G.图像再生 |
现在需要压缩数据来生成原始数据。为此,逆量化应用[16]。一旦应用逆量化,所有前面的内核都以相反的顺序实现。它将遵循以下步骤: |
- N点数据转换为2N点 |
-应用2N点CUFFT_INVERSE |
-转换成N点数据后应用转置 |
-应用2N点转换,再次CUFFT_INVERSE |
-应用旋转因子乘法 |
上述核函数的实现都会生成图像的原始数据,但由于量化的原因,会产生一定程度的失真。但PSNR(峰值信噪比)仍在可接受的范围内。PSNR主要通过均方误差(MSE)[17]来定义。MSE可计算为: |
输出结果,加速算法 |
图像压缩算法可以实现NVIDIA GPU的CUDA启用。对于图像的处理,需要图像的二进制文件。我们使用Matlab将所需的图像转换成二进制文件。一旦生成二进制文件,这个二进制文件就会导入到Visual Studio中,因为Visual Studio可以使用CUDA Runtime Toolkit[9]。 |
这个二进制数据在GPU上处理,经过所有的计算,这个数据被写回一个二进制文件,使用这个生成的二进制文件,可以生成最终的图像[7]。不同大小的图像进行了测试,其结果图像也在这里展示。在将该算法与其他算法进行处理比较时,应保持处理时间和结果图像在眼睛上的PSNR。量化也是一个功能部分。根据不同的压缩要求,锯齿扫描后可以实现不同的压缩算法。这里描述的结果没有任何量化,以便了解可以生成多少精确的图像。这里的处理时间以毫秒(ms)为单位。 |
当我们将这些数据绘制在图6上时,它将说明使用GPU而不是CPU进行高计算的效率。从图中可以看出,随着图像大小的增加,在CPU上所花费的时间要高得多,而在GPU上处理相同的图像只需要几毫秒。 |
结论 |
在GPU上成功实现图像处理和压缩DCT算法后,还可以实现对卫星图像等大尺寸图像的处理。在这种情况下,由卫星拍摄的图像在卫星上进行处理并在地球上传输是至关重要的。为了更快地处理如此海量的图像,GPU将有助于并行处理。压缩算法的实现有助于降低处理后数据传输的带宽要求。这里的结果直接描述了与CPU相比更快的处理速度,但唯一的威胁是数据从CPU传输到GPU或反之亦然。将数据直接输入GPU的研究正在进行中。 |
由于这里使用了FFT和变换对图像进行处理,小波变换也可以在GPU上实现,对图像进行处理和压缩。在GPU上处理图像的其他方面是处理数据的准确性,因为它有特殊的功能单元。当数据处理非常精确,小数点后的数字也很重要时,GPU将在计算中发挥最佳作用。由于目前的技术将图像处理作为其手段之一,这些图像的处理和压缩可以部署在GPU中,并获得诱人的结果。 |
参考文献 |
|