原创 图像处理系列2:均值滤波

2009-3-8 02:19 3899 6 6 分类: 软件与OS
 


对于图像的滤波,最多的是均值滤波,中值滤波,高斯滤波,关于滤波的操作
可以参看这个文件:点击下载

还可以擦没考的资源,网上很多,我个人觉得不错的:

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;
}


也可以使用模板操作,这里不多说了


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /3 下一条