이진화란?



요즘 카메라로 사진을 찍으면 칼라로 사진을 보통 사진을 찍게 되는데

사람이 보기에는 그냥 빨간색과 검정색옷을 입고 주변 색들도 눈으로 보이는 것과 같지만...

컴퓨터는 조명이나 그림자, 잡영 등에 영향을 받아서 색이 다 다르게 보인다.

그래서 컴퓨터에게 더 쉽게 이해하기 쉬운 영상으로 만들어주는 것이 이진화이다.

검정색과(0) 흰색(255)로 컬러 값을 바꾸는 것이다.



IplImage 타입의 영상을 이진화 하기 위해 사용하는 함수는 cvThreshold라는 함수이며,
이는 입력으로 들어가는 영상의 각 채널을 이진화 한다.
이런 이유로 컬러영상(3개 채널)을 이진화 하는 경우, R, G, B 각각을 이진화 하기 때문에
아래와 같이 의도하지 않은 영상을 얻게 될 수도 있다.



그런 이유 때문에 이진화 전에는 cvCvtColor()를 이용하여 Gray로 변환 후 이진화 한다.
cvCvtColor()의 세 번 째 인수는 어떤 컬러맵으로 변환할 것인지 선택할 수 있으며,
OpenCV에서 제공하는 방법들은 CV_BGR2GRAY 뿐만 아니라 
CV_BGR2YCrCb, CV_BGR2HSV, CV_BGR2Lab 등 여러가지이며 이는 cv.h 파일에서 확인할 수 있다.


cvThreshold() 함수는 실제로 이진화를 수행하는 함수로,
세 번 째 인수는 문턱치를 설정하고,
네 번 째 인수는 문턱치를 넘어선 픽셀들을 어떤 값으로 설정할 것인지를,
다섯 번 째 인수는 이진화 알고리즘을 선택할 수 있다.

중요함수

1.

cvThreshold(const CvArr*  src, CvArr*  dst, double  threshold, double  max_value, int threshold_type)

원본영상, 이진화가 된 후 저장될 영상, 경계가 되는 수치값(임계값), 임계 값을 넘는 픽셀값을 바꿔줄 최대값 설정,이진화방식)


이진화방식

#define CV_THRESH_BINARY      0  //  임계 값 이하 : 0, 임계 값 초과 : 1
#define CV_THRESH_BINARY_INV  1  // 임계 값 이하 : 1, 임계 값 초과 : 0 
#define CV_THRESH_TRUNC       2  // 임계 값 이하는 변화 없음, 임계 값 초과는 임계 값
#define CV_THRESH_TOZERO      3  //   임계 값 이하는 0, 임계 값 초과는 그대로
#define CV_THRESH_TOZERO_INV  4  // 임계 값 이하는 그대로, 임계 값 초과는 0



2.

cvCvtColor( const CvArr* src, CvArr* dst, int code )

원본영상, 변환후 저장될 영상, Color 변환모드


Color 변환모드

CV_RGB2GRAY  - 흑백으로 변환
CV_RGB2YCrCb  -      주로 Skin Color 모델을 할 때 변환
CV_RGB2HLS  - H(Hue색상), L(Luminance,휘도),S(Saturation,채도)
CV_RGB2HSV - 모든 컬러를 Hue, Saturation, Value로 표현하는 방식
CV_RGB2Lab - L은 밝기인 명도, a 조합은 녹색에서 적색의 보색 b 조합은 황색에서 청색의 보색
CV_RGB2Luv -  CIE Yxy색표계에서 지각적 등보성을 보완한 색 공간



결과










[참고] OpenCV 강좌 04. 영상 이진화 하기 (OpenCV KOREA 대한민국 최고의 컴퓨터비젼 커뮤니티)





 

'프로그래밍 기초 > 영상처리' 카테고리의 다른 글

Haar분류기에 대한 정보  (0) 2011.11.16
얼굴인식의 역사, 이슈, 알고리즘, Process flow, 기본적인 기술 비교  (1) 2011.11.06
이진화하기  (0) 2011.11.02
마우스 이벤트  (0) 2011.10.31
키보드 이벤트 처리  (0) 2011.10.30
문자 출력  (1) 2011.10.30
Posted by 아몰라

댓글을 달아 주세요

cVSetMouseCallback 함수로 이벤트 핸들러 함수를 지정하고, 핸들러 함수에서 이벤트를 처리한다.


window_name = 이벤트를 발생시킬 윈도우의 이름을 적는다.
on_mouseEvent = 마우스 이벤트를 처리할 핸들러 함수를 적는다. 함수명은 사용자가 임의로 정해도된다. 단,  인수의 자료형과 의미는 미리 정해져있다.
param = 핸들러 함수로 전달될 사용자 정의 인수이다.



이렇게 인수가 정해져있다.

event = 마우스 이벤트
flags = 마우스 이벤트가 발생했을 때 마우스 버튼, CTRL, SHIFT, ALT 키를 눌렀는지 확인하기 위해 사용된다.
param = 사용자 정의 인수


마우스 이벤트(event)상수

CV_EVENT_MOUSEMOVE      마우스를 움직임
CV_EVENT_LBUTTONDOWN   왼쪽버튼 DOWN
CV_EVENT_RBUTTONDOWN   오른쪽 버튼 DOWN
CV_EVENT_LBUTTONUP        왼쪽 버튼 UP
CV_EVENT_RBUTTONUP        오른쪽 버튼 UP
CV_EVENT_LBUTTONDBLCLK 왼쪽 버튼 더블클릭
CV_EVENT_RBUTTONDBLCLK 오른쪽 버튼 더블클릭



마우스 flags 상수

CV_EVENT_FLAG_LBUTTON  왼쪽버튼누름
CV_EVENT_FLAG_RBUTTON 오른쪽버튼누름
CV_EVENT_FLAG_CTRLKEY CTRL 키를 누름
CV_EVENT_FLAG_SHIFTKEY SHIFT 키를 누름
CV_EVENT_FLAG_ALTKEY   ALT 키를 누름




예제 소스


#include "stdafx.h"
#include <cv.h>
#include <highgui.h> // 키보드 마우스 트랙바 이벤트 처리 기능을 갖는 사용자 인터페이스 함수를 지원한다.

 
void on_eventhandle(int event, int x, int y, int flags, void* param);

int main()
{
  IplImage    *dstImage;
  dstImage = cvCreateImage(cvSize(512, 512), IPL_DEPTH_8U, 3);
 cvSet(dstImage, CV_RGB(255, 255, 255));
 
 cvNamedWindow("Mouse Event Handling", CV_WINDOW_AUTOSIZE);
    cvShowImage("Mouse Event Handling", dstImage);

 cvSetMouseCallback("Mouse Event Handling", on_eventhandle,  (void *)dstImage);
    cvWaitKey(0);

 cvDestroyAllWindows();
 cvReleaseImage(&dstImage);
    return 0;
}

void on_eventhandle (int event, int x, int y, int flags, void* param) //핸들러 함수
{
 IplImage    *image;
 image = (IplImage *)param;
 
 switch(event)
 {
  case CV_EVENT_LBUTTONDOWN:
  if(flags & CV_EVENT_FLAG_SHIFTKEY) // 쉬프트를 누르고 클릭시 네모
    cvRectangle(image, cvPoint(x-5, y-5), cvPoint(x+5, y+5), CV_RGB(255, 0, 0));
  else //아니면 원
  {
   cvCircle(image, cvPoint(x, y), 5, CV_RGB(0, 0, 255), 5);
  }
  break;
 
 case CV_EVENT_RBUTTONDOWN:
  cvCircle(image, cvPoint(x, y), 5, CV_RGB(255, 0, 0), 5);
  break;
 }
    cvShowImage("Mouse Event Handling", image);
}


참조 - OpenCv 프로그래밍

 

Posted by 아몰라

댓글을 달아 주세요

void main()
{
 IplImage    *dstImage;
  dstImage = cvCreateImage(cvSize(512, 512), IPL_DEPTH_8U, 3);
 cvSet(dstImage, CV_RGB(255, 255, 255));
 cvNamedWindow("키보드이벤트", CV_WINDOW_AUTOSIZE);
    cvShowImage("키보드이벤트", dstImage);

    int nKey = 0;

    while(1)
 {  
  nKey = cvWaitKey(0);
  //cvWaitKey 함수는 delay <= 0 이면 키보드에서 키가 눌러질 때 까지 무한히 기다린다.
  printf("입력하시오 : %x\n", nKey);
        if(nKey == 0x1B) //ESC이면 반환한다.
          break;
    }
 cvDestroyAllWindows();
 cvReleaseImage(&dstImage);

}


'프로그래밍 기초 > 영상처리' 카테고리의 다른 글

이진화하기  (0) 2011.11.02
마우스 이벤트  (0) 2011.10.31
키보드 이벤트 처리  (0) 2011.10.30
문자 출력  (1) 2011.10.30
선, 사각형, 원, 타원 그리기  (0) 2011.10.30
카메라 입력받기  (0) 2011.10.30
Posted by 아몰라

댓글을 달아 주세요

이전버튼 1 2 3 4 5 6 7 ··· 52 이전버튼