原创
(原创)图像处理学习系列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);
文章评论(0条评论)
登录后参与讨论