Мне нужно уменьшить шум на изображениях, как показано ниже, то есть заполнить дыры в белом объекте. Я пробовал что-то с opencv, но в итоге часть объекта была удалена, как вы можете видеть. Есть ли лучший способ сделать это без потери самого объекта? Любая помощь приветствуется!
Вот что у меня есть до сих пор:
import numpy as np
import cv2
def remove_noise(gray, num):
Y, X = gray.shape
nearest_neigbours = [[
np.argmax(
np.bincount(
gray[max(i - num, 0):min(i + num, Y), max(j - num, 0):min(j + num, X)].ravel()))
for j in range(X)] for i in range(Y)]
result = np.array(nearest_neigbours, dtype=np.uint8)
cv2.imwrite('result.png', result)
return result
img = cv2.imread('img.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
remove_noise(gray, 10)
Входное изображение:
Выходное изображение:
Вам лучше показать нам исходное изображение.
Вы можете извлечь контур объекта и заполнить его белым цветом.
да, таким образом границы объекта не будут изменены
Я не думаю, что это возможно, это изображение является результатом процесса сегментации.
@DaviMagalhães, какой подход вы придумали?
Предложение @JeruLuke в итоге сработало для меня нормально, дополнительную информацию можно найти в опубликованном мной ответе.
Следуя предложению @JeruLuke, я использовал cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)
и получил желаемый результат с помощью следующего фрагмента кода.
import cv2
import numpy as np
image = cv2.imread('image.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
kernel_size = (7, 7)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernel_size)
closing = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)
cv2.imwrite('result.png', closing)
Выходное изображение:
Проверьте морфологическое закрытие
closing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)
docs.opencv.org/4.x/d9/d61/tutorial_py_morphological_ops.html