100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 【OpenCV3】RGB图像向CMYK颜色空间转换

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

时间:2019-07-06 11:14:19

相关推荐

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

结果如下:

源图像

结果图像

.06.15

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。