OpenCV中的阈值RGB图像

时间:2014-10-06 14:20:37

标签: opencv

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

所以,我使用opencv threshold函数:

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

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

有没有办法以快速的方式使用OpenCV实现这一目标?

2 个答案:

答案 0 :(得分:20)

可以使用函数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;
}

Original image

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

Output image

答案 1 :(得分: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;

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