本發(fā)明屬于計算機視覺領(lǐng)域,更具體的涉及一種圖像輪廓有序點集提取方法、計算機視覺系統(tǒng),屬于專利分類名稱為“圖像特征或特性的抽取”的g06k9/46(2006.01)i號分類。
背景技術(shù):
圖像輪廓的提取是計算機視覺中一個基礎(chǔ)性的核心步驟,在很多場合需要對圖像輪廓提取并轉(zhuǎn)換為有序點集。
現(xiàn)有的計算機圖像輪廓有序點集提取方法一般使用蟲隨法、光柵掃描法等,這些方法運行時都難以實現(xiàn)并行運算,圖像內(nèi)部小圖像越多,耗時越大,難以預(yù)測輪廓抽取的耗時;這些方法難以解析交叉的邊界;這些方法收斂特性不夠穩(wěn)定,可能掉入所謂的“陷阱”。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于針對現(xiàn)有技術(shù)的不足提出一種圖像輪廓有序點集提取方法,解決現(xiàn)有圖像輪廓有序點集提取方法運行緩慢、難以解析相交叉的邊界、收斂不穩(wěn)定的問題,有利于計算機視覺開發(fā)者開發(fā)計算機視覺系統(tǒng)。
一種圖像輪廓有序點集提取方法,基于一種邏輯拓?fù)浣Y(jié)構(gòu),每個點對應(yīng)八個碎點,一個碎點代表點的一個聯(lián)通方向;將所有碎點進(jìn)行連接,其方法是:如果一個碎點對應(yīng)聯(lián)通方向達(dá)到聯(lián)通條件,則將碎點指向?qū)?yīng)聯(lián)通方向的碎點的時針方向上的下一個碎點,否則將其指向本點的時針方向上的下一個碎點。
進(jìn)一步說明1:所述的時針方向包括逆時針方向和順時針方向。
進(jìn)一步說明2:所述的時針方向?qū)λ械狞c都是統(tǒng)一的,也就是說在一次圖片處理中所有點使用的時針方向必須是一致的,也就是說,不允許任何一個點使用與其他點不同的時針方向;(參見圖2)。
進(jìn)一步說明3:所述的聯(lián)通條件是可變的,由使用本發(fā)明的計算機視覺開發(fā)者根據(jù)需求而定義。
進(jìn)一步說明4:所述的統(tǒng)一的時針方向不是對碎點連接形成的邊界鏈的時針方向的限定,也就是說碎點連接完畢后產(chǎn)生的碎點鏈可以是不同的時針方向,事實上本發(fā)明碎點連接形成的碎點鏈,其方向既有順時針也有逆時針。
進(jìn)一步說明5:由于進(jìn)行過碎點連接運算后,邊界碎點鏈就被勾出,又由于碎點和點是對應(yīng)的,也就是說邊界碎點鏈的勾出,對于計算機視覺開發(fā)者而言,等同于有序點集的勾出;(參見圖3、圖4、圖5)。
進(jìn)一步說明6:為了方便計算機視覺開發(fā)者對本發(fā)明的理解和利用,特意做出非本發(fā)明必要特征的補充——孤點的判斷依據(jù):孤點即對外無連接的點,一個碎點鏈其包含的所有碎點都對應(yīng)同一個點,那么這條碎點鏈也就是一個孤點的碎點鏈(參見圖3,點p8)。
進(jìn)一步說明7:為了方便計算機視覺開發(fā)者對本發(fā)明的理解和利用,特意做出非本發(fā)明必要特征的補充——非邊界碎點鏈的判斷依據(jù)1:由于所有連接都成對出現(xiàn),那么當(dāng)一個點的兩個相鄰聯(lián)通方向都對外先連接時,位于時針方向上排位靠后的碎點所在的碎點鏈一定是非邊界碎點鏈;參見圖3,碎點鏈p0(s6)、p1(s3,s4)、p4(s1)和碎點鏈p1(s5,s6)、p2(s3,s4)、p4(s7,s0)、p5(s5,s2)。
進(jìn)一步說明8:為了方便計算機視覺開發(fā)者對本發(fā)明的理解和利用,特意做出非本發(fā)明必要特征的補充——非邊界碎點鏈的判斷依據(jù)2:孤點不算作有效圖像的情況下,由于一個點對應(yīng)八個碎點,那么連接后一個有效碎點鏈碎點數(shù)一定大于八,無效碎點鏈碎點數(shù)一定小于等于八;參見圖3,碎點鏈p0(s6)、p1(s3,s4)、p4(s1)和碎點鏈p1(s5,s6)、p2(s3,s4)、p4(s7,s0)、p5(s5,s2)。
進(jìn)一步說明9:為了方便計算機視覺開發(fā)者對本發(fā)明的理解和利用,特意做出非本發(fā)明必要特征的補充——碎點鏈的簡化方法,以點為單元順著時針方向的逆方向依次運算八個碎點,如果某碎點對外不聯(lián)通,就將其指向更改為時針方向上下一個碎點的指向,并將下一個碎點清除;經(jīng)過運算后同一點上的碎點出現(xiàn)在同一碎點鏈中的次數(shù)減少了;值得注意的是,由于孤點的所有碎點對外均無連接經(jīng)過簡化后會被消除(參見圖5)。
進(jìn)一步說明10:由于所有碎點的聯(lián)通條件是一致的,也就是說一個聯(lián)通方向上的連接是成對出現(xiàn);由于連接成對出現(xiàn)且所有的點使用的連接方向規(guī)則相同(時針方向),所以所有碎點形成的連接一定都是閉合鏈接,所以不用擔(dān)心收斂問題。
進(jìn)一步說明11:由于每個碎點對應(yīng)一個聯(lián)通方向,碎點的連接只與這個方向是否達(dá)到條件相關(guān),所以當(dāng)兩個邊界交叉時,本發(fā)明也能分別檢測出來,而不會出現(xiàn)判斷沖突。
進(jìn)一步說明12:因為每個聯(lián)通方向上的碎點連接運算是獨立的,和其他聯(lián)通方向狀況無關(guān),且碎點之間的數(shù)據(jù)相關(guān)性比較小,所以本發(fā)明很適合并行運算。
進(jìn)一步說明13:理解了進(jìn)一步說明1-12后可知,本發(fā)明雖為并行化運算而創(chuàng)造,但相對傳統(tǒng)方法其運行速度較快、可以檢測交叉邊界、不必?fù)?dān)心收斂問題的優(yōu)勢,在非并行計算中同樣存在。
本發(fā)明的新穎性在于:本發(fā)明是一種新的圖像輪廓有序點集提取方法。
本發(fā)明的實用性在于:為計算機視覺開發(fā)者提供了一種圖像輪廓有序點集提取方法,方便計算機視覺開發(fā)者開發(fā)適應(yīng)于多處理器并行的計算機視覺系統(tǒng),相對現(xiàn)有技術(shù)可以更加快速便捷的獲得圖像輪廓有序點集數(shù)據(jù)。
附圖說明
圖1是本發(fā)明提出的的邏輯拓?fù)浣Y(jié)構(gòu)一個示例,點p的橫坐標(biāo)為x,縱坐標(biāo)為y,顏色值為c,點p對應(yīng)的八個碎點為s0-s7。
圖2是本發(fā)明的一個實施實例,體現(xiàn)的是一個3*3像素的圖像數(shù)據(jù)被導(dǎo)入后的邏輯拓?fù)浣Y(jié)構(gòu)。
圖3是圖2實施實例的另一個狀態(tài),體現(xiàn)了圖2經(jīng)過碎點連接運算后的邏輯拓?fù)浣Y(jié)構(gòu)。
圖4是圖2實施實例的另一個狀態(tài),體現(xiàn)了圖3清除非邊界碎點鏈后的邏輯拓?fù)浣Y(jié)構(gòu)。
圖5是圖2實施實例的另一個狀態(tài),體現(xiàn)了圖4簡化碎點鏈并清除孤點后的邏輯拓?fù)浣Y(jié)構(gòu)。
具體實施方式
下面將結(jié)合實施實例對本發(fā)明進(jìn)行說明。
如圖2、圖3、圖4、圖5所示,是本發(fā)明一種圖像輪廓有序點集提取方法的一個實施實例,處理了一個具有3*3像素、具有0,1,3三種顏色值的圖像;本實例使用的聯(lián)通條件是顏色相同。
如圖2所示,是本實施實例在圖像數(shù)據(jù)導(dǎo)入后,碎點連接運算之前的邏輯拓?fù)浣Y(jié)構(gòu);其中所有點的碎點都構(gòu)成了一個順時針的圈狀閉合鏈;其中所有的輔助點p(-1,-1,-1)構(gòu)成一道防止計算溢出的‘圍墻’,因為‘圍墻’中的碎點沒有參與運算,為了視圖的清晰、簡潔,圖中未將其指向畫出。
如圖3所示,是圖2經(jīng)過碎點連接運算后的邏輯拓?fù)浣Y(jié)構(gòu),p0(s6)、p1(s3,s4)、p4(s1)構(gòu)成了一條“長條形”的非邊界碎點鏈;p1(s5,s6)、p2(s3,s4)、p4(s7,s0)、p5(s5,s2)構(gòu)成了一個“十字形”非邊界碎點鏈。
如圖3所示,p3、p7構(gòu)成的圖像的邊界與p6所在圖像的邊界雖然是交叉邊界,但經(jīng)過碎點連接運算后他們被分別檢出為兩條碎點鏈。
如圖3所示,孤點p8對外沒有聯(lián)通。
如圖4,是圖3剔除非邊界碎點鏈后的邏輯拓?fù)浣Y(jié)構(gòu),非邊界碎點鏈被清除(即標(biāo)記為負(fù),為了視圖的清晰沒有畫出)。
如圖5,是圖4進(jìn)行碎點鏈簡化運算后的邏輯拓?fù)浣Y(jié)構(gòu),同一點的碎點在同一碎點鏈上出現(xiàn)的次數(shù)減少了,孤點也被消除(即標(biāo)記為負(fù),為了視圖的清晰沒有畫出)。
如圖5所示,本實例得出的邊界有序集是:(p3,p7)和(p0,p4,p6,p4,p5,p2,p1),p4在對應(yīng)的輪廓有序集中出現(xiàn)了兩次,符合實際情況。
以下是本實施實例的基于英偉達(dá)公司cuda并行計算技術(shù)的部分代碼,體現(xiàn)了本發(fā)明適合并行運算的特性;提供這些代碼的目的是,為計算機視覺開發(fā)者理解和使用本發(fā)明提供參考。
structfr_point{//碎點
longnext_x;//指向的碎點所在點的x值
longnext_y;//指向的碎點所在點的y值
longnext_s;//指向的碎點的編號
};
structpoint{
longx;//點的橫坐標(biāo)
longy;//點的縱坐標(biāo)
longc;//點的顏色值
longselsete[4];//用于選擇,可以代替if語句根據(jù)不同情況結(jié)合運
算,產(chǎn)生不同值
fr_points[8];//碎點集
};
pointp[5][5];//構(gòu)造一個被點結(jié)構(gòu)體組
for(i=0;i<5;i++){
//構(gòu)造圍墻,防止計算溢出,其顏色值-1為無效值,以防被連接
p[0][i].c=-1;
p[4][i].c=-1;
p[i][0].c=-1;
p[i][4].c=-1;
}
idx=threadidx.x+1;//線程號x,idx的范圍1-3
idy=threadidx.y+1;//線程號y,idy的范圍1-3
if(idx<4&&idy<4){//idx的范圍1-3,idy的范圍1-3
for(t=0;t<8;t++){
p[idx][idy].s[t].next_x=idx;//將所有碎點指向本點,
p[idx][idy].s[t].next_y=idy;
p[idx][idy].s[t].next_s=(t+1)%8;//將碎點構(gòu)成順時針閉合環(huán)狀鏈,
結(jié)果見圖2;
}
p[idx][idy].c=image_color[idx][idy];//導(dǎo)入圖像顏色值
//碎點連接,連接運算為并行運算,運算結(jié)果見圖3
p[idx][idy].selsete[3]=!p[idx][idy].c-p[idx][idy-1].c;
//保存s0對應(yīng)聯(lián)通方向的聯(lián)通狀況,顏色相等則連接狀態(tài)為1,否則為零
p[idx][idy].s[0].next_y-=p[idx][idy].selsete[3];
//如果s0對外聯(lián)通改變y的值,s0對應(yīng)聯(lián)通方向的點橫坐標(biāo)與s0所在點一致;s0對
應(yīng)的聯(lián)通方向的點橫坐標(biāo)x值和本點的相同所以無需變化
p[idx][idy].s[0].next_s=4*p[idx][idy].selsete[3]+1;
//如果s0對外聯(lián)通變s的值為5,如果不聯(lián)通則s值為1
p[idx][idy].selsete[3]=!(p[idx][idy].c-p[idx-1][idy-1].c);
p[idx][idy].s[1].next_x-=p[idx][idy].selsete[3];
p[idx][idy].s[1].next_y-=p[idx][idy].selsete[3];
p[idx][idy].s[1].next_s=4*p[idx][idy].selsete[3]+2;
p[idx][idy].selsete[3]=!(p[idx][idy].c-p[idx-1][idy].c);
p[idx][idy].s[2].next_x-=p[idx][idy].selsete[3];
p[idx][idy].s[2].next_s=4*p[idx][idy].selsete[3]+3;
p[idx][idy].selsete[3]=!(p[idx][idy].c-p[idx-1][idy+1].c);
p[idx][idy].s[3].next_x-=p[idx][idy].selsete[3];
p[idx][idy].s[3].next_y+=p[idx][idy].selsete[3];
p[idx][idy].s[3].next_s=4*!p[idx][idy].selsete[3];
p[idx][idy].selsete[3]=!(p[idx][idy].c-p[idx][idy+1].c);
p[idx][idy].s[4].next_y+=p[idx][idy].selsete[3];
p[idx][idy].s[4].next_s=4*!p[idx][idy].selsete[3]+1;
p[idx][idy].selsete[3]=!(p[idx][idy].c-p[idx+1][idy+1].c);
p[idx][idy].s[5].next_x+=p[idx][idy].selsete[3];
p[idx][idy].s[5].next_y+=p[idx][idy].selsete[3];
p[idx][idy].s[5].next_s=4*!p[idx][idy].selsete[3]+2;
p[idx][idy].selsete[3]=!(p[idx][idy].c-p[idx+1][idy].c);
p[idx][idy].s[6].next_x+=p[idx][idy].selsete[3];
p[idx][idy].s[6].next_s=4*!p[idx][idy].selsete[3]+3;
p[idx][idy].selsete[3]=!(p[idx][idy].c-p[idx+1][idy-1].c);
p[idx][idy].s[7].next_x+=p[idx][idy].selsete[3];
p[idx][idy].s[7].next_y+=p[idx][idy].selsete[3];
p[idx][idy].s[7].next_s=4*p[idx][idy].selsete[3];
//以下是將非邊界碎點鏈標(biāo)記為負(fù)數(shù),以清除非邊界碎點鏈,運算結(jié)果參圖4
p[idx][idy].selsete[0]=-10;
p[idx][idy].selsete[1]=0;
p[idx][idy].selsete[2]=0;
p[idx][idy].selsete[3]=!(p[idx][idy].s[0].next_s-1)+!(p[idx][idy].s[1].
next_s-2);
//判斷相鄰兩碎點s0,s1對外聯(lián)通狀況
p[idx][idy].s[1].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
//如果s0,s1都對外聯(lián)通,s1.next_s指向被變化為負(fù)值,代表被消除
p[idx][idy].selsete[3]=!(p[idx][idy].s[1].next_s-2)+!(p[idx][idy].s[2].
next_s-3);
p[idx][idy].s[2].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[2].next_s-3)+!(p[idx][idy].s[3].
next_s-4);
p[idx][idy].s[3].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[3].next_s-4)+!(p[idx][idy].s[4].
next_s-5);
p[idx][idy].s[4].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[4].next_s-5)+!(p[idx][idy].s[5].
next_s-6);
p[idx][idy].s[5].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[5].next_s-6)+!(p[idx][idy].s[6].
next_s-7);
p[idx][idy].s[6].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[6].next_s-7)+!(p[idx][idy].s[7].
next_s-0);
p[idx][idy].s[7].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[7].next_s-0)+!(p[idx][idy].s[0].
next_s-1);
p[idx][idy].s[0].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
//以下是對前面的運算可能未完全清除的非邊界碎點鏈(比如p1(s3))進(jìn)行清除;
p[idx][idy].selsete[3]=!(p[idx][idy].s[0].next_s-1)+!(p[idx][idy].s[2].
next_s-3);
//保存s0、s2對外聯(lián)通情況,如果都對外聯(lián)通則所得值為零
p[idx][idy].s[1].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
//如果s0、s2對外聯(lián)通,則s1的指向變?yōu)樨?fù)數(shù)
p[idx][idy].selsete[3]=!(p[idx][idy].s[2].next_s-3)+!(p[idx][idy].s[4].
next_s-5);
p[idx][idy].s[3].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[4].next_s-5)+!(p[idx][idy].s[6].
next_s-7);
p[idx][idy].s[5].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[6].next_s-0)+!(p[idx][idy].s[0].
next_s-1);
p[idx][idy].s[7].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
//下面是邊界碎點鏈的簡化,運算結(jié)果參見圖5
p[idx][idy].selsete[3]=!(p[idx][idy].s[7].next_s-0);
//如果指向0,則說明s[7]對外不聯(lián)通,如果對外不聯(lián)通就將其指向s[0]的指向,并
清除s[0]
p[idx][idy].selsete[0]=p[idx][idy].s[7].next_x;
//s[7]對外聯(lián)通則s7指向的橫坐標(biāo)x不變
p[idx][idy].selsete[1]=p[idx][idy].s[0].next_x;
//s[7]對外不聯(lián)通則s7指向的橫坐標(biāo)x變?yōu)閟[0]指向的橫坐標(biāo)
p[idx][idy].s[7].next_x=p[idx][idy].selsete[p[idx][idy].selsete[3]];
//選擇運算,如果
p[idx][idy].selsete[0]=p[idx][idy].s[7].next_y;
p[idx][idy].selsete[1]=p[idx][idy].s[0].next_y;
p[idx][idy].s[7].next_y=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[7].next_s;
p[idx][idy].selsete[1]=p[idx][idy].s[0].next_s;
p[idx][idy].s[7].next_s=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=1;
//如果s[7]對外連通,其指向在前面幾行代碼中沒被改變,需要保留s[0]
p[idx][idy].selsete[1]=-10;
//如果s[7]對外不連通,其指向會在前面幾行代碼中改變,需要清除s[0],負(fù)值代
表清除
p[idx][idy].s[0].next_s*=p[idx][idy].selsete[p[idx][idy].selsete[3]];
//做出選擇運算,
p[idx][idy].selsete[3]=!(p[idx][idy].s[6].next_s-7);//如果指向7,則說
明s[6]對外不聯(lián)通
p[idx][idy].selsete[0]=p[idx][idy].s[6].next_x;
p[idx][idy].selsete[1]=p[idx][idy].s[7].next_x;
p[idx][idy].s[6].next_x=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[6].next_y;
p[idx][idy].selsete[1]=p[idx][idy].s[7].next_y;
p[idx][idy].s[6].next_y=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[6].next_s;
p[idx][idy].selsete[1]=p[idx][idy].s[7].next_s;
p[idx][idy].s[6].next_s=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=1;
p[idx][idy].selsete[1]=-10;
p[idx][idy].s[7].next_s*=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[5].next_s-6);//如果指向6,則說
明s[5]對外不聯(lián)通
p[idx][idy].selsete[0]=p[idx][idy].s[5].next_x;
p[idx][idy].selsete[1]=p[idx][idy].s[6].next_x;
p[idx][idy].s[5].next_x=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[5].next_y;
p[idx][idy].selsete[1]=p[idx][idy].s[6].next_y;
p[idx][idy].s[5].next_y=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[5].next_s;
p[idx][idy].selsete[1]=p[idx][idy].s[6].next_s;
p[idx][idy].s[5].next_s=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=1;
p[idx][idy].selsete[1]=-10;
p[idx][idy].s[6].next_s*=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[4].next_s-5);//如果指向5,則說
明s[4]對外不聯(lián)通
p[idx][idy].selsete[0]=p[idx][idy].s[4].next_x;
p[idx][idy].selsete[1]=p[idx][idy].s[5].next_x;
p[idx][idy].s[4].next_x=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[4].next_y;
p[idx][idy].selsete[1]=p[idx][idy].s[5].next_y;
p[idx][idy].s[4].next_y=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[4].next_s;
p[idx][idy].selsete[1]=p[idx][idy].s[5].next_s;
p[idx][idy].s[4].next_s=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=1;
p[idx][idy].selsete[1]=-10;
p[idx][idy].s[5].next_s*=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[3].next_s-4);//如果指向4,則說
明s[3]對外不聯(lián)通
p[idx][idy].selsete[0]=p[idx][idy].s[3].next_x;
p[idx][idy].selsete[1]=p[idx][idy].s[4].next_x;
p[idx][idy].s[3].next_x=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[3].next_y;
p[idx][idy].selsete[1]=p[idx][idy].s[4].next_y;
p[idx][idy].s[3].next_y=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[3].next_s;
p[idx][idy].selsete[1]=p[idx][idy].s[4].next_s;
p[idx][idy].s[3].next_s=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=1;
p[idx][idy].selsete[1]=-10;
p[idx][idy].s[4].next_s*=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[2].next_s-3);//如果指向3,則說
明s[2]對外不聯(lián)通
p[idx][idy].selsete[0]=p[idx][idy].s[2].next_x;
p[idx][idy].selsete[1]=p[idx][idy].s[3].next_x;
p[idx][idy].s[2].next_x=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[2].next_y;
p[idx][idy].selsete[1]=p[idx][idy].s[3].next_y;
p[idx][idy].s[2].next_y=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[2].next_s;
p[idx][idy].selsete[1]=p[idx][idy].s[3].next_s;
p[idx][idy].s[2].next_s=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=1;
p[idx][idy].selsete[1]=-10;
p[idx][idy].s[3].next_s*=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[1].next_s-2);//如果指向2,則說
明s[1]對外不聯(lián)通
p[idx][idy].selsete[0]=p[idx][idy].s[1].next_x;
p[idx][idy].selsete[1]=p[idx][idy].s[2].next_x;
p[idx][idy].s[1].next_x=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[1].next_y;
p[idx][idy].selsete[1]=p[idx][idy].s[2].next_y;
p[idx][idy].s[1].next_y=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[1].next_s;
p[idx][idy].selsete[1]=p[idx][idy].s[2].next_s;
p[idx][idy].s[1].next_s=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=1;
p[idx][idy].selsete[1]=-10;
p[idx][idy].s[2].next_s*=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[0].next_s-1);//如果指向1,則說
明s[0]對外不聯(lián)通
p[idx][idy].selsete[0]=p[idx][idy].s[0].next_x;
p[idx][idy].selsete[1]=p[idx][idy].s[1].next_x;
p[idx][idy].s[0].next_x=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[0].next_y;
p[idx][idy].selsete[1]=p[idx][idy].s[1].next_y;
p[idx][idy].s[0].next_y=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[0].next_s;
p[idx][idy].selsete[1]=p[idx][idy].s[1].next_s;
p[idx][idy].s[0].next_s=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=1;
p[idx][idy].selsete[1]=-10;
p[idx][idy].s[1].next_s*=p[idx][idy].selsete[p[idx][idy].selsete[3]];
}。
本發(fā)明提供的一種圖像輪廓有序點集提取方法,是一種方法發(fā)明,它可以通過cpu、gpu、mcu、dsp、fpga等計算機硬件來實現(xiàn)。
根據(jù)發(fā)明內(nèi)容說明和實施實例可知,本發(fā)明的典型實施實例并不是對本發(fā)明的限定,任何利用本發(fā)明提出的邏輯拓?fù)浣Y(jié)構(gòu),并依照本發(fā)明提出的碎點連接方法進(jìn)行碎點連接的圖像輪廓有序點集提取方法,都應(yīng)屬于本發(fā)明的范疇。