//***************************************************************/
/*函数名称:Lunkuotiqu()
/*函数类型:void
/*功能:对图像进行轮廓提取。
/***************************************************************/
void BingXingBianJieDib::Lunkuotiqu()
{
LPBYTE p_data ; //原图数据区指针
int wide,height; //原图长、宽
// 指向源图像的指针
LPBYTE lpSrc;
// 指向缓存图像的指针
LPBYTE lpDst;
// 指向缓存DIB图像的指针
LPBYTE temp;
//循环变量
long i;
long j;
unsigned char n1,n2,n3,n4,n5,n6,n7,n8;
//像素值
unsigned char pixel;
// 暂时分配内存,以保存新图像
p_data=GetData();
wide=GetWidth();
height=GetHeight();
temp = new BYTE[wide * height];
for (j=0;j<height;j++)
{
for(i=0;i<wide;i++)
{
lpSrc = (LPBYTE)p_data + wide * j + i;
if(*lpSrc>127)
*lpSrc=255;
else
*lpSrc=0;
}
}
// 初始化新分配的内存,设定初始值为255
memset(temp, 255, wide * height);
for(j = 1; j <height-1; j++)
{
for(i = 1;i <wide-1; i++)
{
// 指向源图像倒数第j行,第i个象素的指针
lpSrc = (LPBYTE)p_data + wide * j + i;
// 指向目标图像倒数第j行,第i个象素的指针
lpDst = (LPBYTE)temp + wide * j + i;
//取得当前指针处的像素值,注意要转换为unsigned char型
pixel = (unsigned char)*lpSrc;
if(pixel == 0)
{
*lpDst = (unsigned char)0; //先赋黑
n1 = (unsigned char)*(lpSrc + wide -1);
n2 = (unsigned char)*(lpSrc + wide );
n3 = (unsigned char)*(lpSrc + wide +1);
n4 = (unsigned char)*(lpSrc -1);
n5= (unsigned char)*(lpSrc +1);
n6 = (unsigned char)*(lpSrc - wide -1);
n7 = (unsigned char)*(lpSrc - wide );
n8 = (unsigned char)*(lpSrc - wide +1);
//如果相邻的八个点都是黑点,则中心点赋白
if(n1+n2+n3+n4+n5+n6+n7+n8==0)
{
*lpDst = (unsigned char)255;
}
}
}
}
// 复制腐蚀后的图像
memcpy(p_data,temp, wide * height);
// 释放内存
delete temp;
}