Я пробовал некоторые фильтры/операции в OpenCV и, похоже, работает очень хорошо.
Шаг 1: Dilate изображение -
kernel = np.ones((5, 5), np.uint8)
cv2.dilate(img, kernel, iterations = 1)
Как вы видите, шум ушел, но персонажи очень легкие, так что я разрушал изображение.
Шаг 2: Ирода изображение -
kernel = np.ones((5, 5), np.uint8)
cv2.erode(img, kernel, iterations = 1)
Как вы можете видеть, шум исчезает, однако некоторые символы на другие столбцы разбиты. Я бы рекомендовал использовать эти операции только для столбца с помехами. Вы можете использовать HoughLines, чтобы найти последний столбец. Затем вы можете извлечь только этот столбец, запустить dilation + erosion и заменить его соответствующим столбцом исходного изображения. Кроме того, дилатация + эрозия на самом деле является операцией под названием закрытие. Это можно назвать непосредственно с помощью -
cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
Как предложил @Ermlg, medianBlur с ядром 3 также прекрасно работает.
cv2.medianBlur(img, 3)
Альтернативный шаг
Как вы можете видеть все эти фильтры работают, но это лучше, если вы реализуете эти фильтры только в той части, где шум. Чтобы сделать это, используйте следующую команду:
edges = cv2.Canny(img, 50, 150, apertureSize = 3) // img is gray here
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 100, 1000, 50) // last two arguments are minimum line length and max gap between two lines respectively.
for line in lines:
for x1, y1, x2, y2 in line:
print x1, y1
// This gives the start coordinates for all the lines. You should take the x value which is between (0.75 * w, w) where w is the width of the entire image. This will give you essentially **(x1, y1) = (1896, 766)**
Затем, вы можете извлечь эту часть только как:
extract = img[y1:h, x1:w] // w, h are width and height of the image
Затем, реализующий фильтр (средний или закрытия) в этом изображении , После удаления шума вам нужно поместить это отфильтрованное изображение вместо размытой части исходного изображения. изображение [y1: ч, x1: ш] = средний
Это просто в C++:
extract.copyTo(img, new Rect(x1, y1, w - x1, h - y1))
Окончательный результат с альтернативным методом
Надеюсь, что это помогает!
Возможно, вы захотите удалить «личную» информацию с вашего образца изображения. – cwap
Не могли бы вы указать язык в документе? – thewaywewere
его датский ..... – clarkk