본문 바로가기

CLASS

[OpenCV] 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


- 소스 코드(압축 파일 첨부)

OpenCV_threshold.zip


#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
  • Karuna 2010.06.06 22:42

    안녕하세요. OpenCV 공부를 이제 막 시작하려는 참에 좋은 강좌를 볼 수 있어서 다행입니다.ㅎㅎ
    제가 예제를 보고 차근차근 따라해보고 있는 중입니다만
    오류가 나서 여쭤볼까 합니다.ㅠㅠ

    gray = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 1);

    가 있는 라인을 추가하고 나면

    "프로시저 시작 지점 cvCreateCameraCapture을(를) DLL libcxcore200.dll에서 찾을 수 없습니다."

    라는 오류가 발생합니다.
    혹시나해서 cvGetSize(image) 부분을
    CvSize s = cvGetSize(image); 로 빼고
    s를 사용했는데도 그런 오류가 나네요...

    무슨 오류인지 혹시 알고계신다면 알려주시면 감사하겠습니다.ㅠㅠ

  • 러너 2012.10.15 21:52

    소스를 컴파일 시켰는데 카메라 인식이
    잘되지 않는지 그냥 어두운 화면만 나오는데
    어떻게 해결해야 하나요??

  • 초보손 2013.01.29 11:06

    잘보다갑니다^^

  • 초보초보 2013.08.07 09:28

    잘 보고 갑니다.
    좋아요!!! 대박!!!

  • kanais 2015.04.14 17:43

    관리자의 승인을 기다리고 있는 댓글입니다

  • 지식은 사랑입니다 2015.11.07 17:40

    관리자의 승인을 기다리고 있는 댓글입니다

  • karuna 2016.04.05 13:53

    관리자의 승인을 기다리고 있는 댓글입니다