오늘은 http://opencvexamples.blogspot.com/p/learning-opencv-functions-step-by-step.html에 있는 네번째 예제를 따라해보겠습니다. 


4. Convert RGB to gray / other color spaces


저는 RGB이미지를 그레이 이미지와 HSV 이미지로 변환해봤습니다. 

그레이 이미지는 밝기 정보로만 이미지를 나타내는 것입니다. 

HSV 이미지는 Hue(색조 or 색상), Saturation(채도),  Value(명도), 이렇게 3가지 성분으로 이미지를 표현하는 것입니다. 왜냐하면 이 3가지가 빛의 3속성이기 때문입니다. 

색조는 색상 자체를 의미하고, 빛의 파장의 길이에 의해 결정됩니다. 눈으로 볼 수 있는 빛인 가시광선에서 파장이 길면 빨간색, 짧으면 보라색 계열로 보입니다. 채도는 색의 순도로 색의 맑고 탁한 정도를 의미합니다. 순색의 경우 채도가 높고, 색을 섞을수록 채도가 낮아져서 탁색 or 회색이 됩니다. 명도는 색의 밝고 어두운 정도입니다. 

먼셀의 표색계인 그림 1을 보시면 색상, 명도, 채도에 대해서 쉽게 이해하실 수 있습니다.

그림 1. 먼셀 표색계 http://tip.daum.net/question/51764357


구현을 위한 소스코드는 아래와 같습니다.

#include <opencv2/core/core.hpp>

#include <opencv2/highgui/highgui.hpp>

#include <opencv2/imgproc/imgproc.hpp>

#include <iostream>


using namespace cv;

using namespace std;


int main()

{

Mat image;

image = imread("hee.jpg", CV_LOAD_IMAGE_COLOR);


if (!image.data)

{

cout << "Could not open or find the image" << std::endl;

return -1;

}


Mat gray_image;

Mat HVS_image;


cvtColor(image, gray_image, CV_BGR2GRAY); // RGB이미지에서 그레이 이미지로 변환

cvtColor(image, HVS_image, CV_BGR2HSV); // RGB이미지에서 HSV 이미지로 변환


namedWindow("RGB image", CV_WINDOW_AUTOSIZE);

imshow("RGB image", image);


namedWindow("Gray image", CV_WINDOW_AUTOSIZE);

imshow("Gray image", gray_image);


namedWindow("HVS image", CV_WINDOW_AUTOSIZE);

imshow("HVS image", HVS_image);


waitKey(0);

return 0;


}


컬러 공간 변화에 사용되는 함수는 바로 cvtColor입니다. 

  • 1번째 인수: 변환할 이미지를 입력해줍니다.

  • 2번째 인수: 변환된 이미지를 대입해줄 변수를 입력해줍니다.

  • 3번째 인수: 어떤 컬러 공간에서 어떤 컬러 공간으로 변환해줄지 설정해줍니다. opencv에서는 매우 다양한 컬러 공간의 변환을 지원하는데, 그것은 http://docs.opencv.org/master/de/d25/imgproc_color_conversions.html#color_convert_rgb_xyz를 참고하세요. 


전시된 이미지 결과는 그림 2에 있습니다. 영상처리에서 자주 사용되는 레나 대신 제 여자친구 사진을 사용했습니다. 

그림 2. 왼쪽부터 순서대로 원본 RGB이미지, 그레이 이미지, HSV 이미지



<참고 자료>

[1] http://darkpgmr.tistory.com/66 => HSV에 관해 참고

[2] http://driz2le.tistory.com/188 => HSV에 관해 참고

Posted by 톈진난만

댓글을 달아 주세요



티스토리 툴바