OpenCV重新着色

时间:2016-04-18 21:27:50

标签: c++ opencv bgr

美好的一天!

我似乎无法在OpenCV中找到合适的术语。情况如下:

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

我想'申请'灰度图像的颜色,但保持亮度并保存后。

我最初的思考过程是:

  1. 将BGR颜色转换为Luv
  2. 将L替换为灰度图像
  3. 将最终图像转换为BGR并保存
  4. 这是我到目前为止所做的:

            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)我哪里错了?

1 个答案:

答案 0 :(得分:0)

我想您可以将此流程称为频道切换或频道替换?您不需要显式迭代图像中的像素。

将你的LUV图像分割成一个Mats向量可能是最容易的。

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。