2012-10-14 7 views
2

체인 코드를 구현하고 있는데 약간의 문제가 발생했습니다. 우선 내가 무엇을 :체인 코드 무한 루프

내가 내 경계의 특정 픽셀에서 시작하여 나는이에 이웃하는 픽셀이 존재 acoriding 인 확인 :

3 2 1 
\ |/
4-- --0 
/| \ 
5 6 7 

내가 문제가 여기에 있지만 :

enter image description here

작은 빨간 점이 알고리즘을 시작하는 곳입니다. 첫 번째 방향은 2, 1, 0, 0 등 ...

노란색 점을 따라 가면 두 점이 나란히 표시됩니다. 이것은 알고리즘이 방향 4에 들어간 곳입니다 (방향 0,1,2 또는 3에 값 1 인 픽셀이 없었기 때문에). 다음 단계에서 방향 0 (항상 시작하는 첫 번째 방향)을 확인하지만 ... 물론 그것은 이전 지점이기 때문에 존재합니다. 여기서는 무한 루프 (왼쪽에서 오른쪽으로, 오른쪽에서 왼쪽으로)로 고정되어 있습니다.

내 질문은 지금 어떻게 해결할 수 있습니까?

내가 사용하는 코드는 다음과 같습니다

이 이미지에
% Implementation of tangent angle function (chain code) 

clear 
clc 

directions = [ 1, 0 
       1,-1 
       0,-1 
       -1,-1 
       -1, 0 
       -1, 1 
       0, 1 
       1, 1] 

I = imread('./IMAGES/1/M_201005_1_0001.pgm'); 
Ibw = im2bw(I,0.15); % This is also by setting all the pixels with intesity lower than 17 to 0; 


tanAngFunc ={}; 

[row,col] = find(Ibw); 

y = col(find(max(row)==row)) 
x = max(row) 

imshow(I) 
hold on; 
plot(y,x,'r.','MarkerSize',1) 
hold on 

l=1; 

    not_done = true; 
    while not_done 
    if l== 36 
     'test' 
    end 



     % Right (0) 
     if Ibw(x+directions(1,2),y+directions(1,1)) ~=0 

      tanAngFunc{l} = 0; 
      x= x+directions(1,2); 
      y= y+directions(1,1); 

     % Above right(1) 
     elseif Ibw(x+directions(2,2),y+directions(2,1)) ~=0 
      tanAngFunc{l} = 2; 
      x= x+directions(2,2); 
      y= y+directions(2,1); 

     % Above (2) 
     elseif Ibw(x+directions(3,2),y+directions(3,1)) ~=0 
      tanAngFunc{l} = 2; 
      x= x+directions(3,2); 
      y= y+directions(3,1); 

     % Above left (3) 
     elseif Ibw(x+directions(4,2),y+directions(4,1)) ~=0 
      tanAngFunc{l} = 2; 
      x= x+directions(4,2); 
      y= y+directions(4,1); 

     % Left (4) 
     elseif Ibw(x+directions(5,2),y+directions(5,1)) ~=0 
      tanAngFunc{l} = 2; 
      x= x+directions(5,2); 
      y= y+directions(5,1); 

     % Bottom left (5) 
     elseif Ibw(x+directions(6,2),y+directions(6,1)) ~=0 
      tanAngFunc{l} = 2; 
      x= x+directions(6,2); 
      y= y+directions(6,1); 

     % Bottom (6) 
     elseif Ibw(x+directions(7,2),y+directions(7,1)) ~=0 
      tanAngFunc{l} = 2; 
      x= x+directions(7,2); 
      y= y+directions(7,1); 

     % Bottom right (7) 
     elseif Ibw(x+directions(8,2),y+directions(8,1)) ~=0 
      tanAngFunc{l} = 3; 
      x= x+directions(8,2); 
      y= y+directions(8,1); 
     end 


     plot(y,x,'y.','MarkerSize',3) 
     hold on 

     pause(1) 
     l = l + 1; 





    not_done = (x ~= col(find(max(row)==row)) && y ~= max(row)); 
    end 

:이 시도하려는 경우 enter image description here

자신을

편집 :

제안으로 의견에서 제 2 판에서는 알고리즘이 사용하지 않았 음을 확인했습니다. 이전에 방문한 픽셀. 결과 : enter image description here

실용적인 답변이 아닙니다.

편집 2

@jonas의 업데이트 된 솔루션에 관한. 빨리 이해하고 이해하기 쉽도록 Excel에 신속하게 넣었습니다. (1의 픽셀은 아직 발견되지 않고, 픽셀 x는 이미 발견 됨).

enter image description here

그래서 이것은 거대한 데이터 세트로 작업 할 때 모든 사진의 가장자리가 2 개 픽셀 폭 확인 오히려 불가능, 100 % 작동하지 않습니다.

+1

방문한 노드를 표시하고 두 번 방문하지 않을 수 있습니까? Sth. 깊이 우선 탐색의 라인에서 당신은 할 수있는 한 깊은 곳으로 가야합니다. 그러면 한 발 뒤로 물러나 다른 그럴듯한 길을 따라 가십시오. – angainor

답변

2

알고리즘의 문제점은 방문 할 "후보"픽셀이 개체의 일부인지 여부 만 확인한다는 것입니다. 그러나 추가 검사를 수행하지 않아 픽셀이 경계의 일부인지 확인하지 않습니다. 이것이 물체의 내부를 행복하게 걷는 이유입니다.

경계 추적에 널리 사용되는 알고리즘은 무어 - 이웃 추적 알고리즘입니다. Wikipedia page 외에도 this page을 살펴보면 알고리즘에 대한 아이디어가 자세히 설명되어 있습니다.

1

이 문제를 해결하는 가장 쉬운 방법은 BWTRACEBOUNDARY 함수를 사용하는 것입니다.시작 지점 (x,y)

, 당신이 작성합니다

B = bwtraceboundary(Ibw,[x,y],'N'); 

그 결과

이 이미지 위에 그려, 다음과 같습니다

enter image description here

편집

bwtraceboundary을 사용할 수 없다면 먼저 b 만 화소 전용 :

경계 = Ibw - imerode (Ibw, ones (3));

개체가 두 픽셀보다 넓은 경우 거의 모든 문제가 방지됩니다.

+0

내가 동쪽이 아니라 북쪽을 시작했다는 것을 알아 차렸다. 나는 그것이 중요하지 않아야한다고 생각한다. – Jonas

+0

사용할 수 없습니다. 나는 그것이 내 이미지에서 작동하는지 알 수 있도록 알고리즘을 신속하게 프로토 타입 화하려고합니다. 그럼 자바에서 구현하고 싶습니다. 이걸로 어떻게 작동하는지 모르거나 내 버전이 잘못되었습니다. – Ojtwist

+0

@Ojtwist : 오, 이해합니다. 내 편집을 참조하십시오. – Jonas