Как удалить небольшой шум (несколько неправильных маленьких фигур) из изображения opencv

#c# #opencv #opencvsharp

#c# #opencv

Вопрос:

У меня есть серия изображений, таких как:

введите описание изображения здесь

Я хочу удалить все эти маленькие неправильные формы, чтобы получить только большую круглую форму.

Я попытался снизить шум:

  Cv2.FastNlMeansDenoising(myMat, myMat,h:3);
  

Но хороших результатов не получается, и процесс замедляется, поэтому, похоже, ему нужна другая обработка, поэтому я попробовал, расширить и размыть:

             int erosionSize = 2;
            Mat element = Cv2.GetStructuringElement(MorphShapes.Cross,
                     new OpenCvSharp.Size(2 * erosionSize   1, 2 * erosionSize   1),
                      new OpenCvSharp.Point(erosionSize, erosionSize));
            Cv2.Dilate(myMat, myMat, element, iterations: 2);
            Cv2.Blur(myMat, myMat, new OpenCvSharp.Size(9, 9));
  

но получается что-то вроде

введите описание изображения здесь

Я думаю, возможно, использование hsv или чего-то еще помогло бы, какой подход был бы лучшим?

Комментарии:

1. Взгляните на cv2.HoughCircles()

2. @ZdaR Однажды я попробовал HoughCircles выполнить более простую задачу, и производительность на эллипсах (даже очень похожих на круги) была действительно плохой. Моим предложением здесь было бы какое-нибудь «умное» пороговое значение (нечто большее, чем простое двоичное пороговое значение), следующее findContours для определения самого большого контура. После этого fitEllipse может помочь проверить эллипсность этого контура.

3. Вы можете использовать cv2.adaptiveThreshold() или cv2.threshold() с OTSU . После получения двоичного изображения вы можете найти контуры и получить самый большой.