///这是做高斯金字塔,怎样让这两个kernel函数合成一个呢,我就简单的一合并,结果图像是黑色的
global void GaussianSF_kernel(unsigned char* SrcBuf,unsigned char* DstBuf,float* Weight,int w,int h,float S,int nbands)
{
int i = blockDim.x * blockIdx.x + threadIdx.x;
int j = blockDim.y * blockIdx.y + threadIdx.y;
if (i > 1 && i < w - 2 && j > 1 && j < h - 2 )
{
for (int n=0;n < nbands;n++)
{
/************************************************************************/
/* 计算权重矩阵 */
/************************************************************************/
Weight[0] = 1/(C*S*S)*(exp(-(8/2*S*S)));
Weight[1] = 1/(C*S*S)*(exp(-(5/2*S*S)));
Weight[2] = 1/(C*S*S)*(exp(-(4/2*S*S)));
Weight[3] = 1/(C*S*S)*(exp(-(5/2*S*S)));
Weight[4] = 1/(C*S*S)*(exp(-(8/2*S*S)));
Weight[5] = 1/(C*S*S)*(exp(-(5/2*S*S)));
Weight[6] = 1/(C*S*S)*(exp(-(2/2*S*S)));
Weight[7] = 1/(C*S*S)*(exp(-(1/2*S*S)));
Weight[8] = 1/(C*S*S)*(exp(-(2/2*S*S)));
Weight[9] = 1/(C*S*S)*(exp(-(5/2*S*S)));
Weight[10] = 1/(C*S*S)*(exp(-(4/2*S*S)));
Weight[11] = 1/(C*S*S)*(exp(-(1/2*S*S)));
Weight[12] = 1/(C*S*S);
Weight[13] = 1/(C*S*S)*(exp(-(1/2*S*S)));
Weight[14] = 1/(C*S*S)*(exp(-(4/2*S*S)));
Weight[15] = 1/(C*S*S)*(exp(-(5/2*S*S)));
Weight[16] = 1/(C*S*S)*(exp(-(2/2*S*S)));
Weight[17] = 1/(C*S*S)*(exp(-(1/2*S*S)));
Weight[18] = 1/(C*S*S)*(exp(-(2/2*S*S)));
Weight[19] = 1/(C*S*S)*(exp(-(5/2*S*S)));
Weight[20] = 1/(C*S*S)*(exp(-(8/2*S*S)));
Weight[21] = 1/(C*S*S)*(exp(-(5/2*S*S)));
Weight[22] = 1/(C*S*S)*(exp(-(4/2*S*S)));
Weight[23] = 1/(C*S*S)*(exp(-(5/2*S*S)));
Weight[24] = 1/(C*S*S)*(exp(-(8/2*S*S)));
float sum = Weight[0] + Weight[1] + Weight[2] + Weight[3] + Weight[4] + Weight[5] + Weight[6] + Weight[7] + Weight[8]
+Weight[9] + Weight[10] + Weight[11] + Weight[12] + Weight[13] + Weight[14] + Weight[15] + Weight[16] + Weight[17]
+Weight[18] + Weight[19] + Weight[20] + Weight[21] + Weight[22] + Weight[23] + Weight[24];
/************************************************************************/
/* 九个点的像素值 */
/************************************************************************/
float b[25];
float G = 0.0;
b[0] = (float)SrcBuf[(j+2)*w + i-2+n*w*h];
b[1] = (float)SrcBuf[(j+2)*w + i-1+n*w*h];
b[2] = (float)SrcBuf[(j+2)*w + i+n*w*h];
b[3] = (float)SrcBuf[(j+2)*w + i+1+n*w*h];
b[4] = (float)SrcBuf[(j+2)*w + i+2+n*w*h];
b[5] = (float)SrcBuf[(j+1)*w + i-2+n*w*h];
b[6] = (float)SrcBuf[(j+1)*w + i-1+n*w*h];
b[7] = (float)SrcBuf[(j+1)*w + i+n*w*h];
b[8] = (float)SrcBuf[(j+1)*w + i+1+n*w*h];
b[9] = (float)SrcBuf[(j+1)*w + i+2+n*w*h];
b[10] = (float)SrcBuf[j*w + i-2+n*w*h];
b[11] = (float)SrcBuf[j*w + i-1+n*w*h];
b[12] = (float)SrcBuf[j*w + i+n*w*h];
b[13] = (float)SrcBuf[j*w + (i+1)+n*w*h];
b[14] = (float)SrcBuf[j*w + (i+2)+n*w*h];
b[15] = (float)SrcBuf[(j-1)*w + i-2+n*w*h];
b[16] = (float)SrcBuf[(j-1)*w + i-1+n*w*h];
b[17] = (float)SrcBuf[(j-1)*w + i+n*w*h];
b[18] = (float)SrcBuf[(j-1)*w + i+1+n*w*h];
b[19] = (float)SrcBuf[(j+2)*w + i-1+n*w*h];
b[20] = (float)SrcBuf[(j-2)*w + i-2+n*w*h];
b[21] = (float)SrcBuf[(j-2)*w + i-1+n*w*h];
b[22] = (float)SrcBuf[(j-2)*w + i+n*w*h];
b[23] = (float)SrcBuf[(j-2)*w + i+1+n*w*h];
b[24] = (float)SrcBuf[(j+2)*w + i-2+n*w*h];
/************************************************************************/
/* 计算高斯模糊的值 */
/************************************************************************/
for (int k=0;k<25;k++)
{
G += b[k] * Weight[k]/sum;
}
if (G >= 255.0) G = 255.0;
DstBuf[j*w + i+n*w*h] = G;
}
}
}
global void Zoom_kernel(unsigned char* d_SrcBuf, unsigned char * d_DstBuf, int w, int h,int bands,int z)
{
//降采样
int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;
int i0,j0,nw,nh;
nw = (int)(w/pow(2.0,z)+0.5);
nh = (int)(h/pow(2.0,z)+0.5);
i0 = (int)(ipow(2.0,z));
j0 = (int)(jpow(2.0,z));
if(i < nw && j < nh)
{
for(int k = 0;k < bands;k++)
{
d_DstBuf[kwh+wj+i] = d_SrcBuf[kwh+wj0+i0];
}
}
}