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