对于图像的滤波,最多的是均值滤波,中值滤波,高斯滤波,关于滤波的操作
可以参看这个文件:
还可以擦没考的资源,网上很多,我个人觉得不错的:
http://hi.baidu.com/liujianz/blog/index/1
Sun Mar 08 2009
其实这些都是 基于模板的操作,只要你会了一样,其他的也就会了,不过在对图像操作的时候要记住:
1.图像的像素值在文件中的存放顺序为从左到右,从下到上,也就是说,在BMP文件中首先存放的是图像的
最后一行像素,最后才存储图像的第一行像素,但对与同一行的像素,则是按照先左边后右边的的顺序存储的
2.文件存储图像的每一行像素值时,如果存储该行像素值所占的字节数为4的倍数,则正常存储否则,需要在后端补0,凑足4的倍数以字节为单位的每行长度始终是4的倍数。行的长度可以计算为:
RowLength = 4 * ((bmch.bcWidth * bmch.bcBitCount + 31) / 32) ; 如果需要,可通过在右边补充行(通常是用零)来完成长度。图素数据的总字节数等于RowLength和bmch.bcHeight的乘积。
3.这些模板的意思可以从不同的角度去解释,可以使用频域的知识,也可以使用统计学的知识,不同的模板有不同用处。模板不是固定不变的,个人认为根据需要可以调整模板中值的分布,这样可以得到的不同的效果。
下面试我的代码(待完善);
//**********************************************************************
//平滑滤波函数
//pbmpinfo:图像信息头
//pbmpdata:图像数据
//smoothrect:模板的大小,必须是计数x奇数
//**********************************************************************
BOOL ImgSmooth_blur(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,CSize smoothrect)
{
LONG imagewidth=pbmpinfo->bmiHeader.biWidth;
LONG imageheigth=pbmpinfo->bmiHeader.biHeight;
LONG template_width = (smoothrect.cx-1)/2;
LONG template_height = (smoothrect.cy-1)/2;
LONG i=0,j=0,k=0,heigth=0,width=0;
//data is not null
if (pbmpdata == NULL)
{
return FALSE;
}
//image size
if (imageheigth <= smoothrect.cy || imagewidth <= smoothrect.cx)
{
return FALSE;
}
//color must be gray
if (pbmpinfo->bmiHeader.biBitCount != 8)
{
AfxMessageBox("只对灰度图像进行操作!");
return FALSE;
}
//template must be odd x odd
if ( !template_width || !template_height)
{
return FALSE;
}
//template
DOUBLE coef = ((DOUBLE)1/(DOUBLE)(smoothrect.cx*smoothrect.cy));
//int *template_box=(int*)malloc(smoothrect.cx*smoothrect.cy*sizeof(int));
//memset(template_box,1,smoothrect.cx*smoothrect.cy);
int *template_box=new int[smoothrect.cx*smoothrect.cy];
for (i=0;i<smoothrect.cx*smoothrect.cy;i++)
{
template_box
=1;
}
//image size
LONG Linebyte =( pbmpinfo->bmiHeader.biBitCount * imagewidth +31)/32*4;
LONG ImageSize=Linebyte * imageheigth;
//分配空间
BYTE *pNewbmpdata=(BYTE*)malloc(ImageSize);
//copy data
if (pNewbmpdata == NULL)
{
delete []template_box;
return FALSE;
}
memcpy(pNewbmpdata,pbmpdata,ImageSize);
BYTE *psrc=NULL;
BYTE *pdest=NULL;
LONG tempnum=0;
//计算区域是:begin~image-begin-1 1~image-2
for (heigth = template_height ; heigth < imageheigth - template_height ;heigth++ )
{
for ( width = template_width ; width < imagewidth - template_width ; width++)
{
psrc = (unsigned char *)pbmpdata+(ImageSize-Linebyte-
heigth*Linebyte)+width;
pdest = (unsigned char *)pNewbmpdata+(ImageSize-Linebyte-
heigth*Linebyte)+width;
j=0;
tempnum=0;
for ( i = - template_height ; i < template_height + 1 ;i++)
{
for (k = - template_width ; k < template_width + 1 ;k++)
{
tempnum += (LONG)(*(psrc + i * Linebyte + k)) * template_box[j++];
}
}
tempnum = (LONG)(tempnum*coef);
if (tempnum>255)
{
tempnum=255;
}
if (tempnum<0)
{
tempnum=0;
}
*pdest=(unsigned char)tempnum;
}
}
memcpy(pbmpdata,pNewbmpdata,ImageSize);
free(pNewbmpdata);
delete []template_box;
return TRUE;
}
也可以使用模板操作,这里不多说了
文章评论(0条评论)
登录后参与讨论