Я пытаюсь удалить только текстовую область изображения как можно ближе, потому что хочу удалить царапины на поверхности. Проблема здесь в том, что текст лазера на корпусе, и вполне возможно, что на корпусе есть царапины, которые я хочу обнаружить. Вот несколько примеров (Слева - изображение маски, созданное с помощью пороговой обработки, среднее изображение - это то, где я удалил текст с окраской, а правое - исходное изображение):
На этом рисунке мы видим царапину слева внизу и две царапины в области, где находится текст. Я порождаю изображение, чтобы получить маску, а затем использую метод inpaint
. Это прекрасно работает, но я просто хочу сделать рисование для текста, а не царапин.
Это метод, в котором я делаю рисование:
def MaskOutMarking(self, img):
# Binary threshold image
mask = cv2.threshold(img, 150, 255, cv2.THRESH_BINARY)[1]
# Remove small noise
inp_mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE,cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)))
cv2.imshow('Mask', mask)
cv2.waitKey(0)
# Dilate mask
inp_mask = cv2.dilate(inp_mask,
cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (15, 15)))
# Inpaint
dst = cv2.inpaint(img, inp_mask, 15, cv2.INPAINT_NS)
#cv2.imshow('Mask', inp_mask)
#cv2.waitKey(0)
return dst
Я подумал о том, чтобы извлечь контуры, а затем отфильтровать царапины, но я не знаю, как мне удалить с него нетекстовые элементы. Может быть, получить х самых больших контуров? Но что мне делать, когда есть большие царапины или что-то еще. Я немного озадачен ....
Вот оригинальное изображение: