没想到我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代码的更多相关文章

  1. opencv-10-图像滤波-噪声添加与均值滤波-含opencv C++ 代码实现

    开始之前 再说上一篇文章中, 我们想按照噪声产生, 然后将降噪的, 但是限于篇幅, 我就放在这一篇里面了, 说起图像的噪声问题就又回到了我们上一章的内容, 把噪声当作信号处理, 实际上数字图像处理实际 ...

  2. 【AdaBoost算法】积分图代码实现

    一.积分图介绍 定义:图像左上方的像素点值的和: 在Adaboost算法中可用于加速计算Haar或MB-LBP特征值,如下图: 二.代码实现 #include <opencv/highgui.h ...

  3. 学习 opencv---(7) 线性邻域滤波专场:方框滤波,均值滤波,高斯滤波

    本篇文章中,我们一起仔细探讨了OpenCV图像处理技术中比较热门的图像滤波操作.图像滤波系列文章浅墨准备花两次更新的时间来讲,此为上篇,为大家剖析了"方框滤波","均值滤 ...

  4. 滤波器——BoxBlur均值滤波及其快速实现

    个人博客地址:滤波器--BoxBlur均值滤波及其快速实现 动机:卷积核.滤波器.卷积.相关 在数字图像处理的语境里,图像一般是二维或三维的矩阵,卷积核(kernel)和滤波器(filter)通常指代 ...

  5. OpenCV计算机视觉学习(4)——图像平滑处理(均值滤波,高斯滤波,中值滤波,双边滤波)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice &q ...

  6. 基于FPGA的均值滤波算法实现

    我们为了实现动态图像的滤波算法,用串口发送图像数据到FPGA开发板,经FPGA进行图像处理算法后,动态显示到VGA显示屏上,前面我们把硬件平台已经搭建完成了,后面我们将利用这个硬件基础平台上来实现基于 ...

  7. 基础图像处理之混合空间增强——(Java:拉普拉斯锐化、Sobel边缘检测、均值滤波、伽马变换)

    相信看过冈萨雷斯第三版数字图像处理的童鞋都知道,里面涉及到了很多的基础图像处理的算法,今天,就专门借用其中一个混合空间增强的案例,来将常见的几种图像处理算法集合起来,看能发生什么样的化学反应 首先,通 ...

  8. 基于MATLAB的均值滤波算法实现

    在图像采集和生成中会不可避免的引入噪声,图像噪声是指存在于图像数据中的不必要的或多余的干扰信息,这对我们对图像信息的提取造成干扰,所以要进行去噪声处理,常见的去除噪声的方法有均值滤波.中值滤波.高斯滤 ...

  9. 浅析人脸检测之Haar分类器方法:Haar特征、积分图、 AdaBoost 、级联

    浅析人脸检测之Haar分类器方法 一.Haar分类器的前世今生 人脸检测属于计算机视觉的范畴,早期人们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景下的人脸检测需求越来越大,人脸 ...

随机推荐

  1. vim 高级应用

    1 全文内容删除 方法1:    按ggdG方法2:       :%d

  2. 去除测序reads中的接头:adaptor

    之前用c写过一个程序,查找reads中是否包含了adaptor,如果检测到的话就过滤掉含有adaptor的reads,这次在过滤完数据之后发现接头序列比较多,为了提升组装效果,又不能很大地影响数据量, ...

  3. 【官方文档】Nginx模块Nginx-Rtmp-Module学习笔记(三)流式播放Live HLS视频

    源码地址:https://github.com/Tinywan/PHP_Experience HTTP Live Streaming(HLS)是由Apple Inc.实施的非常强大的流视频协议.HLS ...

  4. CentOS7下安装MySQL并配置远程连接

    一.CentOS7下安装MySQL数据库 CentOS7默认的安装包里面已经没有 MySQL-Server安装包了,远程镜像中也没有了. 默认的是MariaDB (MySQL的一个分支,开发这个分支的 ...

  5. Netty之心跳检测技术(四)

    Netty之心跳检测技术(四) 一.简介 "心跳"听起来感觉很牛X的样子,其实只是一种检测端到端连接状态的技术.举个简单的"栗子",现有A.B两端已经互相连接, ...

  6. Java学习笔记-嵌套类

    嵌套类 嵌套类有两种类别:static and non-static,分别对应为静态嵌套类和内部类. class OuterClass { ... static class StaticNestedC ...

  7. TPYBoard读取芯片上的温度传感器

    转载请以链接形式注明文章来源,公众号:MicroPython玩家汇 一.STM32内部温度传感器概要 STM32芯片内部一项独特的功能就是内部集成了一个温度传感器,因为是内置,所以测试的是芯片内部的温 ...

  8. 巧用CSS实现宝马LOGO

    某天突然遇到一个有趣的面试题,需用CSS实现一个宝马的Logo,第一反应就是这不是老生常谈的八卦图的小变形吗,只需用伪元素就可轻易的实现啦,但是细看要求说只能在一个标签里写样式,所以呜呜呜...请教下 ...

  9. python爬虫下载文件

    python爬虫下载文件 下载东西和访问网页差不多,这里以下载我以前做的一个安卓小游戏为例 地址为:http://hjwachhy.site/game/only_v1.1.1.apk 首先下载到内存 ...

  10. HTML知识点总结之<a>标签

    HTML是什么? HTML(Hyper Text Markup Language)超文本标记语言,用来描述网页的一种语言.超文本是指网页不止有文本,还可以有图片,链接,视频,音频等非文本元素.标记语言 ...