MATLAB 영상처리 기초 - 화질향상 및 공간필터링

[MATLAB 영상처리 기초 9] BW 이미지의 Objects 다루기 1 - bwconncomp( ), labelmatrix( ), regionprops( ), bwarea( )

toyprojects 2023. 9. 30. 19:50

 

 

 

BW 이미지의 Objects 다루기 소개 동영상

 

 

 

 

이진화된 이미지(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 입력 파라메터의 예를 보여줍니다. 가운데 회색의 픽셀이 대상 픽셀이며,

빨간색 화살표가 대상 픽셀과 인접한 픽셀들과의 연결방향을 나타냅니다.

 

 

좌: conn=4, 우: conn=8의 경우

 

 

 

만일, 위의 예제 매트릭스에서 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( ) 의 연산 

알고리즘을 보면, 특정 패턴조건마다 가중치가 다르게 지정되어 있음을 알 수 있습니다.

 

 

Algorithms of bwarea( )  (출처 1)

 

 

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