您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 股票报告 > 二值图像连通域标记算法与代码 收藏
二值图像连通域标记算法与代码收藏10:19:42二值图像连通域标记算法与代码这里列举二值图像连通域标记算法包括直接扫描标记算法和二值图像连通域标记快速算法一、直接扫描标记算法把连续区域作同一个标记,常见的四邻域标记算法和八邻域标记算法。1、四邻域标记算法:1)判断此点四邻域中的最左,最上有没有点,如果都没有点,则表示一个新的区域的开始。2)如果此点四邻域中的最左有点,最上没有点,则标记此点为最左点的值;如果此点四邻域中的最左没有点,最上有点,则标记此点为最上点的值。3)如果此点四邻域中的最左有点,最上都有点,则标记此点为这两个中的最小的标记点,并修改大标记为小标记。2、八邻域标记算法:1)判断此点八邻域中的最左,左上,最上,上右点的情况。如果都没有点,则表示一个新的区域的开始。2)如果此点八邻域中的最左有点,上右都有点,则标记此点为这两个中的最小的标记点,并修改大标记为小标记。3)如果此点八邻域中的左上有点,上右都有点,则标记此点为这两个中的最小的标记点,并修改大标记为小标记。4)否则按照最左,左上,最上,上右的顺序,标记此点为四个中的一个。代码实现:#includelist#includevector#includealgorithm//连通区域属性结构typedefstructtagMarkRegion{std::listPOINTMarkPointList;//点列表RECTrect;}MarkRegion;//定义MarkMap结构,用来存放等价对typedefstructtagEqualMark{intMarkValue1;//标记值intMarkValue2;//标记值}EqualMark;//定义MarkMapping结构,用来存放标记映射关系typedefstructtagMarkMapping{intnOriginalMark;//第一次扫描的标记intnMappingMark;//等价整理之后对应标记}MarkMapping;/*功能说明:八连通标记参数说明:I,表示图像数据指针ImageWidth,表示图像宽ImageHeight,表示图像高off,表示偏移量nFlag,表示指定标记iColorType,表示颜色类型,(黑点,白点)markInfo,表示连通区域属性信息返回值:连通点数量,int类型*/intFillAreaFlag33(LPINTI,intImageWidth,intImageHeight,longoff,intnFlag,intiColorType,MarkRegion&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;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.left)rect.left=x;if(xrect.right)rect.right=x;if(yrect.bottom)rect.bottom=y;if(yrect.top)rect.top=y;}else{return0;}for(i=y;iImageHeight;i++){bNew=false;yMin=i;for(j=0;jImageWidth;j++){offset=i*ImageWidth+j;if(I[offset]==nFlag){for(k=0;k8;k++)//八邻域搜索{if(i==0&&k=2)continue;if(i==ImageHeight-1&&k=5)continue;if(j==0&&(k==0||k==3||k==5))continue;if(j==ImageWidth-1&&(k==2||k==4||k==7))continue;offtemp=offset+dxy[k];if(I[offtemp]==iColorType&&I[offtemp]!=nFlag){I[offtemp]=nFlag;nDot++;m=offtemp/ImageWidth;n=offtemp%ImageWidth;ptTmp.x=n;ptTmp.y=m;markInfo.MarkPointList.push_back(ptTmp);if(nrect.left)rect.left=n;if(nrect.right)rect.right=n;if(mrect.bottom)rect.bottom=m;if(mrect.top)rect.top=m;y=offtemp/ImageWidth;if(y=yMin){yMin=y;if(!bNew)bNew=true;}}}}}if(bNew){i=yMin-1;}}markInfo.rect.left=rect.left;markInfo.rect.right=rect.right;markInfo.rect.top=rect.top;markInfo.rect.bottom=rect.bottom;returnnDot;}/*功能说明:四连通标记参数说明:I,表示图像数据指针ImageWidth,表示图像宽ImageHeight,表示图像高off,表示偏移量nFlag,表示指定标记iColorType,表示颜色类型,(黑点,白点)markInfo,表示连通区域属性信息返回值:连通点数量,int类型*/intFillAreaFlag22(LPINTI,intImageWidth,intImageHeight,longoff,intnFlag,intiColorType,MarkRegion&markInfo){boolbNew;RECTrect;intm,n,i,j,k,nDot=1,offset,offtemp,yMin;intdxy[4],x,y;dxy[0]=-ImageWidth;dxy[1]=1;dxy[2]=ImageWidth;dxy[3]=-1;rect.left=65535;rect.right=-1;rect.bottom=65535;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.left)rect.left=x;if(xrect.right)rect.right=x;if(yrect.bottom)rect.bottom=y;if(yrect.top)rect.top=y;}else{return0;}for(i=y;iImageHeight;i++){bNew=false;yMin=i;for(j=0;jImageWidth;j++){offset=i*ImageWidth+j;if(I[offset]==nFlag){for(k=0;k4;k++)//四邻域搜索{if(i==0&&k==0)continue;if(i==ImageHeight-1&&k==2)continue;if(j==0&&k==3)continue;if(j==ImageWidth-1&&k==1)continue;offtemp=offset+dxy[k];if(I[offtemp]==iColorType&&I[offtemp]!=nFlag){I[offtemp]=nFlag;nDot++;m=offtemp/ImageWidth;n=offtemp%ImageWidth;ptTmp.x=n;ptTmp.y=m;markInfo.MarkPointList.push_back(ptTmp);if(nrect.left)rect.left=n;if(nrect.right)rect.right=n;if(mrect.bottom)rect.bottom=m;if(mrect.top)rect.top=m;y=offtemp/ImageWidth;if(y=yMin){yMin=y;if(!bNew)bNew=true;}}}}}if(bNew){i=yMin-1;}}markInfo.rect.left=rect.left;markInfo.rect.right=rect.right;markInfo.rect.top=rect.top;markInfo.rect.bottom=rect.bottom;returnnDot;}二、二值图像连通域标记快速算法算法描述首先,在进行标记算法以前,利用硬件开辟独立的图像标记缓存和连通关系数组,接着在视频流的采集传输过程中,以流水线的方式按照视频传输顺序对图像进行逐行像素扫描,然后对每个像素的邻域分别按照逆时针方向和水平方向进行连通性检测和等价标记关系合并,检测出的结果对标记等价数组和标记缓存进行更新,在一帧图像采集传输结束后,得到图像的初步标记结果以及初步标记之间的连通关系,最后,根据标号对连通关系数组从小到大的传递过程进行标号的归并,利用归并后的连通关系数组对图像标记缓存中的标号进行替换,替换后的图像为最终标记结果,并且连通域按照扫描顺序被赋予唯一的连续自然数。图1标记算法流程本文快速二值图像连通域标记算法分为三个环节:1.图像初步标记:为每个像素赋予临时标记,并且将临时标记的等价关系记录在等价表中2.整理等价表:这一环节分为两个步骤:(1)将具有等价关系的临时标记全部等价为其中的最小值;(2)对连通区域以自然数顺序重新编号,得到临时标记与最终标记之间的等价关系。3.图像代换:对图像进行逐像素代换,将临时标记代换为最终标记.经过3个环节处理后,算法输出标记后的图像,图像中连通域按照由上到下,由左至右出现的顺序被标以连续的自然数。代码实现:#includelist#includevector#includealgorithm//连通区域属性结构typedefstructtagMarkRegion{std::listPOINTMarkPointList;//点列表RECTrect;}MarkRegion;//定义MarkMap结构,用来存放等价对typedefstructtagEqualMark{intMarkValue1;//标记值intMarkValue2;//标记值}EqualMark;//定义MarkMapping结构,用来存放标记映射关系typedefstructtagMarkMapping{intnOriginalMark;//第一次扫描的标记intnMappingMark;//等价整理之后对应标记}MarkMapping;/*功能说明:将所选出的等价关系,attach到list上里参数说明:pEqualMark等价关系num1新的等价关系1num2新的等价关
本文标题:二值图像连通域标记算法与代码 收藏
链接地址:https://www.777doc.com/doc-4358958 .html