최근 담당하고 있는 제품중 간단한 영상처리를 하는 제품이 있습니다.

전체적으로 볼때 흑백 영상을 이진화 후 비교하는 방식입니다. 

이진화를 하는 이유는 아무래도 값의 차이를 명확하게 해서 구분하기 쉽게 하기 위해서 이겠지요

그래서 컬러이미지를 흑백으로 만들고 이진화 하는 과정을 한번 해 보았습니다.

간단히 24비트 트루칼라를 grayscale 로 변환하고 다시 이진화 시키는  과정을 진행해 보았구요 

편의상 windows mfc 로 작성했습니다.


먼저 24비트 트루칼라는 R,G,B 값을 가지며, 이 것을 흑백 영상으로 바꾸기 위해서는 일반적으로 공식이 하나 있습니다.

1.jpg 

색상을 표현 하는 방법중 YIQ, YUV 는 TV 에서 사용되는 색 표현 방식입니다. 

여기서 Y 는 밝기정도를 나타내는데요, 흑백영상은 채도가 아닌 명도를 기준으로 만들어 지므로,

우리가 사용할 것도 바로 이 밝기 값인 Y 입니다.

RGB 에서 밝기 값을 추출 하는 공식이 바로 위 그림의 행렬식 입니다.

따라서 밝기Y는 0.299 * R + 0.587 * G + 0.114 * B 가 되겠습니다.



2.jpg

간단히 MFC 프로젝트중 다이얼로그 베이스로 생성 하고 버튼컨트롤과 PICTURE 컨트롤을 배치 했습니다.


original 버튼을 누르면 원본 컬러 영상을 보여주게하고, GRAYSCALE 버튼을 누르면 Gray 영상을, BINARIZATION 

버튼을 누르면 그레이영상을 다시 이진화 시켜 보여주는 간단한 화면 구성입니다.


먼저 원본 이미지를 보면.

3.jpg

이렇습니다.


이제 컬러이미지를 GRAYSCALE 로 변환하는 공식을 적용한 알고리즘 소스입니다.


-----------------------------------------

생략

int i,j;

BYTE R,G,B,GRAY;

//24 bit 트루컬러를 grayscale 로 변환

if(hinfo.biBitCount == 24)

{

for(i=0; i<hinfo.biHeight; i++)

{

for(j=0; j<hinfo.biWidth; j++)

{

B=lpimg[i*rwsize2+3*j];

G=lpimg[i*rwsize2+3*j+1];

R=lpimg[i*rwsize2+3*j+2];

GRAY = (BYTE)(0.299*R + 0.587*G + 0.114*B );


lpoutimg[i*rwsize2+3*j]=lpoutimg[i*rwsize2+3*j+1]=lpoutimg[i*rwsize2+3*j+2]=GRAY;

}

}

}

생략

-----------------------------------------------

BMP 파일의 R,G,B 값을 모두 계산된 GRAY 값으로 동일하게 바꿔 버리는 방식입니다.. 간단하지요.

4.jpg

GRAYSCALE 화 한 영상입니다. 


마지막으로 이진화 시키기 위한 소스입니다.

-----------------------------------------------

생략

if(hinfo.biBitCount == 24)

{

for(i=0; i<hinfo.biHeight; i++)

{

for(j=0; j<hinfo.biWidth; j++)

{

B=lpimg[i*rwsize2+3*j];

G=lpimg[i*rwsize2+3*j+1];

R=lpimg[i*rwsize2+3*j+2];

GRAY = (BYTE)(0.299*R + 0.587*G + 0.114*B );

if(GRAY > 100 ) GRAY = 255;

else GRAY = 0;

lpoutimg[i*rwsize2+3*j]=lpoutimg[i*rwsize2+3*j+1]=lpoutimg[i*rwsize2+3*j+2]=GRAY;


}

}

}

생략 

------------------------------------

먼저 gray 소스와 큰차이가 없습니다. 너무 거저먹는 듯하기도 한데요. gray 화 한 후 그 값을 제 임의대로 

100 을 기준으로 흑백으로 나누게 한 방식 입니다.


5.jpg

이진화한 이미지 입니다.