2014-10-06 147 views
7

我有一个彩色图像,我想在OpenCV中设置阈值。我想要的是,如果任何RGB通道在某个值以下,将所有通道中的值设置为零(即黑色)。在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。但是,它似乎并没有这样工作。例如,我只看到了绿色通道,来通过一些这些地区,这表明并非所有的通道都被设置为0。

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

+0

阈值将低于5任何值设置为0,并且*任何其他至255 *。这是你想要的吗? – berak 2014-10-06 15:32:55

回答

15

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

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

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

Original image

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

例如,可以允许之间(0,125,0)和(255,200,255),或用于蹦床网上单信道的任何值仅仅valyes

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

Output image

+0

+1我看你在那里做了什么。 – karlphillip 2014-10-07 19:09:58

+1

在Google上搜索“opencv阈值颜色”再次结束。好戏! – karlphillip 2017-07-23 05:41:35

1

简而言之,您必须在包含三个通道的三个图像中放置图像,独立地对其进行固定,然后再合并它们。

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); 

此代码应该这样做。

对不起,我读得太快了。 然后,您应该稍后修改代码

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

创建从三幅阈值化图像的面具,那么这种面膜适用于您的输入图像。

+0

这是不是有问题,但不是所有的渠道将被设置为零。我猜测我可以在阈值图像上使用bitwise_AND运算符来生成最终蒙版。 – Luca 2014-10-06 15:25:02