这个是实现将一个图片进行轮廓提取的算法
就是不知道这个算法到底能不能执行,有错了没有,因为本人不会VC++,可是这个算法对我来说很有用,有没有人还会把它转换成C#的呢?**************************************
函数名称:
ContourDIB();
参数:
LPSTR lpDIBBits -指向原DIB图象指针
LONG lWidth -原图象宽度(像素,必须是4的倍数)
LONG lHeidht -原图象高度(像素数)
返回值:
BOOL -运算成功返回true,否则返回flase
说明:
该函数用于对图象进行轮廓提取运算
要求目标图象为只有0和255两个灰度图象
*****************************************
BOOL WINAPI ContourDIB(LPSTR lpDIBBits,LONG lWidth,LONG lHeight)
{
//指向原图象的指针
LPSTR lpSrc;
//指向缓存图象的指针
LPSTR lpDst;
//指向缓存DIB图象的指针
LPSTR lpNewDIBBits;
HLOCAL hNewDIBBits;
//循环变量
long i;
long j;
unsigned char n,e,s,w,ne,se,nw,sw;
//像素值
unsigned char pixel;
//暂时分配内存,以保存新图象
hNewDIBBits=LocalAlloc(LHND,lWidth*lHeight);
if(hNewDIBBits==NULL)
{
return FALSE;
}
lpNewDIBBits=(char *)LocalLock(hNewDIBBits);
//初始化新分配的内存,设定初始值为255
lpDst=(char *)lpNewDIBBits;
memset(lpDst,(byte)255,lWidth*lHeight);
for(j=1;j<lHeight-1;j++)
{
for(i=1;i<lWidth-1;i++)
{
//指向原图象倒数第J行,第I个像素的指针
lpSrc=(char *)lpDIBBits+lWidth*j+i;
//指向目标图象倒数第J行,第I个像素的指针
lpDst=(char *)lpNewDIBBits+lWidth*j+i;
//取得当前指针处的像素值,注意要转换为unsigned char型
pixel=(unsigned char)* lpSrc;
if(pixel==0)
{
*lpDst=(unsigned char)0;
nw=(unsigned char)*(lpSrc+lWidth-1);
n=(unsigned char)*(lpSrc+lWidth);
ne=(unsigned char)*(lpSrc+lWidth+1);
w=(unsigned char)*(lpSrc-1);
e=(unsigned char)*(lpSrc+1);
sw=(unsigned char)*(lpSrc+lWidth-1);
s=(unsigned char)*(lpSrc+lWidth);
se=(unsigned char)*(lpSrc+lWidth+1);
//如果相邻的8个点都是黑点
if(nw+n+ne+w+e+sw+s+se==0)
*lpDst=(unsigned char)255;
}
}
//复制运算后的图象
memcpy(lpDIBBits,lpNewDIBBits,lWidth*lHeight);
//释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
//返回
return TRUE;
}