[초급] OpenCV 를 이용한 영상 이진화(Binarization) 강좌
 
오 늘은 손쉽게 구현할 수 있는 영상 이진화(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" );
}

+ Recent posts