【问题标题】:OpenCV RecolorizationOpenCV 重新着色
【发布时间】:2016-04-18 21:27:50
【问题描述】:

美好的一天!

我似乎无法为我想要在 OpenCV 中完成的工作找到合适的术语。情况如下:

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

我想将颜色“应用”到灰度图像,但保留亮度并在之后保存。

我最初的思考过程是:

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

【问题讨论】:

  • 这是如何工作/不工作的? (2) 询问“我哪里出错了”,但是,您没有指定您收到的错误。
  • 不是错误,而是没有正确放置整个色谱。我的具体情况是,我正在使用 3 种颜色为灰度图像着色。着色的标准来自我已经计算过的概率度量字段。根据颜色空间,3 种颜色中只有 2 种被正确放置。有时,细节会丢失。我不确定我错过了什么。

标签: c++ opencv bgr


【解决方案1】:

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

将 LUV 图像 split() 成 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。

【讨论】:

  • 我会试试的!这似乎很合乎逻辑。我按像素做的原因是因为我选择基于概率字段(在之前的运行中计算)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 2016-04-30
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多