【OpenCV3】RGB图像向CMYK颜色空间转换

1、RGB颜色空间

RGB(红色,绿色,蓝色)是表示光发射的颜色空间。 RGB是一个加性色谱,当所有原色组合时,形成白色。 这类似于实际的光谱,如果您结合自然光的所有颜色(例如,彩虹上的所有颜色),则会创建白光。 显示器(如计算机显示器)使用光的发射来创建颜色,因此使用RGB颜色空间。 这就是为什么大多数计算机程序在设计文件时都将RGB颜色空间作为默认设置。

【OpenCV3】RGB图像向CMYK颜色空间转换_第1张图片

2、CMYK颜色空间

然而,通过实际打印,墨水和墨粉不能正确地表示光的发射。 由于来自非光源的颜色通过光的吸收被真正观察到,所以新的色彩空间需要表示色彩的光谱。 因此,创建了CYMK(青色,黄色,品红色,黑色)颜色空间。 这种颜色空间代表光的吸收,并且当所有原色组合时,形成黑色,这是所有光的吸收。

【OpenCV3】RGB图像向CMYK颜色空间转换_第2张图片

3、实现

具体实现代码如下:

uchar minimum(uchar a, uchar b)
{
	return a <= b ? a : b;
}

cv::Mat rgb2cmyk(cv::Mat& rgb)
{
	cv::Mat cmyk = cv::Mat::zeros(rgb.rows, rgb.cols, CV_8UC4);

	int pixel_num = rgb.rows * rgb.cols;

	for (int i = 0; i < pixel_num; i++)
	{
		uchar c = 255 - rgb.data[3 * i + 0];
		uchar m = 255 - rgb.data[3 * i + 1];
		uchar y = 255 - rgb.data[3 * i + 2];

		uchar K = minimum(minimum(c, m), y);

		uchar C = 0;
		uchar M = 0;
		uchar Y = 0;

		if (K == 255)
		{
			C = 0;
			M = 0;
			Y = 0;
		}
		else
		{
			C = (uchar)((c - K)*255.0 / (255 - K));
			M = (uchar)((m - K)*255.0 / (255 - K));
			Y = (uchar)((y - K)*255.0 / (255 - K));
		}

		cmyk.data[4 * i + 0] = C;
		cmyk.data[4 * i + 1] = M;
		cmyk.data[4 * i + 2] = Y;
		cmyk.data[4 * i + 3] = K;
	}
	return cmyk;
}


测试代码如下:

void test_rgb2cmyk()
{
	cv::Mat bgr = cv::imread("E:\\Images\\trees.png", cv::IMREAD_COLOR);
	cv::Mat rgb;
	cv::cvtColor(bgr, rgb, cv::COLOR_BGR2RGB);

	cv::Mat cmyk = rgb2cmyk(rgb);

	cv::imshow("bgr", bgr);
	cv::imshow("cmyk", cmyk);

	cv::waitKey(0);
	return;
}


结果如下:

源图像

【OpenCV3】RGB图像向CMYK颜色空间转换_第3张图片


结果图像

【OpenCV3】RGB图像向CMYK颜色空间转换_第4张图片



2017.06.15



你可能感兴趣的:(图像处理,机器视觉,OpenCV,算法)