CUDA加速添加高斯噪声

悠扬侠 悠扬侠 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
小弟最近在学习CUDA,尝试加速添加高斯噪声这一过程,但是始终不知道错误原因,一运行就全黑了,所以想请教各位大佬,万分感谢。



// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include "Windows.h"
#include <math.h>
#include <iostream>
#include <cxcore.h>
#include <opencv.hpp>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
double getRandGaussVal_device(double noisefactor);

#define BLOCKDIM_X 16
#define BLOCKDIM_Y 16

#define GRIDDIM_X 256
#define GRIDDIM_Y 256

int g_iGaussList[1000];//RGB化的高斯值
__global__ void kernel_Gaussianweiguang(/*int width,int height,*/uchar* sensorBuffer,double* data_to_device);
void GenerateGaussNosieList(const int iNum,const int val);

int _tmain(int argc, _TCHAR* argv[])
{
int iTemp_host=getRandGaussVal_device(1);
double *data_to_device,data_device[1]={iTemp_host};
uchar* sensorBuffer=new uchar[1024*768*3];

cudaMalloc((void**)&data_to_device,sizeof(double));
cudaMemcpy(data_to_device,data_device,sizeof(double),cudaMemcpyHostToDevice);///由主机复制到设备


//分配显存空间
int size1=1024*768*3*sizeof(unsigned char);
unsigned char *d_src_imgbuf;
cudaMalloc((void**)&d_src_imgbuf, size1);


//把数据从Host传到Device
cudaMemcpy(d_src_imgbuf, sensorBuffer, size1, cudaMemcpyHostToDevice);



Mat src=imread("Chrysanthemum.jpg");
Mat dst;

uchar* Temp=sensorBuffer;
uchar* Temp1=sensorBuffer;
uchar* tem=sensorBuffer;
int i=0;
for(int r=0;r<src.rows;r++)
{
uchar* data=src.ptr<uchar>(r);
for(int c=0;c<src.cols*3;c++)
{
sensorBuffer[r*src.cols*3+c]=data[c];
}
}

int bx = ceil((double)dst.rows/BLOCKDIM_X); //网格和块的分配
int by = ceil((double)dst.cols/BLOCKDIM_Y);
if(bx > GRIDDIM_X) bx = GRIDDIM_X;
if(by > GRIDDIM_Y) by = GRIDDIM_Y;
dim3 grid(bx,by);//网格的结构
dim3 block(BLOCKDIM_X,BLOCKDIM_Y);//块的结构

GenerateGaussNosieList(1000,20);

int iTemp=0;int i1=0;
/*for(int r=0;r<src.rows;r++)
for(int c=0;c<src.cols*3;c++)
{
Temp[r*src.cols*3+c]=Temp[r*src.cols*3+c]+getRandGaussVal_device(1);
}*/
kernel_Gaussianweiguang<<<grid,block>>>(d_src_imgbuf,data_to_device);
cudaMemcpy(tem, d_src_imgbuf,size1, cudaMemcpyDeviceToHost);//数据传回主机端

Mat src1(src.size(),src.type());
for(int c=0;c<src.rows;c++)
for(int r=0;r<src.cols*3;r++)
{
src1.at<uchar>(c,r)=Temp1[c*src.cols*3+r];
}
imshow("a",src1);waitKey(0);
cudaFree(d_src_imgbuf);
cudaFree(data_to_device);


}
void GenerateGaussNosieList(const int iNum,const int val)
{
for(int i = 0; i < iNum; i++)
{
static bool hasSpare = false;
static double rand1, rand2;
double result;
if(hasSpare)
{
hasSpare = false;
result = sqrt(rand1) * sin(rand2);
}
hasSpare = true;
rand1 = rand() / ((double) RAND_MAX);
if(rand1 < 1e-100) rand1 = 1e-100;
rand1 = -2 * log(rand1);
rand2 = (rand() / ((double) RAND_MAX)) * 2*CV_PI;
result = sqrt(rand1) * cos(rand2);
g_iGaussList[i] = (int)((float)result*(float)val);
cout<<g_iGaussList[i]<<endl;
}
int itest = 0;
}
double getRandGaussVal_device(double noisefactor)
{
double i = 0;
int iRand = 1000*rand()/RAND_MAX;
i = g_iGaussList[iRand]*noisefactor;
return i;
}
__global__ void kernel_Gaussianweiguang(/*int width,int height,*/uchar* d_src_imgbuf,double* data_to_device)
{


uchar* temp=d_src_imgbuf;

int ncols=1024*3;

const int tix=blockDim.x*blockIdx.x+threadIdx.x;
const int tiy=blockDim.y*blockIdx.y+threadIdx.y;
const int threadTotalX=blockDim.x*gridDim.x;
const int threadTotalY=blockDim.y*gridDim.y;
for (int i=tix;i<768;i+=threadTotalX)
{

for (int j=tiy;j<ncols;j+=threadTotalY)
{

temp[i*ncols+j]=temp[i*ncols+j]+*data_to_device;

}
}
}
...全文

相关推荐

GPU图像卷积加速库是一个专注于利用图形处理器并行计算能力实现图像卷积操作极致性能优化的开源软件库_该库通过CUDA后端实现大规模并行计算支持多种预定义卷积核如高斯模糊边缘检测锐化.zip

该库支持多种预定义卷积核,这些卷积核包括但不限于高斯模糊、边缘检测和锐化等常见的图像处理效果。高斯模糊是一种常用的图像模糊技术,可以用来模拟相机的景深效果,也可以用于降低图像噪声和细节。

CBA12890

Noise2Noise: 实验总结——测试简记【去高斯噪声、去文本噪声】

这是一篇经典的图像去噪文章的简单测试

墨理学AI

去噪代码matlab-VSNR_CUDA_MEX:一个工具箱,用于说明CUDA与Matlab一起使用的情况

例如,对于高斯噪声,可以采用Wiener滤波;对于脉冲噪声,可以利用中值滤波;对于混合噪声,可能需要结合多种滤波器或者机器学习模型进行处理。

weixin_38742927

canny-edge-parallel:使用OpenMP,CUDA和OpenCL的Canny Edge Detection算法的并行实现

**高斯滤波**:首先对原始图像进行高斯平滑处理,以消除噪声,减少后续计算中的误差。2.

Yuan Andy

Python OpenCV铅笔画素描 灰度反相高斯对照

硬件加速模块自动检测CUDA支持状态,当检测到NVIDIA显卡时启用cv2.cuda模块进行高斯模糊加速,处理速度提升3.2倍。内存映射文件技术用于大图处理,减少物理内存占用达47%。

「已注销」
评论 1
收藏 已收藏
分享
返回顶部
悠扬侠
C++ 语言 65,214 成员 250,514 内容