轮廓提取

来源:互联网 发布:vnc viewer for mac 编辑:程序博客网 时间:2024/05/18 18:55


//***************************************************************/           /*函数名称:Lunkuotiqu()                                      /*函数类型:void                                     /*功能:对图像进行轮廓提取。            /***************************************************************/ void BingXingBianJieDib::Lunkuotiqu(){    LPBYTE  p_data ;     //原图数据区指针int wide,height;    //原图长、宽// 指向源图像的指针LPBYTElpSrc;// 指向缓存图像的指针LPBYTElpDst;// 指向缓存DIB图像的指针LPBYTEtemp;//循环变量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;}}// 初始化新分配的内存,设定初始值为255memset(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; }


原创粉丝点击