이진화란?



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

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

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

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

검정색과(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 대한민국 최고의 컴퓨터비젼 커뮤니티)





 

Posted by 아몰라