triop
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:14 回覆:15 積分:5 註冊:2005-11-08
發送簡訊給我
|
我是用non-recuresive的方式來做的
其中「等價」的部分我弄不太出來
所以會有「相連的圖但有不同label」的問題發生...
我想請問一下有沒有人能夠解決
或者是那邊有現成的code可以用....(因為這只是影像前處理的一部分~T.T)
下面的圖應該很明顯可以知道我在講什麼.....![](/images/msn/cry_smile.gif)
希望大家能夠幫幫忙了...m(_ _)m
![](http://delphi.ktop.com.tw/download.php?download=upload/46258750f265d_aaa.JPG)
文末附上我的程式碼,請大家幫幫忙....
大概就是將原圖分成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;i 0) { //如果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>
|