积分图实现均值滤波的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分类器的前世今生 人脸检测属于计算机视觉的范畴,早期人们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景下的人脸检测需求越来越大,人脸 ...
随机推荐
- Java的虚方法
虚方法出现在Java的多态特性中, 父类与子类之间的多态性,对父类的函数进行重新定义.如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding).在Java中,子类 ...
- sql优化原则与技巧
加快sql查询是非常重要的技巧,简单来说加快sql查询的方式有以下几种:一.索引的引用 1.索引一般可以加速数据的检索速度,加速表与表之间的链接,提高性能,所以在对海量数据进行处理时,考虑到信息量比较 ...
- 商业智能(BI)选型手册(转载)
摘自http://articles.e-works.net.cn/bi/Article126429.htm 1.前言 互联网时代企业数据呈现爆发式增长,全面考验着企业的数据处理和分析能力.面对大容量. ...
- python基础(四)字符串处理
字符串处理 msg = 'my name is sylar' capitalize方法,将字符串的首字母大写 print 'capitalize方法:', msg.capitalize() swapc ...
- Java学习笔记1(HelloWorld)
编写HelloWorld是一种仪式: 1.下载JDK,安装,注意路径中不要存在中文. 2.添加环境变量,加入bin目录 3.写一个文本,内容如下,后缀改成.java,注意文本的名称为HelloWorl ...
- NoSQL:Linux操作memcached
一 NoSQL简介 NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",泛指非关系型的数据库,随着互联网web2.0网站的兴起,传统的关系数据库在应付 ...
- PE文件详解二
本文转自小甲鱼的PE文件相关教程,原文传送门 咱接着往下讲解IMAGE_OPTIONAL_HEADER32 结构定义即各个属性的作用! 接着我们来谈谈 IMAGE_OPTIONAL_HEADER 结构 ...
- C#学习笔记-组合模式
什么是组合模式? 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构. 组合模式使得用户对单个对象和组合对象的使用具有一致性. 何时使用组合模式? 当需求中是体现部分与 ...
- 利用java的反射,实现工厂创建对象
public static Object getInstance(Class c){ Object obj = null; try { obj = c.newInstance(); } catch ( ...
- [51nod Round 15 B ] 完美消除
数位DP. 比较蛋疼的是,设a[i]表示第i位上数字,比方说a[1]<a[2]>a[3],且a[1]==a[3]时,这两位上的数可以放在一起搞掉. 所以就在正常的f数组里多开一维,表示后面 ...