[問題] Connected Component Labeling
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++
以下是我自己寫的連通物件法
做法是看左跟上,兩個點
1)假設遇到1且左跟上為0,則給一個新編號
2)假設遇到1且左或上有一個不為0,則給他不為0的那個編號
3)假設遇到1且左跟上接不為0 則給他小的那個編號,並且掃描前面的點
把大的編號全部變成小的編號
但是這種做法遇到大張的圖會跑很久,想問有沒有快一點的方法
如何改進
我有查到的方法是如果有最後一種情況,一樣是先改成小的值,
記錄兩個區塊相同,最後再掃描一次,
但是因為剛接觸C,不知道怎麼寫這個做法,可否有詳細教學
或是有別的比較快的方法,感謝大家
以下是我的程式碼
for(i = 1; i != height; ++i) {
for(j = 1; j != width; ++j) {
if (data[i][j]!=0){
if (data[i-1][j]==0 && data[i][j-1]==0){//判斷連通條件
lab[i][j]=m;
m=m+1;
}
if (data[i-1][j] != 0 && data[i][j-1] == 0){
lab[i][j]=lab[i-1][j];
}
if (data[i][j-1] != 0 && data[i-1][j] == 0){
lab[i][j]=lab[i][j-1];
}
if (data[i-1][j] != 0 && data[i][j-1] != 0 && lab[i-1][j]==lab[i][j-1]){
lab[i][j]=lab[i-1][j];
}
if (data[i-1][j] != 0 && data[i][j-1] != 0 && lab[i-1][j] != lab[i][j-1]
&& lab[i-1][j] > lab[i][j-1]){
k=lab[i-1][j];
l=lab[i][j-1];
lab[i][j]=lab[i][j-1];
for (u=1;u<i+1;u++){
for (v=1;v<j+1;v++){
if (lab[u][v]==k){
lab[u][v]=l;
}
}
}
}
if (data[i-1][j] != 0 && data[i][j-1] != 0 && lab[i-1][j] != lab[i][j-1]
&& lab[i-1][j] < lab[i][j-1]){
lab[i][j]=lab[i-1][j];
k=lab[i-1][j];
l=lab[i][j-1];
for (u=1;u<i+1;u++){
for (v=1;v<j+1;v++){
if (lab[u][v]==l){
lab[u][v]=k;
}
}
}
}
}
}
}
--
╔══════════╗#6 Tyson Chandler#33Brendan Haywood#28Ian Mahinmi
║██◣ ◢█◣ █ ║#41Dirk Nowitzki #16Peja Stojakovic#35Brian Cardinal
║▉ █ █▃█ █ ║#4 Caron Butler #0 Shawn Marion #92DeShawn Stevenson
║██◤ █ █ ███║#31Jason Terry #13Corey Brewer #20Dominique Jones
╚══════════╝#2 Jason Kidd #11J.Jose Barea #3 Rodrigue Beaubois
2010-2011 Boss Mark Cuban Coach Rick Carlisle φs93rm6
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 1.171.18.111
推
11/24 12:41, , 1F
11/24 12:41, 1F
→
11/24 12:42, , 2F
11/24 12:42, 2F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章
10
15