Есть хотя бы пара решений, которые мы можем попробовать, но мне нужно больше информации о вашей проблеме. Например, вы пытаетесь закрыть (в) полный контур обнаруженного объекта? Какую «деградацию контура» вы готовы использовать для аппроксимации полностью замкнутого контура?
Вот первое и очень базовое c решение, при условии, что вам нужен контур 1 pixel
ширины. Он включает dilating
изображение N
раз, а затем применяет thinning/skeletonize
преобразование. (Эта функция является частью Extended Image Processing
модуля OpenCV).
Давайте посмотрим код:
#include <opencv2/ximgproc.hpp>
//Read input image:
std::string imagePath = "C://opencvImages//lineImg.png";
cv::Mat imageInput= cv::imread( imagePath );
//Convert it to grayscale:
cv::Mat grayImg;
cv::cvtColor( imageInput, grayImg, cv::COLOR_BGR2GRAY );
//Get binary image via Otsu:
cv::threshold( grayImg, grayImg, 0, 255 , cv::THRESH_OTSU );
//Dilate the binary image with 5 iterations:
cv::Mat morphKernel = cv::getStructuringElement( cv::MORPH_RECT, cv::Size(3, 3) );
int morphIterations = 5;
cv::morphologyEx( grayImg, grayImg, cv::MORPH_DILATE, morphKernel, cv::Point(-1,-1), morphIterations );
Это изображение Dilated:
//Get the skeleton:
cv::Mat skel;
int algorithmType = 1;
cv::ximgproc::thinning( grayImg, skel, algorithmType );
Это изображение скелета . Линия была "прорежена" до ширины в 1 пиксель:
Я не знаю, достаточно ли это подходит для вашего приложения, но, как я уже сказал, в зависимости от того, что вы делаете, мы можем попробовать несколько альтернативных решений.