이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

bwboundaries

이진 영상에서 영역 경계선 추적

설명

예제

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

B = bwboundaries(BW,conn)은 객체의 외부 경계선을 추적합니다. 여기서 conn은 상위 객체의 경계선과 하위 객체의 경계선을 그릴 때 사용할 연결성을 지정합니다.

예제

B = bwboundaries(BW,conn,options)는 객체의 외부 경계선을 추적합니다. 여기서 options'holes' 또는 'noholes'이며, 다른 객체 내에 있는 구멍의 경계선을 같이 추적할지 여부를 지정합니다.

예제

[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

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

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

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

figure
spy(A);

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

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

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

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

입력 인수

모두 축소

이진 입력 영상으로, 2차원 논리형 또는 숫자형 행렬로 지정됩니다. BW는 0이 아닌 픽셀은 객체에 속하고 0인 픽셀은 배경이 되는 이진 영상이어야 합니다. 다음 그림은 이러한 구성요소를 보여줍니다.

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

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

의미

2차원 연결성

4-연결

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

8-연결

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

데이터형: double

상위 객체의 경계선과 하위 객체의 경계선 모두를 검색할지 여부를 지정하는 옵션으로, 다음 중 하나로 지정됩니다.

옵션

의미

'holes'

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

'noholes'

객체(상위 및 하위 객체)의 경계선만 검색합니다. 이 경우 성능이 향상될 수 있습니다.

데이터형: char | string

출력 인수

모두 축소

경계선 픽셀의 행과 열 좌표로, px1 셀형 배열로 반환됩니다. 여기서 p는 객체와 구멍의 개수입니다. 셀형 배열의 각 셀에는 qx2 행렬이 있습니다. 행렬의 각 행에는 경계선 픽셀의 행과 열 좌표가 들어 있습니다. q는 해당하는 영역의 경계선 픽셀 수입니다.

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

데이터형: double

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

데이터형: double

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

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

알고리즘

bwboundaries 함수는 제이콥(Jacob)의 중지 조건에 의해 수정된 무어-이웃(Moore-Neighbor) 추적 알고리즘을 구현합니다. 이 함수는 Digital Image Processing Using MATLAB(저자: Gonzalez, R. C., R. E. Woods, S. L. Eddins)의 초판(New Jersey, Pearson Prentice Hall, 2004)에 나와 있는 boundaries 함수를 기반으로 합니다.

참고 문헌

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

확장 기능

R2006a 이전에 개발됨