




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、二值图像连通域标记算法与代码这里列举二值图像连通域标记算法包括直接扫描标记算法和二值图像连通域标记快速算法一、直接扫描标记算法把连续区域作同一个标记,常见的四邻域标记算法和八邻域标记算法。1、四邻域标记算法:1)判断此点四邻域中的最左,最上有没有点,如果都没有点,则表示一个新的区域的开始。2)如果此点四邻域中的最左有点,最上没有点,则标记此点为最左点的值;如果此点四邻域中的最左没有点,最上有点碎,则标记此点为最上点的值桑。3)如果此点四邻桑域中的最左有点,最上都有桑点,则标记此点为这两个中桑的最小的标记点,并修改大顺标记为小标记。2、八顺邻域标记算法:1)顺判断此点八邻域中的最左,顺左上,最上
2、,上右点的情况顺。 如果都没有点,则表示顺一个新的区域的开始。2)汪如果此点八邻域中的汪最左有点,上右都有点,则汪标记此点为这两个中的最小汪的标记点,并修改大标记为汪小标记。3)如果此剃点八邻域中的左上有点,上剃右都有点,则标记此点为这剃两个中的最小的标记点,并剃修改大标记为小标记。4)剃否则按照最左,左上剃,最上,上右的顺序,标记妹此点为四个中的一个。代码妹实现:#include妹#inclu少de#少include拓orithm/连通区拓域属性结构typedef拓structtagM乞arkRegionst乞d:listMarkPoint侣List;/点列表RE侣CTrect;Mar乔kR
3、egion;/定乔义MarkMap结构,乔用来存放等价对typed扫efstructta扫gEqualMark扫intMarkV枝alue1;/枝标记值intMarkV枝alue2;/枝标记值EqualMa袖rk;/定义Mark袖Mapping结构,用袖来存放标记映射关系typ许edefstruct许tagMarkMappi许ngintn沾OriginalMark沾;/第一次扫描的沾标记intnMappi宏ngMark;/等汉价整理之后对应标记M汉arkMapping;汉/*功能说明:八连通标记汉参数说明:I,表示图像数怖据指针怖ImageWidth怖,表示图像宽怖ImageHe怖ight,表
4、示图像高技off技,表示偏移量技nFlag,表示技指定标记技iColorTyp拓e,表示颜色类型,(黑点拓,白点)拓markInfo,拓表示连通区域属性信息返回拓值:连通点数量,int类拓型*/intFillA亮reaFlag33(LP亮INTI,intIm寿ageWidth,int寿ImageHeight寿,longoff,in寿tnFlag,int仍iColorType,M仍arkRegion&m仍arkInfo)仍boolbNew;适RECTre适ct;int适m,n,i,j,k,nD瞎ot=1,offset,瞎offtemp,yMin瞎;intdx两y8,x,y;两dxy0=-Im两a
5、geWidth-1;雀dxy1=-雀ImageWidth;雀雀dxy2=雀-ImageWidth+聂1;dxy3聂=-1;聂聂聂盛盛盛盛dxy4盛=1;dxy塔5=ImageWidt塔h-1;d塔xy6=ImageW塔idth;破dxy7=Im破ageWidth+1;破rect.lef破t=65535;rec塞t.right=-1;塞rect.bot塞tom=65535;亮rect.top=-1亮;markInf亮o.MarkPointL涟ist.clear();巫POINTp巫tTmp;if侣(Ioff=iCo侣lorType&I侣off!=nFlag侣)/黑点同时未被标记的破情况破Ioff
6、=破nFlag;砰x=off%Ima砰geWidth;砰y=off/I停mageWidth;停ptTmp停.x=x;妹ptTmp.y妹=y;仟markInfo.Ma仟rkPointList.仟push_back(pt楞Tmp);楞if(xrec岂t.right)破re浑ct.right=x;汾if(y汾rect.翻top)估rect.t估op=y;估else逛r逛eturn0;逛for(版i=y;iImage版Height;i+)版扮bNew=fals扮e;y扮Min=i;焚for(j=0;焚j=5)洲洲cont洲inue;洲洲if(j=0虚k=0 |虚k=3 |k=5虚)虚虚contin贞u
7、e;贞贞if(j=Imag贞eWidth贞(k=2 |k=抑4 |k=7)蝇艺艺continue;艺艺o艺fftemp=offse艺t+dxyk;铀铀if(I铀offtemp=i铀ColorType铀Iofftemp!只=nFlag)只只只只I只offtemp=nF珍lag;珍珍nDot珍+;珍珍m=off珍temp/ImageWi须dth;须须n=of须ftemp%ImageW须idth;葬葬ptT葬mp.x=n;葬葬葬ptTmp.y=m葬;各各markInf各o.MarkPointL各ist.push_bac各k(ptTmp);各蹿蹿if(nrect.right痴)痴昏re昏ct.righ
8、t=n;昏昏昏if(mrect瑚.top)瑚瑚瑚rect.top=m瑚;瑚艰y=offte贩mp/ImageWidt贩h;贩贩if(y贩yMin)会会会会会yMin=会y;会舵i舵f(!bNew)舵舵舵bNe舵w=true;舵额额额额额额额构if(bNe构w)构构i=yMin-1;构构mark国Info.rect.le国ft=rect.le国ft;mark国Info.rect.ri计ght=rect.r计ight;ma计rkInfo.rect.计top=rect.t计op;mark颗Info.rect.bo颗ttom=rect.颗bottom;颗returnnDot;颗/*功能说明:四连通贩标
9、记参数说明:I,表示图贩像数据指针ImageWi贩dth,表示图像宽Ima贩geHeight,表示图贩像高off,表示偏移量n贩Flag,表示指定标记i揩ColorType,表示揩颜色类型,(黑点,白点)揩markInfo,表示连揩通区域属性信息返回值:连揩通点数量,int类型*/揩intFillArea怖Flag22(LPINT怖I,intImage怖Width,intIm怖ageHeight,lo怖ngoff,intn饺Flag,intiCo饺lorType,Mark饺Region&mark饺Info)b饺oolbNew;姐RECTrect;姐intm,n姐,i,j,k,nDot=姐1,o
10、ffset,off各temp,yMin;各intdxy4各,x,y;d各xy0=-Image各Width;d吵xy1=1;吵吵dxy2=吵ImageWidth;吵dxy3=吵-1;rect缝.left=65535;缝rect.right=缝-1;rect缝.bottom=6553缝5;rect.to蚕p=-1;ma蚕rkInfo.MarkP蚕ointList.cle蚕ar();PO蚕INTptTmp;睹if(Ioff睹=iColorType睹&Ioff!=排nFlag)/黑点同时排未被标记的情况悯I悯off=nFlag;悯x=of悯f%ImageWidth悯;y=添off/ImageWid添t
11、h;添ptTmp.x=x;添ptT桑mp.y=y;桑markIn桑fo.MarkPoint桑List.push_ba桑ck(ptTmp);桶if(x桶rect.left)桶桶rect.left=x;桶if(桑xrect.right桑)桑rect.righ桑t=x;瓤if(y晓rect.top)晓r晓ect.top=y;晓els晓e晓return0晓;晓for(i=y;i晓ImageHeight;缮i+)缮bNew缮=false;缮yMin=i;凌for(凌j=0;jImage凌Width;j+)凌零o裸ffset=i*Imag裸eWidth+j;裸i裸f(Ioffset=裸=nFlag)聋聋聋
12、for(k=0聋;krect.泪right)泪泪泪rect.righ泪t=n;泪微if(m微楞rect.top)楞楞拓rect.拓top=m;僵僵y=僵offtemp/Imag僵eWidth;僵僵i滇f(y=yMin)滇滇滇滇滇滇yMin=y;蹿蹿蹿if(!bNew蹿)蹿蹿蹿bNew=true;滇滇滇滇滇滇滇募募i募f(bNew)募岂i=yMi岂n-1;岂岂markInfo.re岂ct.left=re位ct.left;位markInfo.re位ct.right=r位ect.right;哦markInfo.哦rect.top=r哦ect.top;哦markInfo.re哦ct.bottom=束r
13、ect.bottom;束return束nDot;二、二值束图像连通域标记快速算法算束法描述首先,在进行标鹿记算法以前,利用硬件开辟鹿独立的图像标记缓存和连通鹿关系数组,接着在视频流的鹿采集传输过程中,以流水线鹿的方式按照视频传输顺序对鹿图像进行逐行像素扫描,然鹿后对每个像素的邻域分别按鹿照逆时针方向和水平方向进鹿行连通性检测和等价标记关鹿系合并,检测出的结果对标迄记等价数组和标记缓存进行迄更新,在一帧图像采集传输迄结束后,得到图像的初步标迄记结果以及初步标记之间的迄连通关系,最后,根据标号迄对连通关系数组从小到大的迄传递过程进行标号的归并,迄利用归并后的连通关系数组迄对图像标记缓存中的标号进迄
14、行替换,替换后的图像为最迄终标记结果,并且连通域按乞照扫描顺序被赋予唯一的连乞续自然数。图1乞标记算法流程本文快禽速二值图像连通域标记算法禽分为三个环节:1.图禽像初步标记:为每个像素赋禽予临时标记,并且将临时标禽记的等价关系记录在等价表禽中2.整理等价表:这禽一环节分为两个步骤:吝(1)将具有等价关吝系的临时标记全部等价为其吝中的最小值;(吝2)对连通区域以自然数顺吝序重新编号,得到临时标记节与最终标记之间的等价关系节。3.图像代换:对图节像进行逐像素代换,将临时节标记代换为最终标记经过甲3个环节处理后,算法输出甲标记后的图像,图像中连通甲域按照由上到下,由左至右甲出现的顺序被标以连续的自甲
15、然数。代码实现:#inc甲lude#甲include吵tor#include吵吵/连通区域属性结构ty吵pedefstruct发tagMarkRegi发onstd:list发Mark发PointList;/发点列表RECTrect局;MarkRegion局;/定义MarkMa局p结构,用来存放等价对局typedefstru局cttagEqualM诀arkint诀MarkValue1;诀/标记值int诀MarkValue2;诀/标记值Eq疥ualMark;/定疥义MarkMapping疥结构,用来存放标记映射疥关系typedefst疥ructtagMark疥Mapping癸intnOrigina
16、癸lMark;/第癸一次扫描的标记intn癸MappingMark;癸/等价整理之后对应串标记MarkMapp串ing;/*功能说明:串将所选出的等价关系,at串tach到list上里参串数说明:pEq串ualMark等价俗关系num1俗新的等价俗关系1num2俗新的等俗价关系2nEq俗ualNum等价俗数组的个数pl俗EqualMark存酿放等价数组的list返回酿值:无*/templat酿evoi锚dAttachEqua锚lMark(EqualM锚ark&pEqualM锚ark,elemType锚num1,elemT锚ypenum2,in侮t&pEqualNu侮m,std:list侮侮pl
17、EqualMa侮rk)/n觅um1小的情况觅if(num1觅num2)觅if无(pEqualMark无.MarkValue1无!=num1无|无pEqualMark.M沤arkValue2!=沤num2)沤沤pEqua隆lMark.MarkVa厘lue1=num1;厘厘pEqualMark.M厘arkValue2=nu厘m2;厘/插入到数组旁中旁pEqualNum旁+;旁plEqual旁Mark.push_ba旁ck(pEqualMar添k);添添/num2小的情况添else添穷if(pEqualM穷ark.MarkValu穷e2!=num1穷穷|pEqualMar穷k.MarkValue1破
18、!=num2)破破pE破qualMark.Mar破kValue1=num2破;琉pEqualMar琉k.MarkValue2琉=num1;琉/插入琉到数组中破pEqual破Num+;破破plEqualMar破k.push_back(破pEqualMark);眠眠/*功眠能说明:快速二值图像连通眠域标记参数说明:lp眠ImgBits,表示图象眠数据区指针赁nMark赁Numbers,表示标记赁数量赁iColorTy赁pe,表示被标记颜色的值赁(,)赁nImageW赁idth,表示图象的宽赁赁nImageHeigh赁t,表示图象的高返回沃值:BOOL类型,TRU沃E,表示成功;FLASE沃,表示失
19、败*/BOOL闽MarkImage(BY闽TE*lpImgBi闽ts,int&nMa闽rkNumbers,in岂tiColorType岂,longnImage岂Width,longn岂ImageHeigt,s薯td:list &l薯istMarkData)酿BYTE*酿lpImgBitsMo酿ve=NULL;/lp酿ImgBitsMove,乔表示图象数据区偏移指针乔int*lp乔Mark=NULL;/乔/lpMark,表示标记乔数据指针int诌*lpMarkMov诌e=NULL;/l诌pMarkMove,表示诌标记数据偏移指针峙/iColorTyp峙e为目标的图像值峙longlSize=峙nI
20、mageWidth延*nImageHeigt延;lpMark延=newintlS延ize+1;训lpMarkMove=l训pMark;:训:memset(lpMa盏rk,0,(lSize+盏1)*sizeof(in盏t);in盏tnMarkValue元=1;元/*每次标元识的值,nMarkVal元ue会在后边递增,诌来表示不同的区域,从诌开始标记。*/诌intnMaxMark诌Value=0;许/记录最大的标识的值许inti,j许;许/循环控制许变量/*定妖义存放等价对的链表,其元妖素是EqualMark类妖型,定义lis妖t是为了节约存储空间。要妖使用Clist,妖应该#include妖又。
21、*/std又:listlEqual又Mark;/又/初始化图像移动指针腰lpImgBits腰Move=lpImg腰Bits;/腰*进行第一次扫描,将所得腰的等价对(EqualMa腰rk类型)加到lEqua腰lMark链表中。戌使用nMarkVal戌ue来进行每一次新的标记戌,标记之后将其值加。戌Note1:图像戌的四周像素并不会有个相邻戌的像素。这时就要根据上、戌下、左、右四种戌不同的情况做不同的寻找等佯价对的判断。N佯ote2:可以先对等价对佯进行排序,每次都保证Ma佯佯kValue2,佯这样易于管理等价对。佯Note3:在实液际工作中,连续寻找出的等液价对很容易重复,将本次找液出的等价对和
22、链液表中保存的最后一个等价对液相比较,如果不相等的话再液存入等价对链表,液这样可以大大降低链表中液等价对的重复。屹Note4:第一次扫描之喳后,nMarkValue喳-1即为nMaxMark喳Value。*/喳/*喳*喳*喳*喳*钥*蔗*/下蔗面为补充代码,完成对图像蔗的第一次扫描蔗/初始化图像数组和标识蔗数组的指针in臻tnEqualNum=局0;Equal局MarktempEqu局alMark;/局/用以暂时存放每次找到的局等价关系lpM刁arkMove=lpMa刁rk;lpIm刁gBitsMove=刁lpImgBits;魁/标记图像的订第一行、第一列的像素(只订有这一个像素)订if( *
23、lpImgB订itsMove=iCo订lorType)订发*lpMarkMove=发nMarkValue+发;发lpMarkMove+发;lpImgB发itsMove+;厄/标记图像的第厄一行,此时不会出现等价的厄情况for(厄i=1;inI厄mageWidth;i吵+)吵/需要标记吵的情况吵if( *lpImgB吵itsMove=iCo吵lorType)半半半/前面没有被标记过,则半开始一个新的标记半if半( *(lpMarkM匆ove-1)=(!iC匆olorType)匆匆匆*lpM匆arkMove=nMar樊kValue+;樊樊樊/前面被标记过,则樊跟随前一个标记樊els樊e费费*费lp
24、MarkMove=*费(lpMarkMove-费1);费鲸鲸lpMarkMove+鲸+;l鲸pImgBitsMove鲸+;鲸/除第一行之外的袖标记,此时会出现等价的关袖系for(袖j=1;jnIm袖ageHeigt;j+袖+ )窑lpImgB窑itsMove=lpIm窑gBits+j*nIma窑geWidth;窑lpMarkM窑ove=lpMark+j夷*nImageWidth浴;/言/对每行的第一个点做处理言,总体就是对图像的最左列言做处理言/只需要检视上,右上两言个点i言f( *lpImgBi选tsMove=iCol选orType)选选/选朽朽if( *(lpMar朽kMove-nImag
25、e朽Width)!=0 )朽朽朽须/跟随标记须须*lpMarkM须ove=*(lpMark须Move-nImageW须idth);寨寨if( *(lpMa寨rkMove-nImag寨eWidth)!=*(l寨pMarkMove-nI寨mageWidth+1)寨lpMark延Move-nImageW延idth+1)!=0)延延延延嫡右上等价标记嫡嫡Attac嫡hEqualMark(t嫡empEqualMark个,*(lpMarkMov个e-nImageWidt个h),*(lpMarkM个ove-nImageWi个dth+1),nEqua个lNum,lEqualM个ark);痴痴痴痴痴没有标记,此
26、时一定不会存痴在等价关系痴else痴痴痴if痴( *(lpMarkMo痴ve-nImageWid浩th+1)!=0 )浩浩浩浩*lpMark浩Move=*(lpMar盾kMove-nImage盾Width+1);盾/跟随标记盾盾盾盾憋没有标记,则开始新的标记憋憋else憋憋憋爆*lpMar碘kMove=nMarkV碘alue+;碘碘碘碘羹lpMarkMove+羹+;l羹pImgBitsMove羹+;羹/对每行的中间点做标羹颊颊 4种情况颊for(i=1颊;i=nImageW费idth-1;i+费)费费/需要标记费费if( (*lpImg疽BitsMove)=i疽ColorType)疽疽泵吁/被
27、标记过吁吁if( *(l吁pMarkMove-1)吁!=0 )吁吁镇镇*lpMarkMove=镇*(lpMarkMove镇-1);镇/跟随瘴瘴if瘴( *(lpMarkMo瘴ve-1)!=*(lpM瘴arkMove-nIma瘴geWidth蒸lpMarkMo蒸ve-nImageWid蒸th-1)!=0 )蒸蒸蒸侦侦侦上等价侦侦Atta侦chEqualMark(詹tempEqualMar詹k,*(lpMarkMo詹ve-1),*(lpMa詹rkMove-nImag詹eWidth-1),nE詹qualNum,lEqu蝇alMark);蝇蝇蝇蝇if(蝇*(lpMarkMov脏e-1)!=*(lpMa
28、脏rkMove-nImag脏eWidth脏(lpMarkMove-脏nImageWidth)拄!=0)拄拄拄拄/标记拄秀秀秀AttachEqual秀Mark(tempEqu秀alMark,*(lpM秀arkMove-1),*虚(lpMarkMove-虚nImageWidth)虚,nEqualNum,l虚EqualMark);虚虚须须i须f( *(lpMark须Move-1)!=*(l须pMarkMove-nI须mageWidth+1)瞻lpMark脉Move-nImageW脉idth+1)!=0)脉脉脉脉然然右上等价然然Att然achEqualMark然(tempEqualMa厘rk,*(lp
29、MarkM厘ove-1),*(lpM厘arkMove-nIma厘geWidth+1),n厘EqualNum,lEq厘ualMark);怜怜怜怜怜怜/未被标记过怜破else破破破破破记过汀汀if( *(lpMa汀rkMove-nImag汀eWidth-1)!=0汀)汀塞塞塞*lpMar塞kMove=*(lpMa塞rkMove-nImag塞eWidth-1);燃燃燃if( *(lp燃MarkMove-nIm燃ageWidth-1)!燃=*(lpMarkMov燃e-nImageWidt破h) & *(lpMa破rkMove-nImag破eWidth)!=0)破破破破立立立等价立立挠AttachEqu
30、alM挠ark(tempEqua挠lMark,*(lpMa挠rkMove-nImag挠eWidth-1),*(挠lpMarkMove-n挠ImageWidth),赁nEqualNum,lE赁qualMark);赁赁赁赁润if(润*(lpMarkMov润e-nImageWidt润h-1)!=*(lpMa润rkMove-nImag润eWidth闽*(lpMarkMov闽e-nImageWidt闽h+1)!=0)闽闽闽眯缮/缮缮价缮缮At迄tachEqualMar迄k(tempEqualM迄ark,*(lpMark迄Move-nImageW迄idth-1),*(lp迄MarkMove-nIm迄age
31、Width+1),运nEqualNum,lE运qualMark);运运运运运靴靴靴上未标记过靴欲else在在艺艺艺if( *(lpMa艺rkMove-nImag艺eWidth)!=0 )艺艺亚亚亚亚*lpMarkMov亚e=*(lpMarkMo亚ve-nImageWid亚th);液/跟随标记液液液if(液*(lpMarkMove液-nImageWidth峙)!=*(lpMarkM峙ove-nImageWi峙dth峙lpMarkMove-n峙ImageWidth+1峙)!=0 )织织织织织织织盏盏盏Att盏achEqualMark盏(tempEqualMa盏rk,*(lpMarkM折ove-nI
32、mageWi折dth),*(lpMar折kMove-nImage折Width+1),nEq折ualNum,lEqua折lMark);挚挚挚挚挚挚挚挚药药存在等价关系药药el药se药芝芝芝芝if(*(lp芝MarkMove-nIm芝ageWidth+1)!芝=0)睁睁睁睁睁睁*lpMarkMov睁e=*(lpMarkMo淤ve-nImageWid淤th+1);淤/跟随标记淤淤淤延延延延延未标记过,则开始新的标这记值这这e这lse这这这这这这*lpMarkMov这e=nMarkValue这+;这这这舀舀/舀舀未标记过结束舀舀/舀徐结束徐徐徐锦/ e锦lse不需要标记锦锦lpMarkMove+锦;锦
33、lpImgBits鳖Move+;鳖鳖/中间点处理的结束鳖/对每鳖行的最后一个点做处理,总半体就是对图像的最左列做处半理/半半半/需要标般记if般( (*lpImgBi般tsMove)=iCo般lorType)般焚焚/被标记过焚i焚f( *(lpMark焚Move-1)!=0 )斥斥斥*l斥pMarkMove=*(斥lpMarkMove-1斥);井if井( *(lpMarkM井ove-1)!=*(lp井MarkMove-nIm井ageWidth-1)便lpMarkM便ove-nImageWi便dth-1)!=0)便便变健健健健Attach办EqualMark(te办mpEqualMark,办*(
34、lpMarkMove办-1),*(lpMark办Move-nImageW办idth-1),nEqu囱alNum,lEqual囱Mark);囱囱囱if囱( *(lpMarkM次ove-1)!=*(lp次MarkMove-nIm次ageWidth次*(lpMarkMov次e-nImageWidt逞h)!=0)逞逞逞逞逞等价块块AttachEqual块Mark(tempEqu块alMark,*(lpM块arkMove-1),*块(lpMarkMove-劝nImageWidth)劝,nEqualNum,l劝EqualMark);劝劝女女女/未被标记过女女else女女女if( *(lp女MarkMove
35、-nIm女ageWidth-1)!女=0 )女配破*破lpMarkMove=*破(lpMarkMove-破nImageWidth-破1);淖左上淖淖if( *(lp淖MarkMove-nIm神ageWidth-1)!神=*(lpMarkMov神e-nImageWidt神h) & *(lpMa神rkMove-nImag神eWidth)!=0)忙忙忙忙忙猫破破Att破achEqualMark破(tempEqualMa破rk,*(lpMarkM亮ove-nImageWi亮dth-1),*(lpM亮arkMove-nIma亮geWidth),nEq亮ualNum,lEqua亮lMark);嫂嫂嫂嫂嫂/
36、嫂剃过剃else剃剃剃剃if(廉*(lpMarkMove廉-nImageWidth廉)!=0 )廉廉廉廉*l署pMarkMove=*(署lpMarkMove-n署ImageWidth);署费费费费/膊膊未标记过,则开始新的标膊记值膊膊else膊膊揪揪*lp揪MarkMove=nMa揪rkValue+;揪揪决额额额/额对每行的最后一个点做处理额,总体就是对图像的最左列额做处理绷/除第一行之外绷的标记的结束绷/因为在每次标记完之绷后,nMarkValue绷都会自动+/绷/所以要通过(-1)操作遍来记录所标记的最大的个数介nMaxMa介rkValue=nMar介kValue-1;介/*介*斤*达*达
37、*达*达*/*达定义双层链表的外层链表,达它的元素是一个指向内层链达表的指针。内层达链表的型别也是CptrL磋ist,其元素是标记值。厂*/CPtrL厂istexList;厂CPtrList厂*pInnerLis厂t;POSIT吵IONposExEle吵m;i吵f(lEqualMa吵rk.size() !=吵0 )膊/ pIn膊nerListAdd,每膊次向exList中添加的膊新元素膊CPtrList*p膊InnerListAdd膊=newCPtrLis得t;得ASSERT(得pInnerListAd得d!=NULL);得/*构添加第一个等价对到ex构List的第一个元素所指构向的Inner
38、List中构。*/构pInnerListA构dd-AddTail(构(void*)lEq技ualMark.fron技t().MarkValu技e1);技pInnerListA技dd-AddTail(各(void*)lEq各ualMark.fron各t().MarkValu各e2);各exList.AddT却ail( (void*却)pInnerListA却dd);却lEqualMark却.pop_front()却;/欧*定义pFindVal欧ue1和pFindVal欧ue2,存放在所有内层链欧表中找到特定值欧的某个内层链表的欧头指针,也就是外层链表的欧某个元素值。*/欧CPtrLis戍t*pF
39、indVal戍ue1=NULL;戍CPtrLi戍st*pFindVa戍lue2=NULL;觅/整理觅剩余的等价对觅while( !觅lEqualMark.e怂mpty() )遂遂p遂osExElem=exL遂ist.GetHeadP遂osition();遂隆pFindValue1=隆NULL;隆pFind隆Value2=NULL;隆隆while(p男osExElem)男男男pInn男erList=(CPtr溶List*)exLis溶t.GetAt(posE溶xElem);溶溶if(pInne溶rList-Find(亮(void*)lEq亮ualMark.fron亮t().MarkValu亮e1
40、) )亮亮亮桶pFindValu桶e1=pInnerLis桶t;桶桶桶if(pIn燃nerList-Fin燃d( (void*)l燃EqualMark.fr燃ont().MarkVa燃lue2) )燃然在在pFindVa在lue2=pInnerL在ist;在在阵exLis阵t.GetNext(po阵sExElem);阵阵酗/该等价对中两个酗值都在已经整理过的等价关酗系中酗if(pFi酗ndValue1垣pFindValue2垣)垣垣垣/当两个地址不一样垣时,对链表进行调整铡铡if(pFi铡ndValue1!=pF铡indValue2)铡铡执哟哟pFindValue1哟-AddTail(pF哟i
41、ndValue2);哟斟/*斟清除链表元素,通过ne斟w得到的CptrList斟类型,斟斟必须采用delet斟e进行删除,否则会造成内斟存泄露。*/营营POSITIO营NposDelete营=exList.Fin营d(void*)pF营indValue2);淤淤pF淤indValue2-R淤emoveAll();镇镇de镇letepFindVa镇lue2;镇镇exList.R幼emoveAt(pos幼Delete);幼幼幼幼/*幼只在已经整理过的等价关珠系中找到Value1,珠珠那么将Vaule2加到珠Value1所在的链表中珠。*/珠elseif蛀(pFindValu幽e1)幽幽幽pFind
42、Value幽1-AddTail(薛void*)lEqua薛lMark.front(薛).MarkValue2薛);薛殉else殉if(pFindV殉alue2)殉液液pFindVal液ue2-AddTail液( (void*)lE液qualMark.fro宜nt().MarkVal宜ue1);宜宜/萤*等价对中两个值在整理萤过的等价关系中都萤没有萤找到,则在exList中萤增加新元素。*/萤el佑se雁雁雁CPtrList*p雁InnerListAdd雁=newCPtrLis蓄t;蓄pIn蓄nerListAdd-蓄AddTail( (vo蓄id*)lEqualM蓄ark.front().朽Ma
43、rkValue1)朽;朽pInn朽erListAdd-A朽ddTail( (voi蒸d*)lEqualMa蒸rk.front().M蒸arkValue2);蒸蒸exLis讯t.AddTail(v讯oid*)pInner讯ListAdd);讯讯讯讯/去掉此时等价对的雍头元素雍lEqualM雍ark.pop_fron雍t();雍/ while雍( !lEqualMa癸rk.IsEmpty()癸)循环结束癸/ if ( lE敞qualMark.Get汇Count() !=0汇)语句结束el汇se汇/*等价汇对链表大小为0,说明第一汇次扫描之后没有产生等价对汇,标记已经完成。*/坑 int nMark
44、坑Region=0;坑/图像中连通区域个数坑/记录连通区域的个数坑nMarkRegio揪n = nMarkVal揪ue-1;nMark揪Numbers = nM揪arkRegion;倦if(nMarkRegi倦on=0)ret倦urn FALSE;翟/统计连通域属性信息翟MarkRegion翟*pRegionData翟= new MarkR翟egionnMarkN翟umbers+1;截for (int Mar截kNo = 0; Mar截截bers;MarkNo+截+)pReg庚ionDataMark庚No.rect.lef庚t = -1;庚pRegionData庚MarkNo.rect庚.ri
45、ght = -1庚;pRegionD昏ataMarkNo.昏rect.bottom昏= -1;pReg昏ionDataMark昏No.rect.top昏 = -1;靠pRegionData靠MarkNo.Mark靠PointList.cl靠ear();f糊糊ImageHeigt;j糊+ )lp碘MarkMove=lpM碘ark + j*nIma碘geWidth;碘碘nImageWidth;健i+ )健if ( *lpMar健kMove 0 )健if健(pRegionData父*lpMarkMove父-1.rect.lef父t = -1)腑pReg腑ionData*lpM腑arkMove-1.r
46、腑ect.left =腑i;pRe科gionData*lp科MarkMove-1.科rect.right科= i;pR科egionData*l科pMarkMove-1科.rect.bottom科= j;p沸RegionData*沸lpMarkMove-1沸.rect.top沸 = j;沸POINT ptInse沸rt;ptI沸nsert.x = i;沸ptInse沸rt.y = j;诽pRegionDa诽ta*lpMarkMo诽ve-1.MarkPo诽intList.push诽_back(ptInse诽rt);否else否POINT否ptInsert;否ptInsert否.x = i;否ptI
47、nsert.y否= j;pR荤egionData*l荤pMarkMove-1荤.MarkPointLi荤st.push_back荤(ptInsert);荤if (pRe荤gionData*lp荤MarkMove-1.荤rect.lefti)荤初pRegionDat初a*lpMarkMov初e-1.rect.le初ft = i;初if (初pRegionData初*lpMarkMove-初1.rect.righ初镀pRegio镀nData*lpMar镀kMove-1.rec镀t.right = i;镀镀if (pRegion镀Data*lpMark镀Move-1.rect镀抱pRe抱gionDa
48、ta*lp抱MarkMove-1.抱rect.top = j抱;抱if (pRegio抱nData*lpMar第kMove-1.rec第t.bottomj)第第pRegionData第*lpMarkMove第-1.rect.bot第tom = j;第良lpMark良Move+;良for(i=0;良良rs;i+)良listMarkDat良a.push_back(巷pRegionData巷i);if(巷pRegionData)巷delete巷pRegionDa巷ta;pRegio乞nData = NULL乞;乞returnTRUE乞;坞/*等价坞关系整理完成,下面建立第坞一次扫描的标记值和坞第二次
49、扫描的标记值之坞间的映射关系。*/坞intnTota乔lEqualNum=0;乔/列入等价关系的标记乔个数intn乔MarkRegion=0乔;/图像中连通区乔域个数pos署ExElem=exLis署t.GetHeadPos署ition();署while(pos森ExElem)森森pInnerList森=(CPtrList*森)exList.GetA森t(posExElem)亮;nT亮otalEqualNum亮+=pInnerLi亮st-GetCount亮();塔exList.GetNe塔xt(posExElem塔);塔nMarkRegion塔=nMaxMarkVal塔ue-nTotalEqu
50、丘alNum+exList丘.GetCount();丘/*定义第丘一次扫描和第二次扫描之间丘的映射向量,要使用vec丘tor,应该#锑锑tor并且使用std命锑名空间。*/s锑td:vector锑vMarkMap(nMa溶xMarkValue);溶/初始化映溶射向量,令其做自身映射溶for(i=溶0;iGet沂Head();只posInner只Elem=pInnerL只ist-GetHead只Position();宙pInn宙erList-GetN宙ext(posInner宙Elem);院while(院posInnerElem院)院以if( (int)以pInnerList-以GetAt(po
51、sInn许erElem)GetAt(posIn癣nerElem);斟斟斟pInnerList斟-GetNext(po索sInnerElem);索帅/*根帅据每组等价关系中的最小的帅标记值对Mapping向帅量做出调整。*/帅posInne帅rElem=pInner帅List-GetHea聋dPosition();聋whi聋le(posInne聋rElem)聋瘤nInde嗓x=(int)pInne嗓rList-GetAt嗓(posInnerEle嗓m)-1;嗓vMark楞MapnIndex楞.nMappingMa楞rk=nMin;楞pI楞nnerList-Ge楞tNext(posInn剩erEl
52、em);剩剩exList.Ge剩tNext(posExE剩lem);泽/*将映射向泽量nMappingMar泽k中不重复的部分找出并对泽其进行排序。使泽用find()和sort泽()这两种泛型算法,应该泽灶gorithm。*/灶std:vec灶torvS灶ortMark(nMar延kRegion);/延排序向量nIn延dex=0;延for(i=0;i延nMaxMarkVal拄ue;i+ )拄拄if(find(拄vSortMark.be拄gin(),vSortM嘘ark.end(),v嘘MarkMapi.n嘘MappingMark嘘)嘘=vSortMa著rk.end() )著著vS著ortMarknInd著ex+=vMark靴Mapi.nMapp靴ingMark;靴靴sort(靴vSortMark.be扬gin(),vSortM语ark.end() );语/*根据排语序后的标记在vSortM语ark向量中的位置,对映语射向量做出重新调整。*/语std:ve肘ctor:i肘teratoritFi肘nd;std:肘:vector肘:iteratori员tBegin;员itBegin=vSor员tMark.begin(员);for焉(i=0;inMaxM焉arkValue;i+焉)焉itFin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中外服装史知到课后答案智慧树章节测试答案2025年春德州学院
- 银川市重点中学2025届高三下学期教学质量监测(三模)英语试题含解析
- 新疆哈密市第十五中学2024-2025学年高三(高补班)下学期期末语文试题试卷含解析
- 吉首大学《给排水管道工程》2023-2024学年第二学期期末试卷
- 郴州思科职业学院《传热学基础》2023-2024学年第二学期期末试卷
- 江西财经大学现代经济管理学院《运筹学》2023-2024学年第二学期期末试卷
- 河北交通职业技术学院《医用生物材料C》2023-2024学年第二学期期末试卷
- 工程造价咨询依据
- 2025年卫浴柜行业现状分析:全球卫浴柜市场规模将达410亿美元
- 2025年茶饮市场分析:规模、竞争与未来展望
- 2021年无人机驾驶员考试题库及答案(完整版)
- 人教版英语四年级上册《Unit-3-My-friends》单元教学课件
- 宿舍专项检查表
- 同位素水文学研究综述
- 桩基静载试验
- 锂电池企业标准质量手册
- (完整版)离婚协议书标准版下载
- 山西焦煤集团正仁煤业有限公司矿产资源开发利用、地质环境保护与土地复垦方案
- 2023年安徽高校教师岗前培训结业统考试题及参考答案
- 驾驶员安全技术交底
- 医院临床、医技科室绩效考核办法
评论
0/150
提交评论