基于CUDA的并行计算技术+opencv完成图像高斯滤波和双边滤波,开发版本为VS2019+openCV3.4

您所在的位置:网站首页 双边滤波公式推导 基于CUDA的并行计算技术+opencv完成图像高斯滤波和双边滤波,开发版本为VS2019+openCV3.4

基于CUDA的并行计算技术+opencv完成图像高斯滤波和双边滤波,开发版本为VS2019+openCV3.4

2023-12-14 21:47| 来源: 网络整理| 查看: 265

实验三-基于CUDA的并行计算技术及其应用

本文提到的相关代码已上传,欢迎下载: https://download.csdn.net/download/qq_32563773/12445895 参考: https://zhuanlan.zhihu.com/p/34587739

CUDA基础知识

GPU并不是一个独立运行的计算平台,而需要与CPU协同工作,可以看成是CPU的协处理器,因此当我们在说GPU并行计算时,其实是指的基于CPU+GPU的异构计算架构。在异构计算架构中,GPU与CPU通过PCIe总线连接在一起来协同工作,CPU所在位置称为为主机端(host),而GPU所在位置称为设备端(device),如下图所示。 在这里插入图片描述

CUDA程序中既包含host程序,又包含device程序,它们分别在CPU和GPU上运行。同时,host与device之间可以进行通信,这样它们之间可以进行数据拷贝。典型的CUDA程序的执行流程如下:

\1. 分配host内存,并进行数据初始化;

\2. 分配device内存,并从host将数据拷贝到device上;

\3. 调用CUDA的核函数在device上完成指定的运算;

\4. 将device上的运算结果拷贝到host上;

\5. 释放device和host上分配的内存。

由于GPU实际上是异构模型,所以需要区分host和device上的代码,在CUDA中是通过函数类型限定词开区别host和device上的函数,主要的三个函数类型限定词如下:

l global:在device上执行,从host中调用(一些特定的GPU也可以从device上调用),返回类型必须是void,不支持可变参数参数,不能成为类成员函数。注意用__global__定义的kernel是异步的,这意味着host不会等待kernel执行完就执行下一步。

l device:在device上执行,单仅可以从device中调用,不可以和__global__同时用。

l host:在host上执行,仅可以从host上调用,一般省略不写,不可以和__global__同时用,但可和__device__,此时函数会在device和host都编译。

要深刻理解kernel,必须要对kernel的线程层次结构有一个清晰的认识。首先GPU上很多并行化的轻量级线程。kernel在device上执行时实际上是启动很多线程,一个kernel所启动的所有线程称为一个网格(grid),同一个网格上的线程共享相同的全局内存空间,grid是线程结构的第一层次,而网格又可以分为很多线程块(block),一个线程块里面包含很多线程,这是第二个层次。线程两层组织结构如下图所示。

在这里插入图片描述

CUDA编程的逻辑层和物理层:

在这里插入图片描述

本人通过下方的程序,先检查一下自己的GPU的硬件配置,这样才可以有的放矢。 在这里插入图片描述

本人的GPU参数如下: 在这里插入图片描述

CUDA的高斯滤波实现

高斯滤波是通过对输入数组的每个点与输入的高斯滤波模板执行卷积计算然后将这些结果一块组成了滤波后的输出数组,通俗的讲就是高斯滤波是对整幅图像进行加权平均的过程,每一个像素点的值都由其本身和邻域内的其他像素值经过加权平均后得到。

高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

在这里插入图片描述

本人使用的高斯滤波方法如下图,在确定高斯核后,略过边缘的二分之一核大小,确保能够使得卷积运算正确运行,并在输入值乘以高斯核系数后,判定是否结果溢出灰度值并处理。

在这里插入图片描述

使用了5维的高斯核(如下),完成高斯的滤波。

在这里插入图片描述 在计算前,其准备工作如下,本人使用opencv3.4的库,读取图片并且分配GPU内存

在这里插入图片描述 之后进行函数调取并显示出结果,以及内存释放: 在这里插入图片描述

结果如下:

在这里插入图片描述

本文使用的是在读取的时候进行灰度操作,对于彩色图片来说,可以通过计算RGB三通道完成彩色图片的计算:

在这里插入图片描述

CUDA的双边滤波实现

双边滤波器(Bilateral filter)是一种可以保边去噪的滤波器。可以滤除图像数据中的噪声,且还会保留住图像的边缘、纹理等(因噪声是高频信号,边缘、纹理也是高频信息,高斯滤波会在滤除噪声的同时使得边缘模糊)。那这么优秀的一个滤波器,他到底是个什么呢,其实,它和我们普通的高斯滤波器一样,也是使用一个卷积核(模板矩阵),叠加到待处理像素点上,使用对应邻域像素点的加权求和来作为新的输出像素点的值一种方法,简单来说,双边滤波和高斯滤波一样,不同只在于模板矩阵的不同。

双边滤波器的模板系数矩阵由高斯模板矩阵点乘(元素级相乘)值域系数获得。因此,本人使用了前边的高斯模板,在此基础上,添加值域核与其相乘来完成双边滤波。即新的核通过如下方式计算得到,在高斯计算之后加上体素差的因子。 在这里插入图片描述

如下为双边滤波算法的函数实现过程,其中num值为计算得到的值域核的值:

在这里插入图片描述

具体的实现过程在之前的高斯滤波中已经讲述,在计算值域核时设定不同的sigm值后,得到的双边滤波结果不同。

当在设定值域核时,设定sigm系数为10:

在这里插入图片描述

当在设定值域核时,设定sigm系数为50:

在这里插入图片描述

我们明显看到在设定sigm值为50时,相对于10取得了更为优秀的结果,并且相对于高斯滤波来讲,双边滤波在去噪的同时,保留了更多的纹理特征和边缘特征,可以看出,双边滤波是对于高斯滤波的优化。

同时,在使用三通道计算后我们可以看到彩色的lena人像: 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3