APP下载

直方图均衡化结合中值滤波的CUDA并行化实现∗

2020-07-13李园园

计算机与数字工程 2020年5期
关键词:均衡化椒盐像素点

李园园

(西安邮电大学计算机学院 西安 710121)

1 引言

数字图像在采集、生成及传输等过程中,极易受到一种最常见的椒盐噪声[1]的干扰,它是一种随机的白点或黑点,不仅会影响图像的视觉效果、降低图像质量,而且对图像的后续处理过程也将产生严重的影响[2~4]。

在数字图像处理中,直方图均衡化[5](Histo⁃gram Equalization,HE)算法在图像增强中具有很强的代表性,是图像分割、图像压缩和图像识别等后续图像处理的基础,在图像预处理技术中有着广泛的应用[6]。然而,直方图均衡化不能有效去除图像噪声。因此,对于椒盐噪声的影响,引入中值滤波算法对图像效果进行改进。中值滤波算法[7]是目前用于去除椒盐噪声的一种最常见的非线性滤波方法。

近年来,在实时、高分辨率3D图形的市场需求的驱动下,可编程图形处理器单元或GPU已经发展成为一个高度并行的多线程多核处理器,具有极大的并行计算能力和极高的内存带宽。基于CPU/GPU架构的异构并行计算技术已广泛地应用于通用计算领域,并取得了很大进展。

开源计算机视觉库OpenCV(Open Source Com⁃puter Vision Library)[8]是由一系列 C 函数和少量C++类构成,包含了300多个C函数的跨平台的中、高层API,实现了图像处理和计算机视觉方面的很多通用算法,具有开源、简单、免费及跨平台的重要特性。

因此,本文以CPU/GPU异构架构作为计算平台,针对直方图均衡化不能有效去除噪声的问题,论文引入中值滤波算法来消除直方图均衡化图像中的椒盐噪声,并基于CUDA和OpenCV实现了直方图均衡化结合中值滤波的并行化图像处理。

2 算法原理

2.1 直方图均衡化算法

直方图均衡化是利用直方图对对比度进行调整的方法,其基本思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内均匀分布的形式。

对原始图像进行直方图均衡化分为以下五个步骤(本文实验中图像均转换为256灰度级,灰度范围为 0~255,即L=256):

1)计算原始图像g的每个灰度级的像素点个数ni,i=0,1,...,L-1;

2)标准化直方图,即每个灰度级的概率密度函数:

其中,ni为每个灰度级像素数目,n为图像总像素数目。

3)计算累计直方图:

4)实现直方图均衡化:

5)映射关系:

2.2 中值滤波算法

Turky于1971年提出了中值滤波算法[9],其基本思想是用指定领域内像素的灰度中值替换需要处理的图像中的像素点值。中值滤波算法,不仅可以消除破坏性的噪声,而且可以保护图像边缘[10~11],在图像增强和恢复等领域中得到了广泛的应用[12],比线性平滑滤波器的模糊程度明显要低,其数学公式为

其中,d(i,j)为滤波结果,f(i,j)为输入图像灰度值,M为滤波模板。图1显示了要处理的原始图像中待处理的中心像素点值及其领域像素点值,图2为本文采用的3×3滤波模板,图3显示了滤波模板像素点的线性阵列排列顺序。本文中值滤波算法的具体步骤为

1)将图1待处理中心像素点及其领域像素点赋值给图2滤波模板的对应位置,并将滤波模板以图3线性阵列的位置顺序由小到大进行排序;

2)排列出图3线性阵列前5个位置的像素点灰度值顺序,因为中值滤波不需要对整个阵列进行排序,只需找到阵列中间值即可;

3)使用排序后阵列位置为f[4]的像素点灰度值代替图1的中心像素点灰度值;

4)从左到右,从上到下依次移动滤波模板,重复1)~3)步骤,直至处理完所有的像素点灰度值。

图1 原始图像像素点

图2 3×3滤波模板

图3 线性阵列

从以上操作可以看出,图像的第一行、最后一行、第一列和最后一列像素点没有被遍历到。一般有两种方案解决这个问题:1)将该位置的所有像素赋值为零;2)在原始图像的上下左右都加上全零向量。本文将中值滤波器未遍历到的所有边界像素点都赋值为零。

直方图均衡化结合中值滤波的CPU串行算法流程如图4所示。

3 直方图均衡化结合中值滤波的CUDA并行化

3.1 CUDA编程模型

GPUS不同于传统的CPUS,为它们开发的应用程序通常是使用专门的应用程序编程接口来编写[13],例如CUDA和OPenCL。NVIDIA于2006年11月推出了统一计算设备架构CUDA(Compute Unified Device Architecture),一个通用的并行计算平台和编程模型,它利用了NVIDIA GPUS的并行计算引擎,以一种比CPU更有效的方式解决许多复杂的计算问题。NVIDIA开发CUDA编程模型和软件环境,让程序员可以使用C语言的直接扩展来编写可伸缩的并行程序[14]。在CUDA编程模型中,CPU作为主机端,GPU作为设备端,主机端仅有一个,设备端可以有多个,CPU与GPU通过PCI-E总线连接,CPU在处理逻辑性强的事务和串行计算任务方面具有优势,而GPU在处理密集型数据和并行数据方面优势明显[15]。运行在GPU上的函数称为核(kernel)函数,一个完整的CUDA计算任务,是由主机端串行代码和设备端并行核函数共同完成[16]。

图4 CPU串行算法流程

3.2 算法并行性分析

根据直方图均衡化算法基本原理,分析算法耗时的三个模块:遍历统计每个灰度级的像素点个数、直方图均衡化及灰度映射,各个像素点之间无相关性,各级灰度级之间相互独立。

根据中值滤波算法基本原理,中值滤波后图像每个像素点的灰度值仅与噪声图像中要处理的像素点及其领域内像素点灰度值有关。中值滤波算法以相同的方式处理图像中的每个像素,各个像素点之间相互独立。

因此,由以上分析可知,随着图像尺寸的增大,像素点数量增多,像素点之间无相关性,符合GPU处理高计算密度和大规模并行数据的特点,可以实现直方图均衡化结合中值滤波的并行化。

3.3 GPU并行算法实现

本文使用CUDA结合OpenCV自带的简单的图像处理接口编程实现。在CPU端,使用OpenCV提供的API进行原始图像的读取、像素数据的获取及图像的显示和输出;在GPU端,编写图像并行化处理的CUDA程序。

并行算法具体步骤为1)使用OpenCV提供的API:imread()载入原始图像,且加入椒盐噪声。对处理一幅大小为width×height的图像,创建一个二维grid包含(width+16-1)×(height+16-1)/(16×16)个线程块,并设置一个二维block包含256个线程,与灰度图像的灰度级一致。主机端使用cuda⁃Malloc()函数分配显存,并使用cudaMemcpy()函数将主存中的噪声图像数据拷贝到显存。调用核函数Histokernel计算图像直方图,且调用原子操作函数 atomicAdd(addr,y)生成一个原子操作序列,完成读取地址为addr处的像素点值,累加到对应的灰度级,及将结果保存回地址addr,在统计完成所有像素点后将直方图结果拷贝到主存;2)在主机端串行完成计算量少的直方图归一化及累计直方图计算,并在CPU端分配显存,将累计直方图结果拷贝到显存;3)调用核函数Equhistkernel分配一个线程块完成直方图均衡化;4)调用核函数Mapmageker⁃nel完成灰度映射;5)在直方图均衡化之后调用核函数MedianFliterkernel抑制图像噪声;6)将滤波后的图像数据从显存拷贝回主存,并释放分配的显存。使用OpenCV提高的API:imshow()和imwrite()分别显示和输出处理后的图像。

直方图均衡化结合中值滤波的GPU并行算法流程如图5所示。

图5 GPU并行算法流程

4 实验结果与分析

实验环境配置,处理器:Intel Core i5-7400,物理 4核,主频 3GHz,内存 8GB;GPU:NVIDIA Ge⁃Force GT730,显存为2048MB,2个流多处理器(SM),每个流多处理器包含192个流处理器(SP);操作系统:Windows7 SP1 64bit;编程环境:Visual Studio 2015,安装并配置CUDA9.0,OpenCV-3.4.1,Cmake3.12。

本文首先对原始图像加入20000个椒盐噪声点,并进行直方图均衡化处理;然后,引入中值滤波算法,分别实现直方图均衡化结合中值滤波的串并行图像处理。本文以分辨率为512×512的Lena图像为例来比较串并行处理效果,图6(a)为原始图像,图6(b)为椒盐噪声密度为7.6%的Lena图像,图6(c)、(d)和图7(c)、(d)分别为串并行处理方式下,Lena图像的处理效果。表1为直方图均衡化结合中值滤波的串并行执行时间。

图6 串行Lena图像处理结果

图7 并行Lena图像处理结果

从图6(c)串行和图7(c)并行处理效果图可以看出,直方图均衡化在改善图像对比度上起到了良好的效果,但直方图均衡化处理不能有效去除图像噪声。通过直方图均衡化与中值滤波相结合,对含有椒盐噪声的图像分别进行串行与并行处理后,从图6(d)串行与图7(d)并行处理效果图可以看出,图像处理效果一致,图像噪声得到了有效抑制,图像清晰度和对比度得到了提高,且图像变得平滑,图像的整体视觉效果得到了明显改善。

表1 中值滤波后CPU和GPU运行时间

表1是对加入20000个椒盐噪声点的图像进行串并行处理。通过对中值滤波后的图像进行20次测试取平均值,比较直方图均衡化结合中值滤波在CPU和GPU上的执行时间。从表中可以看出,随着图像尺寸的增大,CPU串行处理时间增幅较大,GPU并行处理时间增幅较小,加速比逐渐增大。

5 结语

针对直方图均衡化不能有效去除噪声的问题,论文引入中值滤波算法来抑制最常见的椒盐噪声对直方图均衡化图像效果的影响。并对于使用传统CPU处理方式,算法执行效率低的缺点。利用GPU强大的并行计算能力,实现基于CUDA和OpenCV的直方图均衡化结合中值滤波的并行化。实验结果表明,直方图均衡化结合中值滤波的串并行图像处理效果一致,都能够明显抑制图像中的椒盐噪声、提高图像对比度和清晰度,改善图像的整体视觉效果,但随着图像尺寸的增大,GPU并行处理速度相比于传统CPU串行处理速度,明显提高了数据处理速度。

猜你喜欢

均衡化椒盐像素点
基于局部相似性的特征匹配筛选算法
学做椒盐虾
一种X射线图像白点噪声去除算法
基于canvas的前端数据加密
图像采集过程中基于肤色理论的采集框自动定位
基础教育均衡化的实施对于现阶段教育发展的重要性
椒盐芝麻烧饼
椒盐卷饼
幼儿园私家菜
EDIUS 5.1音量均衡化