색상 공간(Color Space)은 색을 표현하는 모델을 의미합니다. 색을 기술하는 방법은 여러 가지가 있으며, 대표적으로 RGB, CMYK, HSV, 그레이스케일(Grayscale) 등이 있습니다.
이번 글에서는 'imgproc.hpp'라는 새로운 헤더 파일을 사용합니다. 이 헤더는 Image Processing(이미지 처리)의 약자로, OpenCV의 이미지 처리 관련 함수들이 정의되어 있습니다. 색상 공간을 변환하려면 OpenCV의 cvtColor() 함수를 사용해야 하는데, 이 함수가 바로 'imgproc' 헤더 파일에 정의되어 있기 때문에 해당 헤더를 포함시킨 것입니다.
먼저 두 개의 행렬(Mat)과 두 개의 윈도우를 선언합니다. 행렬은 이미지를 담고 변환 결과를 저장하는 데 사용되며, 윈도우는 원본 이미지와 변환된 이미지를 화면에 출력하는 역할을 합니다. 그다음 'cat.jpg'라는 이미지 파일을 myImage 행렬에 불러옵니다.
이후 cvtColor(myImage, myImage_Converted, COLOR_RGB2GRAY) 구문을 호출하면, 'myImage'의 RGB 색상 공간이 그레이스케일로 변환되어 myImage_Converted 행렬에 저장됩니다.
cvtColor() 함수의 기본 형식은 다음과 같습니다.
cvtColor(원본 행렬(Source Matrix), 대상 행렬(Destination Matrix), 색상 공간 변환 코드(Color Space Conversion Code))
이 프로그램에서 원본 행렬은 'myImage', 대상 행렬은 'myImage_Converted', 색상 공간 변환 코드는 COLOR_RGB2GRAY에 해당합니다.
참고: 자주 사용되는 변환 코드
- COLOR_RGB2GRAY / COLOR_BGR2GRAY: RGB 또는 BGR 이미지를 그레이스케일로 변환
- COLOR_BGR2HSV: BGR 이미지를 HSV 색상 공간으로 변환
- COLOR_GRAY2BGR: 그레이스케일 이미지를 BGR로 변환
참고로 OpenCV는 이미지를 불러올 때 기본적으로 BGR 순서로 픽셀 값을 저장하므로, 실무에서는 COLOR_BGR2GRAY를 사용하는 경우가 더 많습니다.
아래 프로그램은 OpenCV에서 RGB 이미지를 그레이스케일 이미지로 변환하는 전체 예제입니다.
예제 코드
#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main(int argc, const char** argv) {
Mat myImage;//이미지를 불러올 행렬 선언//
Mat myImage_Converted;//변환된 이미지를 저장할 행렬 선언//
namedWindow("Actual_Image");//원본 이미지를 표시할 윈도우 선언//
namedWindow("Converted_Image");//변환된 이미지를 표시할 윈도우 선언//
myImage = imread("cat.jpg");//myImage 행렬에 이미지 불러오기//
cvtColor(myImage,myImage_Converted, COLOR_RGB2GRAY);//RGB를 그레이스케일로 변환//
imshow("Actual_Image",myImage);//원본 이미지 출력//
imshow("Converted_Image",myImage_Converted);//변환된 이미지 출력//
waitKey(0);//키 입력 대기
destroyAllWindows();//모든 윈도우 닫기
return 0;
}실행 결과
프로그램을 실행하면 컬러로 불러온 원본 고양이 이미지와 함께, 그레이스케일로 변환된 흑백 이미지가 두 개의 윈도우에 나란히 표시됩니다. 키보드 아무 키나 누르면 모든 창이 닫히며 프로그램이 종료됩니다.