Как сгладить и сделать более тонкими эти очень грубые изображения, используя OpenCV? - PullRequest
1 голос
/ 22 января 2020

У меня есть несколько черно-белых изображений одного ди git. Я использую модель NN, обученную на MNIST, чтобы классифицировать их. Однако цифры слишком грубые и толстые по сравнению с набором данных MNIST. Например:

enter image description here

TLDR: мне нужно сгладить изображение и, возможно, сделать общую форму более тонкой, используя OpenCV.

Ответы [ 2 ]

2 голосов
/ 22 января 2020

Вы можете использовать сочетание морфологии закрытия, открытия и разрушения (и, возможно, скелетирования и расширения) в Python / OpenCV следующим образом:

Ввод:

enter image description here

import cv2
import numpy as np
from skimage.morphology import skeletonize

# load image
img = cv2.imread("5.png")

# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold image
thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY)[1]

# apply morphology close
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (11,11))
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

# apply morphology open
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (11,11))
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

# apply morphology erode
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (21,21))
thresh = cv2.morphologyEx(thresh, cv2.MORPH_ERODE, kernel)

# write result to disk
cv2.imwrite("5_thinned.png", thresh)

# skeletonize image and dilate
skeleton = cv2.threshold(thresh,0,1,cv2.THRESH_BINARY)[1]
skeleton = (255*skeletonize(skeleton)).astype(np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (15,15))
skeleton_dilated = cv2.morphologyEx(skeleton, cv2.MORPH_DILATE, kernel)

# write result to disk
cv2.imwrite("5_skeleton_dilated.png", skeleton_dilated)

cv2.imshow("IMAGE", img)
cv2.imshow("RESULT1", thresh)
cv2.imshow("RESULT2", skeleton_dilated)
cv2.waitKey(0)
cv2.destroyAllWindows()


Результат1 (закрыть, открыть, разрушить):

enter image description here

Результат2 (закрыть, открыть, разрушать, скелетировать, расширять):

enter image description here

1 голос
/ 22 января 2020

Скорее всего, вы получите морфологические операции . В частности, это звучит так, как будто вы хотите размывать.

У вас все же есть шум. Вам следует попробовать операции сглаживания OpenCV . Исходя из моего опыта, я думаю, что вам нужно использовать медианное размытие с площадью ядра около 9 (хотя это зависит от того, что вы хотите). Тогда вам нужно использовать Erode.

...