【OpenCV3】RGB圖像向CMYK顏色空間轉換

1、RGB顏色空間

RGB(紅色,綠色,藍色)是表示光發射的顏色空間。 RGB是一個加性色譜,當所有原色組合時,形成白色。 這類似於實際的光譜,如果您結合自然光的所有顏色(例如,彩虹上的所有顏色),則會創建白光。 顯示器(如計算機顯示器)使用光的發射來創建顏色,因此使用RGB顏色空間。 這就是爲什麼大多數計算機程序在設計文件時都將RGB顏色空間作爲默認設置。


2、CMYK顏色空間

然而,通過實際打印,墨水和墨粉不能正確地表示光的發射。 由於來自非光源的顏色通過光的吸收被真正觀察到,所以新的色彩空間需要表示色彩的光譜。 因此,創建了CYMK(青色,黃色,品紅色,黑色)顏色空間。 這種顏色空間代表光的吸收,並且當所有原色組合時,形成黑色,這是所有光的吸收。


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;
}


結果如下:

源圖像



結果圖像




2017.06.15



發佈了78 篇原創文章 · 獲贊 369 · 訪問量 126萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章