原创 (原创)图像处理学习系列2:模板操作

2009-3-16 21:51 3262 6 6 分类: 软件与OS


其实,图像处理中很多情况下使用的是 模板的操作,不同的情况使用不同的模板,至少在早期的图像爱那个处理理论上面是这样。图像处理中很多东西都是不确定那个的,要更隽具体的情况具体分析。

掌握模板的操作,其实对于一些处理可以直接调用就可以了。

下面是我的代码;
//**********************************************************************
//模板操作
//图像信息头
//图像数据
//模板大小       以0开始
//模板中心元素   以0开始
//模板数据
//模板系数
//**********************************************************************
BOOL ImgTemplate(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,CSize TemplateSize,CSize TemplateCertel ,int *template_box,float coef)
{

    LONG imagewidth=pbmpinfo->bmiHeader.biWidth;
    LONG imageheigth=pbmpinfo->bmiHeader.biHeight;

        LONG i=0,j=0,k=0,heigth=0,width=0;

    //data is not null
    if (pbmpdata == NULL)
    {
        return FALSE;
    }
    //image size
    if (imageheigth <= TemplateSize.cy || imagewidth <= TemplateSize.cx)
    {
        return FALSE;
    }
    if (TemplateCertel.cx < 0 ||  TemplateCertel.cy < 0 || TemplateCertel.cx > TemplateSize.cx || TemplateCertel.cy > TemplateSize.cy)
    {
       return FALSE;
    }
    //color must be gray
    if (pbmpinfo->bmiHeader.biBitCount != 8)
    {
            AfxMessageBox("只对灰度图像进行操作!");
        return FALSE;
    }
    //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)
    {
   
        return FALSE;
    }
   
    memcpy(pNewbmpdata,pbmpdata,ImageSize);

   
    BYTE *psrc=NULL;
    BYTE *pdest=NULL;
       
    LONG result=0;


    for (heigth = TemplateCertel.cy ; heigth < imageheigth - TemplateSize.cy + TemplateCertel.cy + 1  ;heigth++  )
    {
               
        for ( width = TemplateCertel.cx ; width < imagewidth - TemplateSize.cx + TemplateCertel.cx + 1 ; width++)
        {
            psrc  = (unsigned char *)pbmpdata+(ImageSize-Linebyte-
                heigth*Linebyte)+width;
           
            pdest = (unsigned char *)pNewbmpdata+(ImageSize-Linebyte-
                heigth*Linebyte)+width;

            j=0;
            result=0;

            for ( i =  - TemplateCertel.cy ; i <  TemplateSize.cy - TemplateCertel.cy   ;i++)
            {
                for (k =  - TemplateCertel.cx ; k <  TemplateSize.cx -TemplateCertel.cy  ;k++)
                {
                            result += (LONG)(*(psrc + i * Linebyte + k)) * template_box[j++];
                }
            }

                        result = (LONG)(result  *  coef);

            if (result>255)
            {
                result=255;
            }
            if (result<0)
            {
                result=0;
            }
            *pdest=(unsigned char)result;
           
        }
    }   
    memcpy(pbmpdata,pNewbmpdata,ImageSize);
    free(pNewbmpdata);
    return TRUE;
}

下面是一个拉普拉斯锐化的例子:
int template_box_LH8[9]={0,1,0,1,-4,1,0,1,0};
ImgTemplate(pbmpinfo, pbmpdata,CSize(3,3),CSize(1,1),template_box_LH8,1);

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /1 下一条