[OpenCV] Image Histogram Equalization (Color) – 2

글쓴이 Engineer Myoa 날짜

 

[OpenCV] Image Histogram Equalization (B&W) – 1

바로 이전 글에서 쓰다 만 느낌으로 B&W 영상의 Histogram Equalization을 수행하였다.

그렇다면 Color 영상은 어떤 이유로 바로 적용할 수 없는 것인지 생각할 필요가 있다.

 

Table of Contents
  1. Color Channel

Color Channel

사진은 빛의 삼원색을 정보를 담고있다. 이미지 센서와 모니터는 광학을 이용해 색을 표현하기 때문이다. 이 빛의 삼원색을 사용한 색공간을 RGB Color Space라고 한다.(잘 기억하도록 하자)

영상데이터는 RGB 각 색 채널 데이터를 YCbCr이나 HSV 색 공간으로 투영될 수 있다.

각 색공간은

YCbCr – 휘도(Luminance), 색차 (Chrominance – blue), 색차(Chrominance – red) 성분

HSV – 색상(Hue), 채도(Saturation), 명도(Value) 성분

으로 구성되어있다. RGB 색공간과 다른점은 특정 색정보를 저장하는 것이 아니라 Gray level과, 색정보를 축으로 영상 색공간을 구성한다.

(처참한 표현의 YUV)

그림으로 표현하려 했으나 심각하게 실패하였다.

HSV Color Space Model

YCbCr Color Space Model

사족이지만 이런 자료는 구글검색으로 얻는게 가장 좋은 것같다..

아무튼, 그림에서 볼 수 있듯이 RGB 색공간과는 다르게 별도의 명암을 구분하는 요소가 존재함을 알 수 있다. YCbCr에서는 U(Cb)와 V(Cr)외에 Y라는 Luminiance(휘도, 단위면적의 광도) 별도의 채널에 빛의 세기 정보(빛의 강도인 Intensity와 같게 생각할 수 있음)에 대해 가지고 있다.

 

가만보면 글의 내용이 전진없이 색공간들이 어쩌구 저쩌구 얘는 색정보네 쟤는 명암정보네… 하고있는데 이 이유를 눈치챘을지 모르겠다.

이유는 그 채널의 값을 사용하여 Histogram Equalization 해주면되기 때문이다.

즉, 1강의 Gray scale 이미지에서의 HistEqual이라고 생각하면 된다.

 

그래서 어쩌라고? 우리가 가지고 있는 건 RGB 영상인데?

어쩌긴.. 기본적으로 영상계에서 색공간들은 상호간 계산으로 변환이 가능하다.

즉, RGB to HSV, HSV to RGB, YCbCr to RGB 등…  변환식을 사용하면 다양하게 변환이 가능하다.

OpenCV에서는 다양한 연산을 위해 색공간 변환을 지원하는 함수가 포함되어있다.

만약 사용하려는 환경이 OpenCV같은 라이브러리를 사용할 수 없다면, Wikipedia의 각 색공간 정보 페이지를 참고하여 식으로 연산할 수 있다. 물론 모든 픽셀에 대해 연산해야하므로 O(n^2)임은 당연한것이다.

 

백날 주절주절해서 무엇할까 맘 편히 소스코드로 대화하고자 한다.

	Mat src = imread("D:\\tt.png");
	if (src.empty()) {
		return -1;
	}


	Mat srcHsv, srcYcbcr, destHsv, destYcbcr;
	cvtColor(src, srcHsv, COLOR_BGR2HSV);
	cvtColor(src, srcYcbcr, COLOR_BGR2YCrCb);

	vector<Mat> channelsHsv, channelsYcbcr;
	split(srcHsv, channelsHsv);
	split(srcYcbcr, channelsYcbcr);

	equalizeHist(channelsHsv[2], channelsHsv[2]);
	equalizeHist(channelsYcbcr[0], channelsYcbcr[0]);

	merge(channelsHsv, destHsv);
	merge(channelsYcbcr, destYcbcr);

	cvtColor(destHsv, destHsv, COLOR_HSV2BGR);
	cvtColor(destYcbcr, destYcbcr, COLOR_YCrCb2BGR);

	imshow("Source", src);
	imshow("Destination HSV", destHsv);
	imshow("Destination YCbCr", destYcbcr);
	waitKey(0);

코드에서 주의할 점은 HSV에서 필요한 Value는 H, S, V 이므로 세번째 채널에 해당되고 YCbCr에서 필요한 휘도 Y는 첫번째 채널에 해당된다. 인덱스에 주의하도록 하자.

 

아래는 원본, HSV 색공간에서 HistEqual, YCbCr 색공간에서 HistEqual한 결과물이다.

두개의 다른 색공간에서 주 Intensity 성분을 뽑아 Histogram Equalizing 한 결과가 같음을 알 수 있다.

 

결과적으로 R, G, B에 대해 색 정보를 개별적으로 가지던 RGB 색 공간과는 다르게 Luminiance, Gray Value와 같은 Intensity정보를 갖는 색 공간으로 변환하여 Histogram Equalizing을 수행할 수 있음을 알 수 있으며, 각 색 공간에서의 변환 결과는 같음을 보았다.

 

참고문헌

https://ko.wikipedia.org/wiki/YCbCr

https://ko.wikipedia.org/wiki/HSV_%EC%83%89_%EA%B3%B5%EA%B0%84

 

카테고리: 강의

1,264개의 댓글

답글 남기기

Avatar placeholder

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다