本人写了个程序,读入bmp格式图片并对其进行均值滤波处理,输出总是不对,求助大神!!!
#include <windows.h>
#include <stdio.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>
#include "book.h"
# define N 0.11111111111111111111111111111111
# define M 0.33333333333333333333333333333333
__global__ void kernel(int *bmp,float *pBmpBuf,float *ptr)
{
long int x = threadIdx.x + blockIdx.x * blockDim.x;
long int y = threadIdx.y + blockIdx.y * blockDim.y;
long int offset = x + y * blockDim.x * gridDim.x;
ptr[offset]=pBmpBuf[offset];
if (offset<(bmp[1]*bmp[3]))
{
if (bmp[2]==8)
{
if (offset/bmp[3]!=0)
{
if (offset/bmp[3]!=(bmp[1]-1))
{
if (offset%bmp[3]!=0)
{
if (offset%bmp[3]!=(bmp[3]-1))//判断边界,不对边界信息进行运算
{
ptr[offset]=(float)((pBmpBuf[offset-bmp[3]-1]+pBmpBuf[offset-bmp[3]]+pBmpBuf[offset-bmp[3]+1]
+pBmpBuf[offset-1]+pBmpBuf[offset]+pBmpBuf[offset+1]
+pBmpBuf[offset+bmp[3]-1]+pBmpBuf[offset+bmp[3]]+pBmpBuf[offset+bmp[3]+1])*N);
}
}
}
}
}
}
__syncthreads();
}
int main()
{
FILE *fid;
int bmpWidth,bmpHeight,biBitCount,lineByte;
int bmp[4];
int *dev_bmp;
RGBQUAD *pColorTable;//颜色表指针
float *pBmpBuf,*ptr; //读入图像数据的指针
float *dev_ptr,*dev_pBmpBuf;
dim3 dimGrid(16,16);
dim3 dimBlock(16,16);
fid=fopen("D:\\testnoise.bmp","rb");
if (fid==0)
{
printf("cannot open file");
return 0;
}
fseek(fid,sizeof(BITMAPFILEHEADER),0);//跳过位图文件头结构BITMAPFILEHEADER
BITMAPINFOHEADER head;//定义位图信息结构变量,读取位图信息头进内存,存放在变量head中
fread(&head,sizeof(BITMAPINFOHEADER),1,fid);//获取图像信息
bmpWidth=head.biWidth;
bmpHeight=head.biHeight;
biBitCount=head.biBitCount;
lineByte=(bmpWidth*biBitCount/8+3)/4*4;
bmp[0]=bmpWidth;bmp[1]=bmpHeight;bmp[2]=biBitCount;bmp[3]=lineByte;
if(biBitCount==8)
{
pColorTable=new RGBQUAD[256];
fread(pColorTable,sizeof(RGBQUAD),256,fid);
}
pBmpBuf=new float[lineByte*bmpHeight];//定义,读取位图信息
ptr=new float[lineByte*bmpHeight];//滤波存放位图信息
fread(pBmpBuf,1,lineByte*bmpHeight,fid);
fclose(fid);
printf("width=%d,height=%d, biBitCount=%d ,lineByte=%d\n",bmpWidth,bmpHeight, biBitCount,lineByte);
//分配内存
HANDLE_ERROR( cudaMalloc( (void**)&dev_bmp,4*sizeof(int) ) );
HANDLE_ERROR( cudaMalloc( (void**)&dev_ptr,lineByte*bmpHeight*sizeof(ptr) ) );
HANDLE_ERROR( cudaMalloc( (void**)&dev_pBmpBuf,lineByte*bmpHeight*sizeof(pBmpBuf) ) );
// copy the arrays to the GPU
HANDLE_ERROR( cudaMemcpy( dev_bmp,bmp,4*sizeof(int),cudaMemcpyHostToDevice ) );
HANDLE_ERROR( cudaMemcpy( dev_pBmpBuf,pBmpBuf,lineByte*bmpHeight*sizeof(pBmpBuf),cudaMemcpyHostToDevice ) );
kernel<<<dimGrid,dimBlock>>>(dev_bmp,dev_pBmpBuf,dev_ptr);
HANDLE_ERROR( cudaMemcpy(ptr,dev_ptr,lineByte*bmpHeight*sizeof(ptr),cudaMemcpyDeviceToHost ) );
HANDLE_ERROR( cudaFree( dev_bmp ) );
HANDLE_ERROR( cudaFree( dev_pBmpBuf ) );
HANDLE_ERROR( cudaFree( dev_ptr ) );
//写文件没给出
}
请问是哪里的问题?
|