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);
如果我在彩色图像上使用 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);