OpenCV 阈值彩色图像(按亮度,而不是按通道)

OpenCV threshold color image (by brightness, not per channel)

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

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

几乎可以正常工作,但问题是它显然是按通道工作的,所以颜色有时会失真(即一些通道归零,而另一些则不)。我需要的是“将亮度不够大的像素清零”。

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

谢谢!

正如评论中所建议的那样,解决方案是转换为灰度,执行为您提供遮罩的阈值,然后执行 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);