/*************************************************************************
*
* 函数名称:
* KernelFilter()
*
* 参数:
* BYTE* bmp,LONG width,LONG height ------图像参数
KERNEL kernel ---------模版
*
* 返回值:
* BOOL - 成功返回TRUE,否则返回FALSE。
*
* 说明:
* 该函数对图象进行二维快速沃尔什——哈达马变换。
*
************************************************************************/
voidKernelFilter(BYTE *bmp,LONG width,LONG height,KERNEL kernel);
/*************************************************************************
*
* 函数名称:
* BmpFilter()
*
* 参数:
* BYTE *srcBmp --------原图像
BYTE *desBmp --------转换后图像
LONG width,LONG height ------图像参数
*
* 返回值:
* BOOL - 成功返回TRUE,否则返回FALSE。
*
* 说明:
* 该函数将原图像转换为由1填充的图像,方便进行模版滤波。
*
************************************************************************/
voidBmpFilter(BYTE *desBmp,BYTE *srcBmp,LONG width,LONG height);
voidMyProcess::BmpFilter(BYTE *desBmp,BYTE *srcBmp,LONG width,LONG height)
{
LONG i,j;
memset(desBmp,0,(width+6)*(height+2));
for(i=0;i<height;i++)
for(j=0;j<width;j++)
{
desBmp[(i+1)*(width+6)+j+3]=srcBmp[i*width+j];
}
}
voidMyProcess::KernelFilter(BYTE *bmp,LONG width,LONG height,KERNEL kernel)
{
LONG i,j;
//申请一个临时空间,由1包围bmp图像,方便进行模版处理
BYTE *temp_bmp =new BYTE[(width+6)*(height+2)];
BmpFilter(temp_bmp,bmp,width,height);
//模版滤波
for(i=1;i<height+1;i++)
for(j=3;j<width+3;j++)
{
LONG k,m,temp=0;
for(k=-1;k<kernel.Dimention-1;k++)
for(m=-1;m<kernel.Dimention-1;m++)
{
int a = temp_bmp[(i+k)*(width+6)+j+m*3];
int b = kernel.Element[k+1][m+1];
temp+=a*b;
}
temp/=kernel.Divisor;
//
//此处注意,不应将值给待处理对象,而应传给未处理的原图像// temp_bmp[i*(width+6)+j] = (BYTE)temp;
bmp[(i-1)*width+j-3]= temp;
}
delete[] temp_bmp;
}
/*************************************************************************
*
* 函数名称:
* MedianFilter()
*
* 参数:
* BYTE* bmp,LONG width,LONG height ------图像参数
*
* 返回值:
* BOOL - 成功返回TRUE,否则返回FALSE。
*
* 说明:
* 该函数对图象进行中值滤波。
*
************************************************************************/
voidMedianFilter(BYTE *bmp,LONG width,LONG height);
voidMyProcess::MedianFilter(BYTE *bmp,LONG width,LONG height)
{
LONG i,j;
//申请一个临时空间,由1包围bmp图像,方便进行模版处理
BYTE *temp_bmp =new BYTE[(width+6)*(height+2)];
BmpFilter(temp_bmp,bmp,width,height);
//中值滤波
//待排序值
int value[9];
for(i=1;i<height+1;i++)
for(j=3;j<width+3;j++)
{
LONG k,m,temp=0;
for(k=-1;k<2;k++)
for(m=-1;m<2;m++)
{
value[(k+1)*3+(m+1)]= temp_bmp[(i+k)*(width+6)+j+m*3];
}
sort(value,value+9);
//
//此处注意,不应将值给待处理对象,而应传给未处理的原图像
// temp_bmp[i*(width+6)+j] = (BYTE)temp;
bmp[(i-1)*width+j-3]= value[4];
}
delete[] temp_bmp;
}
//浮雕效果模版 下标7到13
{-1,0,0,
0,0,0,
0,0,1,
1,3
},
{1,0,0,
0,0,0,
0,0,-1,
1,3
},
{0,0,-1,
0,0,0,
1,0,0,
1,3
},
{0,0,1,
0,0,0,
-1,0,0,
1,3
},
{-1,0,-1,
0,0,0,
1,0,1,
1,3
},
{-1,0,1,
0,0,0,
1,0,-1,
1,3
},
{1,0,1,
0,0,0,
-1,0,-1,
1,3
},
{1,0,-1,
0,0,0,
-1,0,1,
1,3
}
voidMyProcess::KernelFilter(BYTE *bmp,LONG width,LONG height,KERNEL kernel,int type)
{
LONG i,j;
//申请一个临时空间,由1包围bmp图像,方便进行模版处理
BYTE *temp_bmp =new BYTE[(width+6)*(height+2)];
BmpFilter(temp_bmp,bmp,width,height);
//模版滤波
for(i=1;i<height+1;i++)
for(j=3;j<width+3;j++)
{
LONG k,m,temp=0;
for(k=-1;k<kernel.Dimention-1;k++)
for(m=-1;m<kernel.Dimention-1;m++)
{
int a = temp_bmp[(i+k)*(width+6)+j+m*3];
int b = kernel.Element[k+1][m+1];
temp+=a*b;
}
temp/=kernel.Divisor;
//
//此处注意,不应将值给待处理对象,而应传给未处理的原图像
// temp_bmp[i*(width+6)+j] = (BYTE)temp;
if(type==1)
{
temp = max(0,min(temp+128,255));
}
bmp[(i-1)*width+j-3]= temp;
}
delete[] temp_bmp;
}