Я ищу функцию / фильтр / алгоритм для удаления шума внутри контура объекта.
Например:
входное изображение:
![enter image description here](https://i.stack.imgur.com/zmD6N.png)
Я хочу получить:
![enter image description here](https://i.stack.imgur.com/F1VI4.png)
P.S. Объект может иметь другую форму.
Идея была:
img_file = 'third.png'
img = cv2.imread(img_file, cv2.IMREAD_COLOR)
img = cv2.blur(img, (5, 5))
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)
thresh0 = cv2.adaptiveThreshold(s, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
img_2d = color.rgb2gray(img)
print(img_2d.shape)
print(thresh0.shape)
diff = cv2.absdiff(img_2d, thresh0)
mask = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
i_mask = mask > 10
canvas = np.zeros_like(thresh0, np.uint8)
canvas[i_mask] = thresh0[i_mask]
cv2.imshow('Result', canvas)
cv2.imwrite("result.jpg", canvas)
cv2.waitKey(0)
Но я получаю следующую ошибку:
cv2.error: OpenCV(3.4.2) C:\projects\opencv-python\opencv\modules\core\src\arithm.cpp:683:
error: (-5:Bad argument) When the input arrays in
add/subtract/multiply/divide functions have different types, the
output array type must be explicitly specified in function
'cv::arithm_op'
thresh0 имеет следующий вид:
![enter image description here](https://i.stack.imgur.com/sy3Ux.png)
Может быть, если я разошусь с исходным изображением и получу thresh0, я получу чистое изображение. Кстати, это также портит дно. И не убирает весь шум.