영상의 경계 추적하기
영상에서 객체의 경계 추적하기
이 예제에서는 이진 영상에서 하나의 객체 또는 모든 객체의 경계를 추적하는 방법을 보여줍니다.
영상을 읽어 들여 표시합니다.
I = imread("coins.png");
imshow(I)
영상을 이진 영상으로 변환합니다. bwtraceboundary
함수와 bwboundaries
함수는 이진 영상에만 사용할 수 있습니다.
BW = imbinarize(I); imshow(BW)
단일 객체의 경계
이진 영상에서 단일 객체의 경계를 추적하려면, 먼저 객체의 테두리에 있는 한 픽셀의 행과 열 좌표를 결정해야 합니다. 이 예제에서는 열 좌표를 선택합니다. 그러면 이 예제는 해당 열에서 맨 위에 있는 객체의 행 좌표를 계산합니다.
numCols = size(BW,2);
col = 60;
row = find(BW(:,col),1)
row = 27
지정된 점에서부터 경계를 추적하려면 bwtraceboundary
함수를 사용합니다. 이진 영상, 시작점의 행 좌표와 열 좌표, 첫 번째 스텝의 방향을 필수 인수로 지정해야 합니다. 이 예제에서는 북쪽("N"
)을 지정합니다.
boundary = bwtraceboundary(BW,[row, col],"N");
원본 회색조 영상 위에 테두리를 플로팅합니다.
imshow(I) hold on plot(boundary(:,2),boundary(:,1),"g",LineWidth=3);
모든 객체의 경계
이 예제에서 사용된 이진 영상에서 몇몇 동전에 검은 영역이 포함되어 있는데, bwboundaries
함수는 이러한 검은 영역을 별도의 객체로 해석합니다. bwboundaries
가 동전의 외부만 추적하도록 하기 위해, imfill
함수를 사용하여 각 동전 내부의 영역을 채웁니다.
BW_filled = imfill(BW,"holes");
bwboundaries
함수를 사용하여 영상에 있는 모든 동전의 경계를 추적합니다. bwboundaries
는 셀형 배열을 반환하며, 각 셀에는 영상에 있는 객체에 대한 행과 열 좌표가 포함되어 있습니다.
boundaries = bwboundaries(BW_filled);
원본 회색조 영상 위에 모든 동전의 테두리를 플로팅합니다.
for k=1:10 b = boundaries{k}; plot(b(:,2),b(:,1),"g",LineWidth=3); end
추적을 위한 첫 번째 스텝 방향 선택하기
특정 객체의 경우 시작점으로 사용할 테두리 픽셀과 첫 번째 스텝의 방향(예: 북쪽 또는 남쪽)을 선택할 때 주의가 필요할 수 있습니다.
예를 들어, 어떤 객체에 구멍이 포함되어 있는데 객체에서 얇은 부분에 있는 픽셀을 시작 픽셀로 선택한 경우 첫 스텝의 방향을 어떻게 선택하는가에 따라 객체의 바깥쪽 테두리를 추적할 수도 있고 구멍의 안쪽 테두리를 추적할 수도 있습니다. 채워진 객체의 경우에는 첫 스텝 파라미터로 선택하는 방향이 비교적 덜 중요합니다.
설명을 돕기 위해 다음 그림에서 시작 픽셀이 객체의 얇은 부분에 있을 때 첫 번째 스텝이 북쪽으로 설정된 경우와 남쪽으로 설정된 경우에 추적되는 픽셀을 표시했습니다. 여기서 연결성은 디폴트 값인 8입니다.
첫 번째 스텝 방향이 경계 추적에 미치는 영향
참고 항목
bwboundaries
| bwtraceboundary
| visboundaries
| edge