在OpenCV中对RGB图像进行阈值化

e4eetjau  于 2023-11-22  发布在  其他
关注(0)|答案(2)|浏览(125)

我有一个彩色图像,我想在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快速实现这一点?

vltsax25

vltsax251#

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


mklgxw1f

mklgxw1f2#

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

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;


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

相关问题