bwboundaries
이진 영상에서 객체 경계선 추적
구문
설명
예제
영상에 영역 경계선 겹치기
회색조 영상을 작업 공간으로 읽어 들입니다.
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
입력 인수
BW
— 이진 영상
2차원 숫자형 행렬 | 2차원 논리형 행렬
이진 영상으로, 2차원 논리형 또는 숫자형 행렬로 지정됩니다. 숫자형 입력값의 경우 0이 아닌 픽셀은 1
(true
)로 간주됩니다.
데이터형: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
conn
— 픽셀 연결성
8
(디폴트 값) | 4
픽셀 연결성으로, 다음 표에 있는 값 중 하나로 지정됩니다.
값 | 의미 | |
---|---|---|
2차원 연결성 | ||
| 경계가 서로 닿으면 픽셀이 연결됩니다. 두 개의 인접한 픽셀이 모두 켜져 있고 가로 또는 세로 방향으로 연결되어 있으면 두 픽셀은 동일한 객체에 속합니다. |
현재 픽셀은 회색으로 표시됩니다. |
| 경계 또는 코너가 서로 닿으면 픽셀이 연결됩니다. 두 개의 인접한 픽셀이 모두 켜져 있고 가로, 세로 또는 대각선 방향으로 연결되어 있으면 두 픽셀은 동일한 객체에 속합니다. |
현재 픽셀은 회색으로 표시됩니다. |
데이터형: double
options
— 부모 객체의 경계선과 자식 객체의 경계선을 둘 다 탐색할지 여부 지정
"holes"
(디폴트 값) | "noholes"
부모 객체의 경계선과 자식 객체의 경계선을 둘 다 탐색할지 여부를 지정하는 옵션으로, 다음 중 하나로 지정됩니다.
옵션 | 의미 |
---|---|
| 객체 경계선과 구멍 경계선을 둘 다 탐색합니다. 이는 디폴트 값입니다. |
| 객체(부모 및 자식 객체)의 경계선만 탐색합니다. 이 경우 성능이 향상될 수 있습니다. |
데이터형: char
| string
이름-값 인수
선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN
으로 지정합니다. 여기서 Name
은 인수 이름이고 Value
는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.
예: B = bwboundaries(BW,TraceStyle="pixeledge")
는 경계선 픽셀의 바깥쪽 가장자리를 따라 이진 영상 BW
의 객체 경계선을 추적합니다.
TraceStyle
— 추적 스타일
"pixelcenter"
(디폴트 값) | "pixeledge"
R2023a 이후
경계선을 따라가는 추적 스타일로, "pixelcenter"
또는 "pixeledge"
로 지정됩니다.
추적 스타일 | 의미 |
---|---|
| 경계선 픽셀의 중심을 연결하는 다각형으로 경계선을 추적합니다. |
| 경계선 픽셀의 바깥쪽 가장자리를 따라 형성되는 다각형으로 경계선을 추적합니다. |
CoordinateOrder
— 반환되는 꼭짓점 좌표의 순서
"yx"
(디폴트 값) | "xy"
R2023a 이후
반환되는 꼭짓점 좌표의 순서로, "yx"
또는 "xy"
로 지정됩니다.
추적 스타일 | 의미 |
---|---|
| (y, x) 좌표로 경계선 꼭짓점을 반환하며 ( |
| (x, y) 좌표로 경계선 꼭짓점을 반환합니다. |
출력 인수
B
— 경계선 꼭짓점의 좌표
p×1 셀형 배열
경계선 꼭짓점의 좌표로, p×1 셀형 배열로 반환됩니다. 여기서 p는 객체와 구멍의 개수입니다. B
의 처음 n
개의 셀은 객체 경계선이고 나머지 셀은 구멍 경계선입니다.
셀형 배열의 각 셀에는 q×2 행렬이 있습니다. 행렬의 각 행에는 경계선을 따라가는 꼭짓점 좌표가 들어 있습니다. q는 해당하는 영역의 경계선 꼭짓점 수입니다.
L
— 레이블 행렬
음이 아닌 정수로 구성된 2차원 행렬
인접 영역의 레이블 행렬로, 음이 아닌 정수로 구성된 2차원 행렬로 반환됩니다. k번째 영역은 L
에서 값이 k인 모든 요소를 포함합니다. L
로 표현되는 객체와 구멍의 개수는 max(L(:))
과 같습니다. L
에서 값이 0인 요소들은 배경을 구성합니다.
데이터형: double
n
— 찾은 객체의 개수
음이 아닌 정수
찾은 객체의 개수로, 음이 아닌 정수로 반환됩니다.
데이터형: double
A
— 경계선과 구멍 간 부모-자식 객체 종속성
희소 형식의 논리형 정사각 행렬
경계선과 구멍 간의 부모-자식 객체 종속성으로, 변 길이가 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.
확장 기능
C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.
사용법 관련 참고 및 제한 사항:
bwboundaries
함수는 C 코드 생성을 지원합니다(MATLAB® Coder™가 필요함). 일반적인MATLAB Host Computer
타깃 플랫폼을 선택할 경우bwboundaries
함수는 미리 컴파일된 플랫폼별 공유 라이브러리를 사용하는 코드를 생성합니다. 공유 라이브러리를 사용하면 성능 최적화가 유지되지만 코드를 생성할 수 있는 타깃 플랫폼이 제한됩니다. 자세한 내용은 Types of Code Generation Support in Image Processing Toolbox 항목을 참조하십시오.파라미터
conn
은 컴파일타임 상수여야 합니다.파라미터
options
는 컴파일타임 상수여야 합니다.반환 값
A
는 희소 행렬일 수는 없고 비희소 행렬만 될 수 있습니다.
GPU 코드 생성
GPU Coder™를 사용하여 NVIDIA® GPU용 CUDA® 코드를 생성할 수 있습니다.
사용법 관련 참고 및 제한 사항:
conn
인수는 컴파일타임 상수여야 합니다.options
인수는 컴파일타임 상수여야 합니다.반환 값
A
는 희소 행렬일 수는 없고 비희소 행렬만 될 수 있습니다.
버전 내역
R2006a 이전에 개발됨R2023a: 새로운 TraceStyle
및 CoordinateOrder
이름-값 인수
TraceStyle
이름-값 인수는 경계선 픽셀의 외부 가장자리를 따라 경계선을 추적하는 기능을 추가로 지원합니다. 전에 이 함수는 경계선 픽셀의 중심을 통과하는 경계선만 추적했습니다.
CoordinateOrder
이름-값 인수는 (x, y) 순서로 경계선 좌표를 반환하는 기능을 추가로 지원합니다. 전에 이 함수는 (y, x) 순서로만 경계선 좌표를 반환했습니다.
참고 항목
MATLAB 명령
다음 MATLAB 명령에 해당하는 링크를 클릭했습니다.
명령을 실행하려면 MATLAB 명령 창에 입력하십시오. 웹 브라우저는 MATLAB 명령을 지원하지 않습니다.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)