체인 코드를 구현하고 있는데 약간의 문제가 발생했습니다. 우선 내가 무엇을 :체인 코드 무한 루프
내가 내 경계의 특정 픽셀에서 시작하여 나는이에 이웃하는 픽셀이 존재 acoriding 인 확인 :
3 2 1
\ |/
4-- --0
/| \
5 6 7
내가 문제가 여기에 있지만 :
을작은 빨간 점이 알고리즘을 시작하는 곳입니다. 첫 번째 방향은 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
:이 시도하려는 경우
자신을
편집 :
제안으로 의견에서 제 2 판에서는 알고리즘이 사용하지 않았 음을 확인했습니다. 이전에 방문한 픽셀. 결과 :
실용적인 답변이 아닙니다.
편집 2
@jonas의 업데이트 된 솔루션에 관한. 빨리 이해하고 이해하기 쉽도록 Excel에 신속하게 넣었습니다. (1의 픽셀은 아직 발견되지 않고, 픽셀 x는 이미 발견 됨).
그래서 이것은 거대한 데이터 세트로 작업 할 때 모든 사진의 가장자리가 2 개 픽셀 폭 확인 오히려 불가능, 100 % 작동하지 않습니다.
방문한 노드를 표시하고 두 번 방문하지 않을 수 있습니까? Sth. 깊이 우선 탐색의 라인에서 당신은 할 수있는 한 깊은 곳으로 가야합니다. 그러면 한 발 뒤로 물러나 다른 그럴듯한 길을 따라 가십시오. – angainor