이진화된 이미지(Black & White)는 0, 1 단 두개의 픽셀값을 가집니다.
따라서 검정색과 흰색으로 이미지를 표현하며 - 예를들어 [0, 1] 사이의 - contrast,
brightness 등은 표현이 불가합니다.
BW 이미지는 주로 물체의 mask 또는 이미지상의 물체검출 (objects extraction/segmentation)
등에 주로 사용되며 본 블로그의 [MATLAB 영상처리 활용] 검출된 cell(세포) 컬러 하이라이트
주기 - cell extraction 에서 그 예를 찾아볼 수 있습니다.
RGB컬러 또는 gray scale 이미지의 BW변환은 별도의 주제로써 - [MATLAB 영상처리 기초3]
이미지의 픽셀값 다루기 - Binarization 참조 - 본 글에서는 간단하게 10-by-10 크기의 매트릭스
를 예로서 진행하겠습니다.
Objects 검색 및 labeling - bwconncomp( ), labelmatrix( )
다음은 10-by-10 크기의 매트릭스에 임의구역에 픽셀값 '1'을 지정하였습니다.
매트릭스에 픽셀값 '1'로 이루어진 구역을 하나의 object로 가정한다면, 가장 좌측의 object는
십자모양을 이루고, 가운데 object는 3-by-3의 사각형 모양에 1개의 픽셀이 덧붙어있는 모양
으로써 좌측의 object와 대각선 방향으로 접해 있습니다. 그리고 우측의 object는 1-by-3의
모양으로써 가운데 object와 접해 있습니다.
BW = zeros(10,10);
% object 1
BW(3,3) = 1;
BW(3,4) = 1;
BW(3,2) = 1;
BW(2,3) = 1;
BW(4,3) = 1;
% object 2
BW(3,7:9) = 1;
% object 3
BW(4:6,5:7) = 1;
BW(7,7) = 1;
BW이미지에서 object를 검출(extraction/segmentation)할때 기본적으로 픽셀값 '1'로
연결된 구역 - 픽셀값 '1'을 갖는 그룹 - 을 찾고 이를 object로 간주합니다.
MATLAB의 bwconncomp( )는 두가지 옵션으로써 픽셀값 '1'로 connected된 components
를 찾습니다; i) 픽셀의 좌,우,위,아래로 연결된 그룹을 하나의 object로 지정 (conn=4),
ii) 픽셀의 좌,우,위,아래 뿐만 아니라 대각선까지 고려 (conn=8).
밑의 이미지가 conn 입력 파라메터의 예를 보여줍니다. 가운데 회색의 픽셀이 대상 픽셀이며,
빨간색 화살표가 대상 픽셀과 인접한 픽셀들과의 연결방향을 나타냅니다.
만일, 위의 예제 매트릭스에서 bwconncomp( )의 입력 파라메터 conn=4 으로 지정한다면,
좌측의 object는 온전히 하나의 object, 가운데와 우측의 object는 위,아래로 연결되었으므로
통합된 하나의 object로 지정될 것입니다.
하지만 입력 파라메터 conn=8 의 경우에는 좌측과 가운데의 object가 대각선으로 연결되어
있기 때문에 좌,우,가운데 모두가 하나의 object로 지정될 것입니다.
다음은 bwconncomp( )의 입력 파라메터 conn=4 로써 검출한 objects에 label(= object의
번호)를 지정한 결과 입니다. 예상과 같이 좌측에는 object 1이, 가운데와 우측은 object 2로써
지정이 되었습니다.
% 4-connected components
cc4 = bwconncomp(BW,4);
for ii = 1:1:cc4.NumObjects
cc_BW = zeros(10,10);
px = cc4.PixelIdxList{ii};
cc_BW(px) = 1;
end
label4 = labelmatrix(cc4);
그리고 bwconncomp( ..., conn=8)의 결과는 예상과 같이 좌,우, 가운데 모두
object 1 로써 지정이 되었습니다.
% 8-connected components
cc8 = bwconncomp(BW,8);
for ii = 1:1:cc8.NumObjects
cc_BW = zeros(10,10);
px = cc8.PixelIdxList{ii};
cc_BW(px) = 1;
end
label8 = labelmatrix(cc8);
위 코드에서 bwconncomp( ..., conn=8) 의 반환값을 좀 더 보면, 다음과 같이 4개의 field를 갖는
struct 타입으로 이루어져 있습니다. 중요한것은 두가지 인데, i) 몇개의 object가 지정되었으며,
ii) 지정된 object의 index(BW이미지의 위치) - 이미지상 object의 [x,y] 좌표가 아님 - 표시가
그것입니다.
labelmatrix( )는 단지 bwconncomp( )에 의해 지정된 objects 들에게 순차적인 번호를 지정하는
역할을 할 뿐입니다.
Objects 면적/크기 구하기 - regionprops( )
이번에는 이진화 이미지에서 지정된 objects의 면적(area)를 구해보겠습니다.
BW 이미지에서 면적/크기(area)는 여러가지 의미로써 정의될 수 있습니다.
픽셀값 '1'을 갖는 픽셀들의 합을 면적이라고 할 수 있으며, 이미지의 resolution(분해능)
을 알고 있다면 그에 따른 면적을 연산할 수도 있습니다.
MATLAB의 bwarea( ) 함수는 BW이미지상의 objects의 면적을 연산해주는 명령어로써
앞서말한 방법들과는 또 다른 연산방식을 갖기 때문에 (출처 1) 주의를 가져야 합니다.
이진화 이미지에서 지정된 objects의 속성 - 예를들어 중심점(centroid), 윤곽선, 면적 등등 -
은 regionprops( ) 함수가 제공합니다. 이 함수는 다양한 정보를 제공하므로 본 글에서는
간단히 면적만을 구하고 다음글에서 이어서 소개하겠습니다.
앞에서 bwconncomp( ) 의 입력 파라메터 conn=4 or 8에 의해 지정 objects의 결과가 다름을
보았습니다. 따라서 regionprops( ) 에 의한 objects의 면적 또한 달라집니다.
여기서 면적은 단순히 픽셀값 '1' 갯수의 합을 의미합니다.
% area of objects each
area_cc4 = regionprops(cc4, 'Area');
area_cc8 = regionprops(cc8, 'Area');
bwconncomp(..., conn=4) 의 경우 이진화 이미지 "BW" 의 좌측 object는 5개의
픽셀로 이루어졌으므로 면적이 5, 가운데와 우측의 object는 하나의 object로
지정되므로 면적은 13을 나타냅니다.
그러나 conn=8의 경우 좌,우,가운데 모든 object가 하나의 object로 지정되어서
면적은 18을 갖습니다.
위에서 언급한 bwarea( )는 면적을 어떻게 표현할까요? 우선 bwarea( ) 의 연산
알고리즘을 보면, 특정 패턴조건마다 가중치가 다르게 지정되어 있음을 알 수 있습니다.
area_bwarea = bwarea(BW);
bwarea( ) 의 object 면적을 구하는 알고리즘의 해석을 위해 이진화 이미지 "BW" 의
좌측 object1 만을 예로 든다면, bwarea( )의 면적 연산결과는 5.5 입니다.
"BW" 위에 2-by-2 크기의 슬라이딩 윈도우가 한칸씩 이동한다고 가정한다면, 픽셀값 '1'
을 갖는 경우는 총 12번 일것입니다.
그리고 슬라이딩 윈도우 범위내에 단 한 픽셀만 '1'인 경우(이때 면적은 1/4)가 8번,
3개의 픽셀이 '1'인 경우(면적은 7/8)가 4번, 따라서 bwarea( )에 의한 object1의 면적은
5.5가 됩니다.
BW = zeros(10,10);
% object 1
BW(3,3) = 1;
BW(3,4) = 1;
BW(3,2) = 1;
BW(2,3) = 1;
BW(4,3) = 1;
area_bwarea = bwarea(BW)
마지막으로 본 글에 쓰인 모든 MATLAB 코드는 - bwarea( ) 부분은 제외 - 밑에 표시해 두었습니다.
BW = zeros(10,10);
% object 1
BW(3,3) = 1;
BW(3,4) = 1;
BW(3,2) = 1;
BW(2,3) = 1;
BW(4,3) = 1;
% object 2
BW(3,7:9) = 1;
% object 3
BW(4:6,5:7) = 1;
BW(7,7) = 1;
% 4-connected components
cc4 = bwconncomp(BW,4);
for ii = 1:1:cc4.NumObjects
cc_BW = zeros(10,10);
px = cc4.PixelIdxList{ii};
cc_BW(px) = 1;
end
label4 = labelmatrix(cc4);
% 8-connected components
cc8 = bwconncomp(BW,8);
for ii = 1:1:cc8.NumObjects
cc_BW = zeros(10,10);
px = cc8.PixelIdxList{ii};
cc_BW(px) = 1;
end
label8 = labelmatrix(cc8);
% area of objects each
area_cc4 = regionprops(cc4, 'Area');
area_cc8 = regionprops(cc8, 'Area');
area = bwarea(BW);
% extra example of using bwarea( )
BW = zeros(10,10);
% object 1
BW(3,3) = 1;
BW(3,4) = 1;
BW(3,2) = 1;
BW(2,3) = 1;
BW(4,3) = 1;
area_bwarea = bwarea(BW);
출처1: https://www.mathworks.com/help/images/ref/bwarea.html
Area of objects in binary image - MATLAB bwarea
You have a modified version of this example. Do you want to open this example with your edits?
www.mathworks.com