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