OpenCV 重新着色

OpenCV Recolorization

美好的一天!

我似乎找不到适合我在 OpenCV 中完成的工作的术语。情况是这样的:

我有灰度图像和颜色 (BGR)。

我想'apply'灰度图像的颜色,但保留亮度并在之后保存。

我最初的思考过程是:

  1. 将 BGR 颜色转换为 Luv
  2. 从灰度图像替换 L
  3. 将最终图像转换为 BGR 并保存

这是我目前所做的:

        cv::Mat pixelColor(1, 1, CV_8UC3, cv::Scalar(0));
        pixelColor.at<cv::Vec3b>(1, 1) = cv::Vec3b(128, 255, 0); // currently hard-coded but it actually comes from another source
        cv::cvtColor(pixelColor, pixelColor, CV_BGR2Luv);
        pixelColor.at<cv::Vec3b>(1, 1)[0] = image.at<unsigned char>(y, x);
        cv::cvtColor(pixelColor, pixelColor, CV_Luv2BGR);

我遍历我的灰度图像的所有 y 和 x。实际颜色来自其他地方,但保证是 BGR。

我的问题是:(1) 这个过程的正确术语是什么? (2) 我哪里错了?

我想你可以把这个过程称为频道交换或频道替换?您不需要显式地遍历图像中的像素。

将您的 LUV 图像拆分 () 成垫子矢量可能是最简单的。

vector<Mat> channels;
cv::split(LUVMAT,channels);

这会在您的矢量中提供 3 个单通道 Mats L、U 和 V。

然后使用标准向量操作将向量中的 'L' Mat 替换为灰度(单通道)Mat。最后,将结果合并回 3 通道 Mat。

Mat newLuma;
cv::merge(temp,newLuma);

然后将 "newLuma" 转换回 BGR。