2014-01-18 1 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 호출에서는 더 많은 픽셀이 설정되지만 생성 된 이미지는 반환되지 않습니다. 이것이 호출 코드에서 0을 유지하는 이유입니다.

labelCounter 항상 1입니다. 연결된 구성 요소의 번호를 제대로 지정하려면 호출 코드에서 증가시켜야합니다.

i-1j-1 만 따르기 때문에 일부 지역은 연결 되었음에도 불구하고 연결된 것으로 감지되지 않을 수 있습니다. 또한 i+1j+1을 따르는 것이 도움이 될 수 있습니다.

MATLAB에서 : set(0,'RecursionLimit',N)을 사용하여 제한을 변경하십시오. 사용 가능한 스택 공간을 초과하면 MATLAB 및/또는 컴퓨터가 손상 될 수 있습니다.

관련 문제