이미지 색공간 변환 및 각 채널 visualization(YUV, HSV, Lab로 변환) - OpenCV(C++)

Updated:

OpenCV를 이용해 이미지를 받은 후 색공간 변환 및 각 채널 visualization

Visual Studio 2017을 사용하였습니다.

컬러 image를 입력받아서 다른 색공간 으로 변환 후 각 채널을 보는 것을 포스팅하겠습니다.

각 채널에 대해서는 각각의 채널에 대한 0~255 값을 가지므로 흑백이 출력됩니다.

cvtColor 함수를 통해 색공간을 변환한 후 split으로 각 채널을 받는 쉬운 코드입니다.

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

using namespace std;
using namespace cv;

int main()
{
	Mat scenery, YUV_scenery, HSV_scenery, Lab_scenery; // 원본과 변환을 위한 Mat 객체 선언
  // 원본, YUV변환, HSV변환, Lab변환
	Mat YUV[3], HSV[3], Lab[3]; // split을 위한 Mat 객체 선언

	scenery = imread("scenery.jpg");
	if (scenery.empty())
	{
		cerr << "이미지 파일을 읽을 수 없음\n";
		return -1;
	}

	imshow("Input_image", scenery);
	int input_key = waitKey(0);

	cout << "변환할 채널을 선택하시오(숫자)\n1 : YUV\n2 : HSV\n3 : Lab\n";
	int num = 0;
	cin >> num;

	if (num == 1) // YUV 선택
	{
		cvtColor(scenery, YUV_scenery, COLOR_RGB2YUV);
		split(YUV_scenery, YUV);
		imshow("YUV-Y", YUV[0]);
		imshow("YUV-U", YUV[1]);
		imshow("YUV-V", YUV[2]);
	}
	else if (num == 2) // HSV 선택
	{
		cvtColor(scenery, HSV_scenery, COLOR_RGB2HSV);
		split(HSV_scenery, HSV);
		imshow("HSV-H", HSV[0]);
		imshow("HSV-S", HSV[1]);
		imshow("HSV-V", HSV[2]);
	}
	else if (num == 3) // Lab 선택
	{
		cvtColor(scenery, Lab_scenery, COLOR_RGB2Lab);
		split(Lab_scenery, Lab);
		imshow("Lab-L", Lab[0]);
		imshow("Lab-a", Lab[1]);
		imshow("Lab-b", Lab[2]);
	}
	int output_key = waitKey(0);

	if (input_key == 27)
		return 0;
	if (output_key == 27)
		return 0;

	return 0;
}

Leave a comment