Если вы проверите двоичное изображение, вы увидите, что существует множество независимых контуров:
![enter image description here](https://i.stack.imgur.com/Ogyrj.png)
Так что сначала вам нужно очистить их, разрушая и расширяя , как показано ниже:
И вы получите такой результат:
![enter image description here](https://i.stack.imgur.com/MRjmt.png)
Что чище оригинала.
Это весь код:
cv::namedWindow("result", cv::WINDOW_FREERATIO);
cv::Mat img = cv::imread(R"(rUYLL.png)");
// to gray
cv::Mat gray;
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
cv::threshold(gray, gray, 0, 255, cv::THRESH_BINARY);
cv::erode(gray, gray, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)));
cv::dilate(gray, gray, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)));
std::vector<std::vector<cv::Point> > contours;
cv::findContours(gray, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
cv::drawContours(img, contours, -1, cv::Scalar(0, 255, 0), 2, 8);
cv::imshow("result", img);
cv::waitKey();
И это вывод:
![enter image description here](https://i.stack.imgur.com/ra6XH.png)
Надеюсь, это поможет!
И один из самых простых способов, который вы также можете рассмотреть, если он работает для вас, просто увеличьте нижний порог с 0 до 80 и DONE
cv::threshold(gray, gray, 80, 255, cv::THRESH_BINARY);
ПРОСТО ИГРАТЬ С ПОРОГОМ и проверить результат.
Тот же вывод только с изменением порогового значения:
![enter image description here](https://i.stack.imgur.com/nXWx1.png)