RGB与CMYK颜色空间的转换

 C++OpenCV计算机视觉入门精通与项目实践
https://www.bilibili.com/cheese/play/ss14962 

RGB 到 CMYK

void rgb2Cmyk(const cv::Mat& rgbImage, cv::Mat& cmykImage) 
{
	cv::cvtColor(rgbImage, cmykImage, cv::COLOR_BGR2BGRA);

	for (int i = 0; i < cmykImage.rows; ++i) {
		for (int j = 0; j < cmykImage.cols; ++j) {
			uchar r = cmykImage.at<cv::Vec4b>(i, j)[2];
			uchar g = cmykImage.at<cv::Vec4b>(i, j)[1];
			uchar b = cmykImage.at<cv::Vec4b>(i, j)[0];

			
			double c = 1 - (static_cast<double>(r) / 255.0);
			double m = 1 - (static_cast<double>(g) / 255.0);
			double y = 1 - (static_cast<double>(b) / 255.0);

			double min = tmin3(m, y, c);
		
			c = (c - min) / (1 - min);
			m = (m - min) / (1 - min);
			y = (y - min) / (1 - min);

			double k;
			if (r == 0 && g == 0 && b == 0) {
				k = 1.0;
			}
			else {
				k = min;
			}

			uchar uc = c * 255;
			uchar um = m * 255;
			uchar uy = y * 255;
			uchar uk = k * 255;

			cmykImage.at<cv::Vec4b>(i, j)[0] = uc;
			cmykImage.at<cv::Vec4b>(i, j)[1] = um;
			cmykImage.at<cv::Vec4b>(i, j)[2] = uy;
			cmykImage.at<cv::Vec4b>(i, j)[3] = uk;
		}
	}
}

CMYK 到 RGB

void cmyk2Rgb(const cv::Mat& cmykImage, cv::Mat& rgbImage) 
{
	cv::cvtColor(cmykImage, rgbImage, cv::COLOR_BGRA2BGR);

	for (int i = 0; i < rgbImage.rows; ++i) {
		for (int j = 0; j < rgbImage.cols; ++j) {
			uchar c = cmykImage.at<cv::Vec4b>(i, j)[0];
			uchar m = cmykImage.at<cv::Vec4b>(i, j)[1];
			uchar y = cmykImage.at<cv::Vec4b>(i, j)[2];
			uchar k = cmykImage.at<cv::Vec4b>(i, j)[3];

			int r = static_cast<int>((1.0 - c / 255.0) * (1.0 - k / 255.0) * 255.0);
			int g = static_cast<int>((1.0 - m / 255.0) * (1.0 - k / 255.0) * 255.0);
			int b = static_cast<int>((1.0 - y / 255.0) * (1.0 - k / 255.0) * 255.0);

			r = std::max(0, std::min(255, r));
			g = std::max(0, std::min(255, g));
			b = std::max(0, std::min(255, b));

			rgbImage.at<cv::Vec3b>(i, j)[2] = r;
			rgbImage.at<cv::Vec3b>(i, j)[1] = g;
			rgbImage.at<cv::Vec3b>(i, j)[0] = b;
		}
	}
}

 C++OpenCV计算机视觉入门精通与项目实践
https://www.bilibili.com/cheese/play/ss14962 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值