[問題] Connected Component Labeling

看板C_and_CPP (C/C++)作者 (雞蛋)時間12年前 (2013/11/23 23:34), 編輯推噓1(101)
留言2則, 1人參與, 最新討論串1/1
開發平台(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
可以用 disjoint set
11/24 12:41, 1F

11/24 12:42, , 2F
BFS 也可以
11/24 12:42, 2F
文章代碼(AID): #1IaCiL4N (C_and_CPP)
文章代碼(AID): #1IaCiL4N (C_and_CPP)