积分图实现均值滤波的CUDA代码
没想到我2010年买的笔记本显卡GT330M 竟然还能跑CUDA,果断小试了一把,环境为CUDA6.5+VS2012,写了一个积分图实现均值滤波。类似于OpenCV的blur()函数。
使用lena.jpg做测试,效果如下:

代码在此:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <opencv2\opencv.hpp> using namespace std;
using namespace cv; __global__ void rowAddKernel(float* pIntegImgLena,int* pPtsImg,int imgW,int imgH)
{
const int tidx=blockDim.x*blockIdx.x + threadIdx.x;
if (tidx<imgW)
{
for (int j=; j<imgH; j++)
{
pIntegImgLena[j*imgW+ tidx] +=pIntegImgLena[(j-)*imgW+tidx];
pPtsImg[j*imgW+ tidx] +=pPtsImg[(j-)*imgW+ tidx];
}
}
} __global__ void colAddKernel(float* pIntegImgLena,int* pPtsImg,int imgW,int imgH)
{
const int tidy=blockDim.y*blockIdx.y + threadIdx.y;
if (tidy<imgH)
{
for (int i=; i<imgW; i++)
{
pIntegImgLena[tidy*imgW+ i] +=pIntegImgLena[tidy*imgW+i-];
pPtsImg[tidy*imgW+ i] +=pPtsImg[tidy*imgW+ i-];
}
}
} __global__ void filterKernel(uchar* pImgLena,float* pIntegImgLena,int* pPtsImg,int imgW,int imgH,int win)
{
const int tidx=blockDim.x*blockIdx.x + threadIdx.x;
const int tidy=blockDim.y*blockIdx.y + threadIdx.y;
if (tidx<imgW && tidy<imgH)
{
int left=tidx-win;
int right=tidx+win;
int top=tidy-win;
int bot=tidy+win; left=max(left, );
right=min(right, imgW-);
top=max(top, );
bot=min(bot, imgH-); int id1=top*imgW+left;
int id2=top*imgW+right;
int id3=bot*imgW+left;
int id4=bot*imgW+right;
int cnt=pPtsImg[id4]+pPtsImg[id1]-pPtsImg[id2]-pPtsImg[id3];
float sum=pIntegImgLena[id4]+pIntegImgLena[id1]-pIntegImgLena[id2]-pIntegImgLena[id3]; float value=sum/cnt; pImgLena[tidy*imgW+tidx]=(uchar)value;
}
} void main()
{
//读取原图像
string imgPath="data/lena.jpg";
Mat imgLena=imread(imgPath, );
int imgH=imgLena.rows;
int imgW=imgLena.cols;
namedWindow("lena");
imshow("lena", imgLena);
waitKey();
//滤波后的lena
Mat filterLena=imgLena.clone();
filterLena.setTo();
//积分图以及坐标索引图
Mat integImgLena=Mat::zeros(imgLena.size(), CV_32FC1);
Mat ptsImg=Mat::zeros(imgLena.size(), CV_32SC1);
//积分图初始化
imgLena.convertTo(imgLena, CV_32FC1);
integImgLena=imgLena.clone();
ptsImg.setTo(); //分配内存
uchar* pImgLena=NULL;
float* pIntegImgLena=NULL;
int* pPtsImg=NULL;
cudaMalloc(&pImgLena, imgH*imgW*sizeof(uchar));
cudaMalloc(&pIntegImgLena, imgH*imgW*sizeof(float));
cudaMalloc(&pPtsImg, imgH*imgW*sizeof(int)); //拷贝数据至GPU
cudaMemcpy(pImgLena, imgLena.data,imgH*imgW*sizeof(uchar), cudaMemcpyHostToDevice);
cudaMemcpy(pIntegImgLena, integImgLena.data,imgH*imgW*sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(pPtsImg, ptsImg.data,imgH*imgW*sizeof(int), cudaMemcpyHostToDevice); //按行求前缀和
dim3 block(,);
dim3 grid((imgW+block.x-)/block.x,);
rowAddKernel<<<grid, block, >>>(pIntegImgLena, pPtsImg, imgW, imgH);
cudaThreadSynchronize();
//按列求前缀和
block=dim3(,);
grid=dim3(,(imgH+block.y-)/block.y);
colAddKernel<<<grid, block, >>>(pIntegImgLena, pPtsImg, imgW, imgH);
cudaThreadSynchronize();
//滤波
int win=;
block=dim3(,);
grid=dim3((imgW+block.x-)/block.x, (imgH+block.y-)/block.y);
filterKernel<<<grid, block, >>>(pImgLena,pIntegImgLena, pPtsImg, imgW, imgH, win);
cudaThreadSynchronize(); cudaMemcpy(filterLena.data, pImgLena, imgH*imgW*sizeof(uchar), cudaMemcpyDeviceToHost); cudaError err;
err=cudaGetLastError();
if (err!=cudaSuccess)
{
cout<<"err="<<err<<endl;
getchar();
} namedWindow("filterLena");
imshow("filterLena", filterLena);
waitKey(); cudaFree(pImgLena);
cudaFree(pIntegImgLena);
cudaFree(pPtsImg);
}
积分图实现均值滤波的CUDA代码的更多相关文章
- opencv-10-图像滤波-噪声添加与均值滤波-含opencv C++ 代码实现
开始之前 再说上一篇文章中, 我们想按照噪声产生, 然后将降噪的, 但是限于篇幅, 我就放在这一篇里面了, 说起图像的噪声问题就又回到了我们上一章的内容, 把噪声当作信号处理, 实际上数字图像处理实际 ...
- 【AdaBoost算法】积分图代码实现
一.积分图介绍 定义:图像左上方的像素点值的和: 在Adaboost算法中可用于加速计算Haar或MB-LBP特征值,如下图: 二.代码实现 #include <opencv/highgui.h ...
- 学习 opencv---(7) 线性邻域滤波专场:方框滤波,均值滤波,高斯滤波
本篇文章中,我们一起仔细探讨了OpenCV图像处理技术中比较热门的图像滤波操作.图像滤波系列文章浅墨准备花两次更新的时间来讲,此为上篇,为大家剖析了"方框滤波","均值滤 ...
- 滤波器——BoxBlur均值滤波及其快速实现
个人博客地址:滤波器--BoxBlur均值滤波及其快速实现 动机:卷积核.滤波器.卷积.相关 在数字图像处理的语境里,图像一般是二维或三维的矩阵,卷积核(kernel)和滤波器(filter)通常指代 ...
- OpenCV计算机视觉学习(4)——图像平滑处理(均值滤波,高斯滤波,中值滤波,双边滤波)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice &q ...
- 基于FPGA的均值滤波算法实现
我们为了实现动态图像的滤波算法,用串口发送图像数据到FPGA开发板,经FPGA进行图像处理算法后,动态显示到VGA显示屏上,前面我们把硬件平台已经搭建完成了,后面我们将利用这个硬件基础平台上来实现基于 ...
- 基础图像处理之混合空间增强——(Java:拉普拉斯锐化、Sobel边缘检测、均值滤波、伽马变换)
相信看过冈萨雷斯第三版数字图像处理的童鞋都知道,里面涉及到了很多的基础图像处理的算法,今天,就专门借用其中一个混合空间增强的案例,来将常见的几种图像处理算法集合起来,看能发生什么样的化学反应 首先,通 ...
- 基于MATLAB的均值滤波算法实现
在图像采集和生成中会不可避免的引入噪声,图像噪声是指存在于图像数据中的不必要的或多余的干扰信息,这对我们对图像信息的提取造成干扰,所以要进行去噪声处理,常见的去除噪声的方法有均值滤波.中值滤波.高斯滤 ...
- 浅析人脸检测之Haar分类器方法:Haar特征、积分图、 AdaBoost 、级联
浅析人脸检测之Haar分类器方法 一.Haar分类器的前世今生 人脸检测属于计算机视觉的范畴,早期人们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景下的人脸检测需求越来越大,人脸 ...
随机推荐
- SQL基础学习_05_函数、谓词、CASE表达式
函数 算术函数 1. 四则运算: +.-.*./ 2. ABS:求绝对值, ABS(数值) 3. MOD: 求余,MOD(被除数,除数) 4. ROUND:四舍五入,ROUND(对象数值,保留小数的 ...
- Linux程序包管理rpm与yum
Linux程序包管理 Linux中软件的安装主要有两种形式:一种是直接下载源代码包自行编译后安装,另一种直接获取rpm软件包进行安装. 程序的组成部分: 二进制程序:程序的主体文件,比如我们运行一个l ...
- python的range()函数
range函数的三种用法:>>> range(1,5) # 代表从1到5(不包含5) [1, 2, 3, 4] >>> range(1,5,2) # 代表从1到5, ...
- Ant Design Pro 学习三 新建组件
在 src/components 下新建一个以组件名命名的文件夹,注意首字母大写 在使用组件时,默认会在 index.js 中寻找 export 的对象,如果你的组件比较复杂,可以分为多个文件,最后在 ...
- css3弹性盒模型flex快速入门与上手(align-content与align-items)
接着上文css3弹性盒模型flex快速入门与上手1继续,上文还剩下两个父容器的属性align-items和align-content. 一.align-content:多行的副轴对齐方式 含义 多行的 ...
- JS 对象API之判断父对象是否在子对象的原型链上
语法:父对象.prototype.isPrototypeOf(子对象) 代码栗子: function Student(){ this.name = "小马扎"; ; } var s ...
- delphi各种错
1. 保存文件form_spml时出上面的错,点yes后还是会出错. 解决:有时间要关闭delphi2006软件才会跳出“remove/redirect the links to another mo ...
- JQuery 网页瞄点
$("html,body").animate({ scrollTop: $("#Content1").offset().top }, 3000); 代码说明:h ...
- 【读书笔记】【深入理解ES6】#9-JavaScript中的类
大多数面向对象的编程语言都支持类和类继承的特性,而JavaScript却不支持这些特性,只能通过其他方法定义并关联多个相似的对象.这个状态一直从ECMAScript 1持续到ECMAScript 5. ...
- asp.net core 教程(五)-配置
Asp.Net Core-配置 Asp.Net Core-配置 在这一章,我们将讨论 ASP.NET Core项目的相关的配置.在解决方案资源管理器中,您将看到 Startup.cs 文件.如果你有以 ...