Простой подход состоит в том, чтобы выполнить морфологическое закрытие двоичного изображения, чтобы соединить шум вместе в единый контур. Отсюда мы можем найти контуры и фильтр, используя область контура. Мы можем эффективно убрать шум на границе, рисуя контур. Вот результат с шумом, окрашенным в цвет фона. Если вы хотите снять маску, просто закрасьте ее черным (0,0,0)
.
import cv2
import numpy as np
# Load image, grayscale, Gaussian blur, adaptive threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (7,7), 0)
thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,61,5)
# Morph close to connect noise
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,9))
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=5)
# Filter using contour area and fill in contour to remove noise
cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
if area > 250000:
cv2.drawContours(image, [c], -1, (43,43,43), -1)
cv2.imwrite('image.png', image)
cv2.waitKey()