我想要一个彩色图像,我想在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实现这一目标?
答案 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;
}
cv::Mat output;
cv::inRange(image, cv::Scalar(0, 125, 0), cv::Scalar(255, 200, 255), output);
cv::imshow("output", output);
答案 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;
您可以从三个阈值图像创建蒙版,然后将此蒙版应用于输入图像。