線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1712
推到 Plurk!
推到 Facebook!

connected component 結果不正確

缺席
triop
一般會員


發表:14
回覆:15
積分:5
註冊:2005-11-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-04-17 23:41:15 IP:140.117.xxx.xxx 訂閱
我是用non-recuresive的方式來做的
其中「等價」的部分我弄不太出來
所以會有「相連的圖但有不同label」的問題發生...
我想請問一下有沒有人能夠解決
或者是那邊有現成的code可以用....(因為這只是影像前處理的一部分~T.T)
下面的圖應該很明顯可以知道我在講什麼.....
希望大家能夠幫幫忙了...m(_ _)m


文末附上我的程式碼,請大家幫幫忙....
大概就是將原圖分成ABCDE五個區域
A:X=0,Y=0 B:X>0,Y=0 C:X=0,Y>0 D:00 E:X=width-1,Y>0
分別做處理,並用一個等價陣列eq[i]來存與每個label等價之值
<textarea class="cpp" rows="7" cols="100" name="code">short mother(short A[500],short l) //找等價陣列中每個元素最小的起源; { short temp=l; while (A[temp]!=0) temp=A[temp]; return temp; } </textarea>

<textarea class="cpp" rows="50" cols="120" name="code"> { int W = 160; int H = 120; short tmp=0; // int tabelcount=1; unsigned char *labelsize; //=== 動態設置 label矩陣 = image_size [height][width] ===; unsigned short **label = new unsigned short*[H] ; for(int i=0;i0) { //如果input matrix 的某個pixel 有值,則做以下運算; int min=65535; if ( x==0 && y==0) { //A; label[y][x]=1; eq[1]=0; lblcount=2; } if ( x>0 && y==0 ) {//B; if (label[y][x-1]!=65535) label[y][x]=label[y][x-1]; //有鄰居 else {//沒鄰居; label[y][x]=lblcount; eq[lblcount]=0; lblcount ; } } if ( x==0 && y>0 ) {//C; if (min>label[y-1][x]) min=label[y-1][x]; //上 if (min>label[y-1][x 1]) min=label[y-1][x 1];//右上 if (min!=65535) label[y][x]=min; //有鄰居; else{//沒鄰居; label[y][x]=lblcount; eq[lblcount]=0; lblcount ; } } if( x>0 && y>0 && xlabel[y-1][x-1]) min=label[y-1][x-1]; //左上 if (min>label[y-1][x]) min=label[y-1][x]; //上 if (min>label[y-1][x 1]) min=label[y-1][x 1]; //右上 if (min>label[y][x-1]) min=label[y][x-1]; //左 if (min!=65535) {//有鄰居 tmp=mother(eq,min); label[y][x]=tmp; if (label[y-1][x-1]!=65535 && label[y-1][x-1]!=tmp) eq[label[y-1][x-1]]=tmp; if (label[y-1][x ]!=65535 && label[y-1][x ]!=tmp) eq[label[y-1][x ]]=tmp; if (label[y-1][x 1]!=65535 && label[y-1][x 1]!=tmp) eq[label[y-1][x 1]]=tmp; if (label[y] [x-1]!=65535 && label[y ][x-1]!=tmp) eq[label[y ][x-1]]=tmp; } else {//沒鄰居 label[y][x]=lblcount; eq[lblcount]=0; lblcount ; } } if ( x==W-1 && y>0 ) {//E; if (min>label[y-1][x-1]) min=label[y-1][x-1]; //左上 if (min>label[y-1][x]) min=label[y-1][x]; //上 if (min>label[y][x-1]) min=label[y][x-1]; //左 if (min!=65535){//有鄰居; tmp=mother(eq,min); label[y][x]=tmp; if (label[y-1][x-1]!=65535 && label[y-1][x-1]!=tmp) eq[label[y-1][x-1]]=tmp; if (label[y-1][x ]!=65535 && label[y-1][x ]!=tmp) eq[label[y-1][x ]]=tmp; if (label[y] [x-1]!=65535 && label[y ][x-1]!=tmp) eq[label[y ][x-1]]=tmp; } else {//沒鄰居; label[y][x]=lblcount; eq[lblcount]=0; lblcount ; } } } } } for (int y=0 ; yPixelFormat=TPixelFormat(pf24bit); BMP->Width= W; BMP->Height= H; for(int y=0;yHeight;y ) { ptr = (Byte *)BMP->ScanLine[y]; for(int x=0;xWidth;x ) { if (label[y][x]>1000) label[y][x]=0; ptr[x*3]=label[y][x]*4; ptr[x*3 1]=label[y][x]*5; ptr[x*3 2]=label[y][x]*10; } } Form1->Image3->Picture->Bitmap->Assign(BMP); delete BMP; delete *label,label,*labelsize,eq; return 0; } </textarea>
dicky9055
一般會員


發表:20
回覆:48
積分:18
註冊:2006-08-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-04-18 08:48:34 IP:211.76.xxx.xxx 未訂閱
哇..你的程式貼的也太亂了吧...
triop
一般會員


發表:14
回覆:15
積分:5
註冊:2005-11-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-04-20 20:15:37 IP:125.232.xxx.xxx 訂閱

===================引 用 dicky9055 文 章===================
哇..你的程式貼的也太亂了吧...

謝謝...
已修正...
請大家幫忙看看吧~
TheMoon
中階會員


發表:17
回覆:95
積分:67
註冊:2002-06-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-05-23 13:20:18 IP:61.220.xxx.xxx 訂閱
Hi triop,
從您附的結果圖與程式碼得知,
您在做影像標記的過程中只做了一次scan,
且scan的方向是由左至右、由上而下,
所以無法將同一區塊做相同標記。

建議您從不同的四個方向做scan (總共做四次scan),
應該就可以解決您目前所碰到的問題。

系統時間:2024-11-25 1:27:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!