영상의 경계 추적하기
이 툴박스에는 이진 영상에서 객체의 경계를 찾을 때 사용하는 함수가 두 개 포함되어 있습니다.
bwtraceboundary
함수는 영상에서 하나의 객체의 테두리 상에 있는 모든 픽셀의 행 좌표와 열 좌표를 반환합니다. 객체 상의 테두리 픽셀의 위치를 추적을 위한 시작점으로 지정해야 합니다.
bwboundaries
함수는 영상에서 모든 객체의 테두리 픽셀의 행 좌표와 열 좌표를 반환합니다.
이진 영상에서 두 함수 모두 0이 아닌 픽셀은 객체에 속하고 값이 0인 픽셀은 배경을 구성합니다.
영상에서 객체의 경계 추적하기
이 예제에서는 bwtraceboundary
를 사용하여 이진 영상에서 하나의 객체의 테두리를 추적하는 방법을 보여줍니다. 이 예제는 그런 다음 bwboundaries
를 사용하여 영상에서 모든 객체의 테두리를 추적합니다.
영상을 읽어 들인 후 이를 표시합니다.
I = imread('coins.png');
imshow(I)
영상을 이진 영상으로 변환합니다. bwtraceboundary
와 bwboundaries
는 이진 영상에서만 사용할 수 있습니다.
BW = im2bw(I); imshow(BW)
추적하려는 객체의 테두리에 위치한 어느 한 픽셀의 행 좌표와 열 좌표를 확인합니다. bwboundary
는 이 점을 경계 추적을 위한 시작 위치로 사용합니다.
dim = size(BW)
dim = 1×2
246 300
col = round(dim(2)/2)-90; row = min(find(BW(:,col)))
row = 27
bwtraceboundary
를 호출하여 지정된 점에서부터 경계를 추적합니다. 이진 영상, 시작점의 행 좌표와 열 좌표, 첫 번째 스텝의 방향을 필수 인수로 지정해야 합니다. 이 예제에서는 북쪽('N'
)을 지정합니다.
boundary = bwtraceboundary(BW,[row, col],'N');
원본 회색조 영상을 표시하고, bwtraceboundary
에서 반환한 좌표를 사용하여 영상 위에 테두리를 플로팅합니다.
imshow(I) hold on; plot(boundary(:,2),boundary(:,1),'g','LineWidth',3);
영상에 있는 모든 동전의 경계를 추적하려면 bwboundaries
함수를 사용하십시오. 기본적으로, bwboundaries
는 영상에서 객체 안에 있는 객체까지 포함하여 모든 객체의 경계를 찾습니다. 이 예제에서 사용된 이진 영상에서는 몇몇 동전이 검은색 영역을 포함하는데, bwboundaries
는 이러한 검은색 영역을 별도의 객체로 해석합니다. bwboundaries
가 동전만 추적하도록 하려면 imfill
을 사용하여 각 동전의 안쪽 영역을 채우십시오. bwboundaries
는 각 셀이 영상의 각 객체의 행/열 좌표를 포함하는 셀형 배열을 반환합니다.
BW_filled = imfill(BW,'holes');
boundaries = bwboundaries(BW_filled);
bwboundaries
에서 반환한 좌표를 사용하여 원본 회색조 영상 위에 모든 동전의 테두리를 플로팅합니다.
for k=1:10 b = boundaries{k}; plot(b(:,2),b(:,1),'g','LineWidth',3); end
추적을 위한 첫 번째 스텝과 방향 선택하기
객체에 따라 시작점으로 선택하는 테두리 픽셀과 첫 번째 스텝 파라미터로 선택하는 방향(북쪽, 남쪽 등)을 지정할 때 주의가 필요할 수 있습니다.
예를 들어, 어떤 객체에 구멍이 포함되어 있는데 객체에서 얇은 부분에 있는 픽셀을 시작 픽셀로 선택한 경우 첫 스텝의 방향을 어떻게 선택하는가에 따라 객체의 바깥쪽 테두리를 추적할 수도 있고 구멍의 안쪽 테두리를 추적할 수도 있습니다. 채워진 객체의 경우에는 첫 스텝 파라미터로 선택하는 방향이 비교적 덜 중요합니다.
설명을 돕기 위해 다음 그림에서 시작 픽셀이 객체의 얇은 부분에 있을 때 첫 번째 스텝이 북쪽으로 설정된 경우와 남쪽으로 설정된 경우에 추적되는 픽셀을 표시했습니다. 연결성은 8(디폴트 값)로 설정되었습니다.
첫 번째 스텝과 방향 파라미터가 경계 추적에 미치는 영향