Чтобы развернуть Ответ MBo :
Открытие должно быть применено с помощью элемента структурирования диска (ядра) для предотвращения направленного смещения.
Размер дискаопределяет, сколько артефактов будет удалено.Ниже приведен пример изображения из OP (слева) и 5 результатов открытия, с диаметрами 7, 9, 11, 13 и 15 пикселей.Мне кажется, что для этого случая лучше всего использовать 13 или 15 пикселей, хотя при 15 пикселях может быть также удалено больше деталей.Фильтрация шума - это всегда компромисс между удалением шума и сохранением деталей.Чем больше шума удаляется, тем больше деталей удаляется.
SciPy ndimage имеет отверстие , чтобы применить егос элементом структурирования диска сделайте следующее:
diameter = 15
radius = diameter // 2
x = np.arange(-radius, radius+1)
x, y = np.meshgrid(x, x)
r = x**2 + y**2
se = r < radius**2
ndimage.binary_opening(img, se)
В этом коде мы сначала создаем одномерный массив x
, который указывает расстояние от середины.np.meshgrid
берет этот массив и создает два 2D-массива (изображения), содержащие координаты x и y с началом координат в середине изображения.Следующая строка вычисляет r
, квадрат расстояния до начала координат.Наконец, мы можем получить структурирующий элемент se
как все пиксели в пределах radius
от начала координат.
Вполне возможно, что OpenCV имеет более простой способ применения отверстия с диском.Я предлагаю SciPy ndimage, потому что именно это используется в OP.