生成高斯核代码:
void GetGaussianKernel(float *gaus, const int size,const float sigma)
{
const double PI=4.0*atan(1.0); //圆周率π赋值
int center=size/2;
double sum=0;
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
{
gaus[i * size + j] = (1/(2*PI*sigma*sigma))*exp(-((i-center)*(i-center)+(j-center)*(j-center))/(2*sigma*sigma));
sum+= gaus[ i * size + j];
}
}
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
{
gaus[ i * size + j]/=sum;
}
}
return ;
}
高斯模糊操作:
__kernel void gaoSi_kernel(__global uchar* inputImage, __global uchar* outputImage, __global float * mode_kernel , int g_wid, int wid, int hig )
{
int dx = get_global_id(0);
int dy = get_global_id(1);
uchar sum[3]= {0};
int i = 0;
int j = 0;
float temp = 0.0f;
for(i= -g_wid / 2; i <= g_wid / 2; i++ )
{
for(j= -g_wid / 2; j <= g_wid / 2; j++ )
{
sum[0] += convert_uchar(mode_kernel[((i + g_wid / 2) * g_wid) + (j + g_wid / 2) ] * inputImage[ 3 * ( clamp((dy + i), 0, hig - 1) * wid + clamp((dx + j), 0, wid - 1) ) + 0 ] );
sum[1] += convert_uchar(mode_kernel[((i + g_wid / 2) * g_wid) + (j + g_wid / 2) ] * inputImage[ 3 * ( clamp((dy + i), 0, hig - 1) * wid + clamp((dx + j), 0, wid - 1) ) + 1 ] );
sum[2] += convert_uchar(mode_kernel[((i + g_wid / 2) * g_wid) + (j + g_wid / 2) ] * inputImage[ 3 * ( clamp((dy + i), 0, hig - 1) * wid + clamp((dx + j), 0, wid - 1) ) + 2 ] );
}
}
outputImage[3 *(dy * wid + dx ) + 0] = sum[0];
outputImage[3 *(dy * wid + dx ) + 1] = sum[1];
outputImage[3 *(dy * wid + dx ) + 2] = sum[2];
}