Извините за C ++, но это просто иллюстрация идеи: RGB -> HSV -> Порог для канала насыщения -> маска с каналами насыщенности и значения -> RGB.Код здесь:
cv::Mat img = cv::imread("cMzGr.jpg");
cv::Mat hsv;
cv::cvtColor(img, hsv, cv::COLOR_BGR2HSV);
std::vector<cv::Mat> chans;
cv::split(hsv, chans);
cv::Mat mask;
cv::adaptiveThreshold(255 - chans[1], mask, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 9, 0);
cv::bitwise_and(mask, chans[2], mask);
std::vector<std::vector<cv::Point> > contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(mask, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE);
for (size_t i = 0; i < contours.size(); ++i)
{
if (cv::contourArea(contours[i]) < 10)
{
cv::drawContours(mask, contours, i, cv::Scalar(0), cv::FILLED, cv::LINE_4, hierarchy);
}
}
cv::bitwise_and(chans[1], mask, chans[1]);
cv::bitwise_and(chans[2], mask, chans[2]);
cv::merge(chans, hsv);
cv::cvtColor(hsv, img, cv::COLOR_HSV2BGR);
cv::imshow("mask", mask);
cv::imshow("res", img);
И результат: