오늘은 손쉽게 구현할 수 있는 영상 이진화(Binarization)에 대해서 설명해 드리도록 하겠습니다. 영상 이진화란 RGB 값으로 다양하게 분포되어 있는 색상값을 0 과 1 만의 값으로 표현하는 것 입니다. 실제적으로는 RGB 컬러 영상에을 흑백(Gray channel)영상으로 바꾼뒤 특정 임계값(Threshold)을 기준으로 초과 값은 255 로, 이하 값은 0 변환하게 되지요. 아래 T9-camera 윈도우 영상과 T9-output 윈도우 영상을 보시면 쉽게 이해가 가실 겁니다. T 값 128 을 기준으로 초과값은 255 로 변환되어 흰색으로 보여지고 있고 이하 값은 0 으로 변환되어 검은색으로 보여지고 있습니다.
- 실행 결과
소스 코드가 다소 길어 졌지만 크게 보면 카메라를 입력 받는 소스에서 이진화 함수인 cvThreshold() 함수가 추가 된 것 밖에는 없습니다. 이 함수를 사용할 때 주의해야 할 것은 항상 흑백 이미지로 변환해서 넣어 주어야 한다는 것.
cvThreshold(gray, output, threshold, 255, CV_THRESH_BINARY);
위 함수는 입력된 gray 이미지에서 threshold 값을 초과한 값은 255 로 변환하고 이하는 0 으로 변환하여 output 이미지를 만들어 냅니다. 이와는 반대로 적용되게 한다거나 일정 값 이하는 0 으로 변환하고 초과되는 값만 보여주는 등의 옵션이 있습니다. 옵션을 변화 시켜가며 변화되는 모습을 익혀 보도록 합시다.
CV_THRESH_BINARY : threshold 값 초과는 255, 이하는 0
CV_THRESH_BINARY_INV : threshold 값 초과는 0, 이하는 255
CV_THRESH_TRUNC : threshold 값 초과는 threshold, 이하는 그대로
CV_THRESH_TOZERO : threshold 값 초과는 그대로, 이하는 0
CV_THRESH_TOZERO_INV : threshold 값 초과는 0, 이하는 그대로
이번 프로그램에는 Trackbar 가 추가되었는데 이는 나중에도 유용하게 쓰이므로 잘 익혀 두시기 바랍니다. 아래 함수는 "T9-camera" 이름의 윈도우에 0 부터 255 범위를 같는 "T" 이름의 Trackbar 를 붙입니다. Trackbar 의 초기 위치는 threshold 값이 결정하며 bar 를 조절하여도 그 값은 threshold 변수에 들어가게 됩니다. 그리고 현재는 NULL 로 되어 있지만 이부분에 함수명을 적으면 bar 가 변경될 때마다 해당하는 함수를 호출하게 됩니다. 이 함수는 반드시 int 형 변수 하나를 가지고 있어야 하고 이 변수에 Trackbar 의 값이 넘어 오므로 함수에서 값을 가지고 영상처리를 해주면 됩니다.
cvCreateTrackbar("T", "T9-camera", &threshold, 255, NULL);
cvCvtColor() 함수는 Color 변환을 해주는 함수입니다. 아래 함수는 RGB 채널을 가지고 있는 image 를 Gray 채널로 바꾸어서 gray 에 넣어주는 역할을 합니다. 마지막 인자는 Color 변환 모드인데 여기에도 다양한 옵션이 존재하므로 필요한 모델을 사용하시면 됩니다.
cvCvtColor(image, gray, CV_RGB2GRAY);
CV_RGB2GRAY : 흑백으로 변환
CV_RGB2YCrCb : 주로 Skin Color 모델을 할때 변환( 손 제스쳐 인식, 얼굴 인식 )
CV_RGB2HLS
CV_RGB2HSV
CV_RGB2Lab
CV_RGB2Luv
- 소스 코드(압축 파일 첨부)
#include <cv.h>
#include <highgui.h>
void main()
{
int i, threshold = 128; // 임계값(Threshold) 설정
IplImage* image = 0;
IplImage* output = 0;
IplImage* gray = 0;
CvCapture* capture = cvCaptureFromCAM(0); // 카메라 연결
cvNamedWindow( "T9-camera", 0 ); // 원본 영상을 띄울 윈도우
cvNamedWindow( "T9-output", 0 ); // 결과 영상을 띄울 윈도우
cvCreateTrackbar("T", "T9-camera", &threshold, 255, NULL); // "T9-camera" 윈도우에 bar 를 붙이고 threshold 값을 변화 시킴
// 이름은 "T" 를 붙이고 0 부터 255 사이의 범위값을 가짐
while(1) {
cvGrabFrame( capture );
image = cvRetrieveFrame( capture );
cvShowImage( "T9-camera", image );
if(!output){
gray = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 1); // 흑백 이미지 생성
output = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 1); // 흑백 이미지 생성
} cvCvtColor(image, gray, CV_RGB2GRAY); // 컬러를 흑백으로 변환
if( cvWaitKey(10) >= 0 )
break; // 영상의 각 픽셀(x,y) 값이 threshold 값의 초과는 255 로, 그 이하는 0 으로 변환
cvThreshold(gray, output, threshold, 255, CV_THRESH_BINARY);
output->origin = image->origin; // 방향이 뒤집어 진것을 바로 잡아줌
cvShowImage( "T9-output", output );
}
cvReleaseImage( &gray );
cvReleaseImage( &output );
cvReleaseCapture( &capture );
cvDestroyWindow( "T9-output" );
cvDestroyWindow( "T9-camera" );
}
Copyrights (c) 2005 OpenCV.co.kr.
All rights reserved. Media System Lab.,
Yonsei University by Dong-Chul Kim
- T9T9.com
'CLASS' 카테고리의 다른 글
[OpenCV] OpenCV 를 이용한 Hough Transform 중급강좌 (3) | 2006.01.10 |
---|---|
[OpenCV] 윤곽(contour) 추출, 에지(edge) 추출 중급강좌 (0) | 2006.01.03 |
[OpenCV] OpenCV 기초강좌 - 2편 : 카메라 입력받기 (7) | 2005.11.06 |
[OpenCV] 입력 받은 영상 AVI 로 저장하기 추가 소스 - DirectX 버전 (3) | 2005.11.05 |
[OpenCV] OpenCV 기초강좌 - 기본 셋팅 소스 for VC++ 6.0 & VS.Net (0) | 2005.11.04 |