基于Nsight Eclipse Edition的高斯滤波的实现(一)——CPU代码
首先写了一个在CPU运行的高斯滤波的函数,部分内容参考自博客:CUDA卷积操作—使用constant memory实现高斯滤波
这里我并没有使用高斯卷积核,为了使对比明显,我使用了3×3的全为1的卷积核。
图片的读取和保存,我使用的opencv,这样更简单一些,先给出CPU运行中的代码:
#include "stdio.h"
#include
#include
using namespace std;
using namespace cv;
void GaussianFilt(int width,int height,int byteCount,int Gaussian[][3],unsigned char *gray_imgbuf,unsigned char *guassian_imgbuf); //高斯滤波
int main()
{
//图片读取
Mat outimage=imread("1.jpg");
uchar* src_imgbuf=outimage.ptr(0);//图像指针
int width=outimage.cols, height=outimage.rows, byteCount=outimage.channels();
int frame=1; //读入图像数量
cout<<"width"<"height"<for (int i=1;i<=frame;i++)
{
int Gaussian_mask[3][3]={{1,1,1},{1,1,1},{1,1,1}};//总和9
//输出图像内存分配
unsigned char *guassian_imgbuf=new unsigned char[width*height*byteCount];
//对原图高斯模糊
GaussianFilt(width,height,byteCount,Gaussian_mask,src_imgbuf,guassian_imgbuf);
//保存输出图片
Mat out(height, width, outimage.type(), guassian_imgbuf);
imwrite("test.jpg", out);
//delete src_imgbuf;//这句话 要注释掉
delete guassian_imgbuf;
}
}
void GaussianFilt(int width,int height,int byteCount,int Gaussian[][3],uchar* src_imgbuf,unsigned char *guassian_imgbuf)
{
cout<<"width"<"height"<//高斯模糊处理 5层循环处理
for(int i=0;i//行数,高
{
for(int j=0;j//列数
{
for(int k=0;kint sum=0;//临时值
int tempPixelValue=0;
for (int m=-1;m<=1;m++)
{
for (int n=-1;n<=1;n++)
{
//边界处理,幽灵元素赋值为零
if (i+m<0||j+n<0||i+m>=height||j+n>=width)
tempPixelValue=0;
else
tempPixelValue=*(src_imgbuf+(i+m)*width*byteCount+(j+n)*byteCount+k);
sum+=tempPixelValue*Gaussian[m+1][n+1];
}
}
if (sum/9<0)
*(guassian_imgbuf+i*width*byteCount+j*byteCount+k)=0;
else if(sum/9>255)
*(guassian_imgbuf+i*width*byteCount+j*byteCount+k)=255;
else
*(guassian_imgbuf+i*width*byteCount+j*byteCount+k)=sum/9;
}
}
}
}
先对文中代码进行一点说明:
(1)
Mat outimage=imread("1.jpg");
uchar* src_imgbuf=outimage.ptr<uchar>(0);//图像指针
这两句话的意思是,读取图像,并获取指向该图像的指针。
第二句话很重要,src_imgbuf中存放着图像中的数量,我们可以根据src_imgbuf实现对每一个像素的访问。
(2)
//输出图像内存分配
unsigned char *guassian_imgbuf=new unsigned char[width*height*byteCount];
.
.
.
.
delete guassian_imgbuf;
在输出图像的时候,我们先使用new分配一块内存,所以在结束之前,要将该段内存删除掉,而读图像的时候,我们没有使用new分配内存,所以最后不能使用delete进行删除,这是今天出现的第二个错误。编译能成功,但是运行时候,显示错误如图:
(3)
对图像进行高斯滤波处理之后,图像的数据存储在guassian_imgbuf里面,我们要将图片写出保存,代码如下:
/保存输出图片
Mat out(height, width, outimage.type(), guassian_imgbuf);
imwrite("test.jpg", out);
查看oponcv文档中对Mat的定义:
cv::Mat Class Reference
Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP)
注意:第一个参数是图像的行数,也就是图像的高height,第二个参数是图像的列数,也就是图像的宽width,不要弄反了。