资源描述:
《二值图像连通域标记算法与代码 收藏》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、二值图像连通域标记算法与代码收藏10:19:42二值图像连通域标记算法与代码这里列举二值图像连通域标记算法包括直接扫描标记算法和二值图像连通域标记快速算法一、直接扫描标记算法把连续区域作同一个标记,常见的四邻域标记算法和八邻域标记算法。1、四邻域标记算法:1)判断此点四邻域中的最左,最上有没有点,如果都没有点,则表示一个新的区域的开始。2)如果此点四邻域中的最左有点,最上没有点,则标记此点为最左点的值;如果此点四邻域中的最左没有点,最上有点,则标记此点为最上点的值。3)如果此点四邻域中的最左有点,最上都有点,则标记此点为这两个中的最小
2、的标记点,并修改大标记为小标记。2、八邻域标记算法:1)判断此点八邻域中的最左,左上,最上,上右点的情况。如果都没有点,则表示一个新的区域的开始。2)如果此点八邻域中的最左有点,上右都有点,则标记此点为这两个中的最小的标记点,并修改大标记为小标记。3)如果此点八邻域中的左上有点,上右都有点,则标记此点为这两个中的最小的标记点,并修改大标记为小标记。4)否则按照最左,左上,最上,上右的顺序,标记此点为四个中的一个。代码实现:#include#include#include//连通区域属性
3、结构typedefstructtagMarkRegion{std::listMarkPointList;//点列表RECTrect;}MarkRegion;//定义MarkMap结构,用来存放等价对typedefstructtagEqualMark{intMarkValue1;//标记值intMarkValue2;//标记值}EqualMark;//定义MarkMapping结构,用来存放标记映射关系typedefstructtagMarkMapping{intnOriginalMark;//第一次扫描的标记intnMa
4、ppingMark;//等价整理之后对应标记}MarkMapping;/*功能说明:八连通标记参数说明:I,表示图像数据指针ImageWidth,表示图像宽ImageHeight,表示图像高off,表示偏移量nFlag,表示指定标记iColorType,表示颜色类型,(黑点,白点)markInfo,表示连通区域属性信息返回值:连通点数量,int类型*/intFillAreaFlag33(LPINTI,intImageWidth,intImageHeight,longoff,intnFlag,intiColorType,MarkRegi
5、on&markInfo){boolbNew;RECTrect;intm,n,i,j,k,nDot=1,offset,offtemp,yMin;intdxy[8],x,y;dxy[0]=-ImageWidth-1;dxy[1]=-ImageWidth;dxy[2]=-ImageWidth+1;dxy[3]=-1;dxy[4]=1;dxy[5]=ImageWidth-1;dxy[6]=ImageWidth;dxy[7]=ImageWidth+1;rect.left=65535;rect.right=-1;rect.bottom=65535
6、;rect.top=-1;markInfo.MarkPointList.clear();POINTptTmp;if(I[off]==iColorType&&I[off]!=nFlag)//黑点同时未被标记的情况{I[off]=nFlag;x=off%ImageWidth;y=off/ImageWidth;ptTmp.x=x;ptTmp.y=y;markInfo.MarkPointList.push_back(ptTmp);if(xrect.right)rect.right=x;i
7、f(yrect.top)rect.top=y;}else{return0;}for(i=y;i=5)continue;if(j
8、==0&&(k==0
9、
10、k==3
11、
12、k==5))continue;if(j==ImageWidth-1&&(k==2
13、
14、k==4
15、
16、k==7))continue;offtemp=offset+dxy[k];if(I[of