Main Content

bwboundaries

이진 영상에서 객체 경계선 추적

설명

예제

B = bwboundaries(BW)는 이진 영상 BW에 있는 객체의 외부 경계선뿐 아니라 이러한 객체 내에 있는 구멍의 경계선도 추적합니다. bwboundaries는 부모 객체에 완전히 둘러싸인 자식 객체의 외부 경계선과 구멍 경계선도 추적합니다. 이 함수는 경계선 픽셀 위치로 구성된 셀형 배열인 B를 반환합니다.

다음 그림은 해당 성분들을 보여줍니다.

Parent objects in a binary image are white blobs that can have holes. Children objects appear as islands within the holes.

B = bwboundaries(BW,conn)은 객체 경계선을 추적할 때 사용할 연결성 conn을 지정합니다.

예제

B = bwboundaries(___,options)는 객체의 외부 경계선을 추적하며, options"holes" 또는 "noholes"로 설정하여 구멍의 경계선을 포함할지 여부를 지정합니다.

B = bwboundaries(___,Name=Value)이름-값 인수를 사용 (R2023a 이후)하여 추적 스타일과 반환되는 꼭짓점 좌표의 순서를 지정합니다.

예제

[B,L] = bwboundaries(___)는 객체와 구멍에 레이블을 지정하는 레이블 행렬 L도 반환합니다.

예제

[B,L,n,A] = bwboundaries(___)는 찾은 객체의 수 n과 인접 행렬 A도 반환합니다.

예제

모두 축소

회색조 영상을 작업 공간으로 읽어 들입니다.

I = imread('rice.png');

국소 가변 이진화를 사용하여 회색조 영상을 이진 영상으로 변환합니다.

BW = imbinarize(I);

영상에서 영역의 경계선을 계산한 후 영상에 경계선들을 겹칩니다.

[B,L] = bwboundaries(BW,'noholes');
imshow(label2rgb(L, @jet, [.5 .5 .5]))
hold on
for k = 1:length(B)
   boundary = B{k};
   plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2)
end

Figure contains an axes object. The axes object contains 152 objects of type image, line.

이진 영상을 작업 공간으로 읽어 들입니다.

BW = imread('blobs.png');

영상에서 영역의 경계선을 계산합니다.

[B,L,N,A] = bwboundaries(BW);

경계선이 겹친 채로 영상을 표시합니다. 레이블 행렬을 기반으로 하여, 모든 경계선 옆에 영역 번호를 추가합니다. 개별 레이블을 읽으려면 축소 툴을 사용하십시오.

imshow(BW); hold on;
colors=['b' 'g' 'r' 'c' 'm' 'y'];
for k=1:length(B),
  boundary = B{k};
  cidx = mod(k,length(colors))+1;
  plot(boundary(:,2), boundary(:,1),...
       colors(cidx),'LineWidth',2);

  %randomize text position for better visibility
  rndRow = ceil(length(boundary)/(mod(rand*k,7)+1));
  col = boundary(rndRow,2); row = boundary(rndRow,1);
  h = text(col+1, row-1, num2str(L(row,col)));
  set(h,'Color',colors(cidx),'FontSize',14,'FontWeight','bold');
end

Figure contains an axes object. The axes object contains 79 objects of type image, line, text.

spy 함수를 사용하여 인접 행렬을 표시합니다.

figure
spy(A);

Figure contains an axes object. The axes object with xlabel nz = 19 contains a line object which displays its values using only markers.

이진 영상을 작업 공간으로 읽어 들입니다.

BW = imread('blobs.png');

경계선을 계산합니다.

[B,L,N] = bwboundaries(BW);

객체 경계선은 빨간색으로 표시하고 구멍 경계선은 녹색으로 표시합니다.

imshow(BW); hold on;
for k=1:length(B),
   boundary = B{k};
   if(k > N)
     plot(boundary(:,2), boundary(:,1), 'g','LineWidth',2);
   else
     plot(boundary(:,2), boundary(:,1), 'r','LineWidth',2);
   end
end

Figure contains an axes object. The axes object contains 40 objects of type image, line.

영상을 작업 공간으로 읽어 들입니다.

BW = imread('blobs.png');

부모 객체의 경계선은 빨간색으로 표시하고 이에 속하는 구멍은 녹색으로 표시합니다.

[B,L,N,A] = bwboundaries(BW); 
figure; imshow(BW); hold on; 
% Loop through object boundaries  
for k = 1:N 
    % Boundary k is the parent of a hole if the k-th column 
    % of the adjacency matrix A contains a non-zero element 
    if (nnz(A(:,k)) > 0) 
        boundary = B{k}; 
        plot(boundary(:,2),... 
            boundary(:,1),'r','LineWidth',2); 
        % Loop through the children of boundary k 
        for l = find(A(:,k))' 
            boundary = B{l}; 
            plot(boundary(:,2),... 
                boundary(:,1),'g','LineWidth',2); 
        end 
    end 
end

Figure contains an axes object. The axes object contains 23 objects of type image, line.

입력 인수

모두 축소

이진 영상으로, 2차원 논리형 또는 숫자형 행렬로 지정됩니다. 숫자형 입력값의 경우 0이 아닌 픽셀은 1(true)로 간주됩니다.

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

픽셀 연결성으로, 다음 표에 있는 값 중 하나로 지정됩니다.

의미

2차원 연결성

4

경계가 서로 닿으면 픽셀이 연결됩니다. 두 개의 인접한 픽셀이 모두 켜져 있고 가로 또는 세로 방향으로 연결되어 있으면 두 픽셀은 동일한 객체에 속합니다.

Center pixel connected to four pixels

현재 픽셀은 회색으로 표시됩니다.

8

경계 또는 코너가 서로 닿으면 픽셀이 연결됩니다. 두 개의 인접한 픽셀이 모두 켜져 있고 가로, 세로 또는 대각선 방향으로 연결되어 있으면 두 픽셀은 동일한 객체에 속합니다.

Center pixel connected to eight pixels

현재 픽셀은 회색으로 표시됩니다.

데이터형: double

부모 객체의 경계선과 자식 객체의 경계선을 둘 다 탐색할지 여부를 지정하는 옵션으로, 다음 중 하나로 지정됩니다.

옵션

의미

"holes"

객체 경계선과 구멍 경계선을 둘 다 탐색합니다. 이는 디폴트 값입니다.

"noholes"

객체(부모 및 자식 객체)의 경계선만 탐색합니다. 이 경우 성능이 향상될 수 있습니다.

데이터형: char | string

이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

예: B = bwboundaries(BW,TraceStyle="pixeledge")는 경계선 픽셀의 바깥쪽 가장자리를 따라 이진 영상 BW의 객체 경계선을 추적합니다.

R2023a 이후

경계선을 따라가는 추적 스타일로, "pixelcenter" 또는 "pixeledge"로 지정됩니다.

추적 스타일

의미

"pixelcenter"

경계선 픽셀의 중심을 연결하는 다각형으로 경계선을 추적합니다.

"pixeledge"

경계선 픽셀의 바깥쪽 가장자리를 따라 형성되는 다각형으로 경계선을 추적합니다.

R2023a 이후

반환되는 꼭짓점 좌표의 순서로, "yx" 또는 "xy"로 지정됩니다.

추적 스타일

의미

"yx"

(y, x) 좌표로 경계선 꼭짓점을 반환하며 (row, column) 좌표와 순서가 같습니다.

"xy"

(x, y) 좌표로 경계선 꼭짓점을 반환합니다.

출력 인수

모두 축소

경계선 꼭짓점의 좌표로, p×1 셀형 배열로 반환됩니다. 여기서 p는 객체와 구멍의 개수입니다. B의 처음 n개의 셀은 객체 경계선이고 나머지 셀은 구멍 경계선입니다.

셀형 배열의 각 셀에는 q×2 행렬이 있습니다. 행렬의 각 행에는 경계선을 따라가는 꼭짓점 좌표가 들어 있습니다. q는 해당하는 영역의 경계선 꼭짓점 수입니다.

인접 영역의 레이블 행렬로, 음이 아닌 정수로 구성된 2차원 행렬로 반환됩니다. k번째 영역은 L에서 값이 k인 모든 요소를 포함합니다. L로 표현되는 객체와 구멍의 개수는 max(L(:))과 같습니다. L에서 값이 0인 요소들은 배경을 구성합니다.

데이터형: double

찾은 객체의 개수로, 음이 아닌 정수로 반환됩니다.

데이터형: double

경계선과 구멍 간의 부모-자식 객체 종속성으로, 변 길이가 max(L(:))인 희소 형식의 논리형 정사각 행렬로 반환됩니다. A의 행과 열은 B에 저장된 경계선의 위치에 해당합니다. A(i,j)=1은 객체 i가 객체 j의 자식임을 의미합니다. 다음과 같이 A를 사용하여 k번째 경계선에 의해 둘러싸인 경계선, 또는 이를 둘러싸는 경계선을 찾을 수 있습니다.

enclosing_boundary  = find(A(k,:));
enclosed_boundaries = find(A(:,k));

데이터형: double

알고리즘

bwboundaries 함수는 제이콥(Jacob)의 중지 조건에 의해 수정된 무어-이웃(Moore-Neighbor) 추적 알고리즘을 구현합니다. 이 함수는 Digital Image Processing Using MATLAB [1]의 초판에 나와 있는 boundaries 함수를 기반으로 합니다.

참고 문헌

[1] Gonzalez, R. C., R. E. Woods, and S. L. Eddins, Digital Image Processing Using MATLAB, New Jersey, Pearson Prentice Hall, 2004.

확장 기능

버전 내역

R2006a 이전에 개발됨

모두 확장