【问题标题】:OpenCV threshold color image (by brightness, not per channel)OpenCV 阈值彩色图像(按亮度,而不是按通道)
【发布时间】:2022-01-19 00:59:48
【问题描述】:

如果我在彩色图像上使用cv::threshold,openCV 似乎正在执行每通道阈值。

我用它去除不够亮的像素 (cv::THRESH_TOZERO),然后将其 (cv::add) 覆盖在其他图像上。

几乎可以正常工作,但问题是它显然适用于每个通道,因此颜色有时会失真(即某些通道会归零,而其他通道则不会)。我需要的是“将亮度不够大的像素归零”。

现在我知道我可以在 for 循环中迭代图像,如果通道的总和不超过阈值,只需用零覆盖像素。但几乎可以肯定,这不足以在我的目标低功耗设备(nVidia Jetson Xavier NX)上实时运行。 OpenCV 函数似乎得到了更好的优化。

谢谢!

【问题讨论】:

  • 常见的解决方案是从 BGR 转换为灰度,并在灰度图像上应用阈值。
  • 好的,但我需要保留颜色。也许如果我以某种方式使用灰色图像作为蒙版......
  • cv::threshold 的结果是二值图像 - 将其用作掩码。

标签: c++ opencv


【解决方案1】:

正如 cmets 中所建议的,解决方案是转换为灰度,执行为您提供蒙版的阈值,然后执行 bitwise_and 以仅保留您想要的像素。像这样:

                cv::UMat mask;
                cv::cvtColor(img, mask, cv::COLOR_BGR2GRAY);
                cv::threshold(mask, mask, threshold, 255, cv::THRESH_BINARY);
                cv::cvtColor(mask, mask, cv::COLOR_GRAY2BGR);

                cv::bitwise_and(img, mask, img);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2015-03-19
    • 2017-12-28
    • 1970-01-01
    相关资源
    最近更新 更多