2014-01-18 32 views
0

我想檢測提供的二進制(黑白)圖像中的連接組件。我正在使用DFS來做到這一點。但它陷入了無限循環。我知道默認情況下,matlab不支持超過500深度的遞歸。因此,爲了安全起見,我使用的尺寸僅爲100 X 200的小圖像。但以下是我的代碼。任何機構都可以幫助我發現問題嗎?在matlab中使用dfs不連接的連接組件

調用代碼:

img = imread('small_img.png'); 

[row col] = size(img); 

img_label = zeros(row,col,'uint8'); 

labelCounter = 1; 

for i=1:row 
    for j=1:col 
    if img(i,j)==0 && img_label(i,j)==0 
     dfs(i,j,img,img_label,row,col,labelCounter); 
    end 
    end 
end 

imshow(img); 

和DFS

function dfs(i,j,img,img_label,row,col,labelCounter) 
    if i < 1 || i >row || j < 1 || j > col || img_label(i,j) ~=0 || img(i,j) ~=0 
     return; 
    end 
    img_label(i,j) = labelCounter; 

    dfs(i,j-1,img,img_label,row,col,labelCounter); 
    dfs(i-1,j,img,img_label,row,col,labelCounter); 
end 

回答

0

你的功能DFS不返回img_label。在第一次調用dfs時,img_label中的一個像素將被設置爲labelCounter。在接下來的dfs調用中,將會設置越來越多的像素,但創建的圖像永遠不會返回。這就是爲什麼它在調用代碼中保持爲零。

labelCounter始終爲1.在調用代碼中可能會增加該值,以正確指定連接的組件的數量。

由於您只關注i-1j-1,某些區域可能未被檢測爲連接,即使它們是。此外,以下i+1j+1可以幫助這裏。

來自MATLAB:使用set(0,'RecursionLimit',N)來更改限制。請注意,超出您的可用堆棧空間可能會導致MATLAB和/或您的計算機崩潰。