2016-11-09 70 views
0

我是MATLAB新手,我試圖實現連接組件算法。這裏是代碼:MATLAB中的連接組件遞歸函數

% Binary image (BI)  
% Labelled image (LI) 
LI = zeros(r,c); 

n = 1; 
    for i = 2:r-1 
     for j = 2:c-1 
      if BI(i,j) && LI(i,j) == 0 
       label(i, j, n, BI, LI) 
       n = n + 1; 
      end 
     end 
    end 

和我的標籤功能:

function label(x, y, n, BI, LI) 

LI(x,y) = n; 

    for i = x-1:x+1 
     for j = y-1:y+1 
      try 
       if BI(i,j) && LI(i,j) == 0 
        label(i, j, n, BI, LI) 
       end 
      catch 
       continue 
      end 
     end 
    end 

    end 

這工作幾個小時,什麼也沒有發生。我無法修復遞歸部分!這可能是因爲我的編程水平很差。一點幫助會很棒!

謝謝

+1

你爲什麼不使用一些內置的功能,如'bwconncomp'的https://www.mathworks.com/help/images/ref/bwconncomp .html – Eskapp

+1

謝謝,但我試試爲了實現這個功能:) – Burak

回答

3

你的問題是,MATLAB不通過引用傳遞函數參數。當您在label函數中修改LI時,它不會更改您創建爲標籤圖像的全局LI

要更新標籤圖像,你必須從你的函數返回值:

function LI = label(x, y, n, BI, LI) 

LI(x,y) = n; 

    for i = x-1:x+1 
     for j = y-1:y+1 
      try 
       if BI(i,j) && (LI(i,j) == 0) 
        LI = label(i, j, n, BI, LI); % update LI 
       end 
      catch 
       continue 
      end 
     end 
    end 

end 

現在label返回更新後的標籤圖像,你需要在每次調用label,如時間設置LI評論線之上,並在調用腳本:

% Binary image (BI)  
% Labelled image (LI) 
LI = zeros(r,c); 

n = 1; 
    for i = 2:r-1 
     for j = 2:c-1 
      if BI(i,j) && (LI(i,j) == 0) 
       LI = label(i, j, n, BI, LI); % update LI 
       n = n + 1; 
      end 
     end 
    end 
+0

謝謝,這是我錯過了一點。但不幸的是我的問題依然如此。 – Burak

+0

@Burak有趣。我在我生成的示例圖像上嘗試了這一點,它可以工作,但也許有一些我錯過了。你有一些輸入失敗? – beaker

+0

我剛剛發現我錯過了BI(i,j)和LI(i,j)都必須等於0!再次感謝你。 – Burak