【问题标题】:thresholding RGB image in OpenCV在 OpenCV 中对 RGB 图像进行阈值处理
【发布时间】:2014-11-30 20:00:36
【问题描述】:

我有一个彩色图像,我想在 OpenCV 中设置一个阈值。我想要的是,如果任何 RGB 通道低于某个值,则将所有通道中的值设置为零(即黑色)。

所以,我使用opencv阈值函数为:

cv::Mat frame, thresholded
// read frame somewhere, it is a BGR image.
cv::threshold(frame, thresholded, 5, 255, cv::THRESH_BINARY);

所以,我认为这会做的是,如果任何通道小于 5,我认为它会将它们设置为零。但是,它似乎不是那样工作的。例如,我看到其中一些区域只有绿色通道通过,这表明并非所有通道都设置为 0。

有没有办法使用 OpenCV 快速实现这一点?

【问题讨论】:

  • 阈值会将任何低于 5 的值设置为 0,任何其他值设置为 255。这是你想要的吗?

标签: opencv


【解决方案1】:

可以使用函数cv::inRange 对彩色图像进行阈值处理。

void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst)

例如,您只能允许 (0, 125, 0) 和 (255, 200, 255) 之间的值,或单个通道的任何值:

cv::Mat image = cv::imread("bird.jpg");

if (image.empty())
{
    std::cout << "> This image is empty" << std::endl;
    return 1;
}

cv::Mat output;
cv::inRange(image, cv::Scalar(0, 125, 0), cv::Scalar(255, 200, 255), output);
cv::imshow("output", output);

【讨论】:

  • 通过在 Google 上搜索“opencv 阈值颜色”再次来到这里。好技巧!
【解决方案2】:

简而言之,您必须将图像滑入包含三个通道的三个图像中,将它们独立地保存起来,然后再次合并它们。

Mat frame,thresholded;
vector<Mat> splited_frame;
//Read your frame
split(frame, splited_frame);
for (size_t i = 0; i < splited_frame.size(); i++)
   threshold(splited_frame[i], splited_frame[i], 5, 255, cv::THRESH_BINARY);
merge(splited_frame,thresholded);

这段代码应该可以做到。

对不起,我读得太快了。 然后,你应该在for之后稍微修改一下代码

thresholded = splited_frame[0].clone();
for(size_t i = 1; i < splited_frame.size(); i++) thresholded &= splited_frame[i];
frame &= thresholded;

您从三个阈值图像创建一个蒙版,然后将此蒙版应用于您的输入图像。

【讨论】:

  • 这是否没有问题,尽管并非所有通道都将设置为零。我猜我可以在阈值图像上使用 bitwise_AND 运算符来生成最终蒙版。
猜你喜欢
  • 2015-10-19
  • 1970-01-01
  • 2019-07-08
  • 2020-07-05
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
相关资源
最近更新 更多