Я пытался очистить изображения для распознавания текста: (строки)
Мне нужно удалить эти строки, чтобы иногда дальше обрабатывать изображение, и я довольно близко подхожу, но в большинстве случаев пороговое значение слишком сильно отнимает текст:
copy = img.copy()
blur = cv2.GaussianBlur(copy, (9,9), 0)
thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,11,30)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,9))
dilate = cv2.dilate(thresh, kernel, iterations=2)
cnts = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
if area > 300:
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(copy, (x, y), (x + w, y + h), (36,255,12), 3)
Изменить: Кроме того, использование постоянных чисел не будет работать в случае изменения шрифта. Есть ли общий способ сделать это?
Ответы:
Вот идея. Мы разбиваем эту проблему на несколько этапов:
Определить среднюю площадь прямоугольного контура. Затем мы пороговые значения, затем находим контуры и фильтруем, используя ограничивающую прямоугольную область контура. Причина, по которой мы это делаем, заключается в том, что любой типичный символ будет таким большим, тогда как большой шум будет охватывать большую прямоугольную область. Затем мы определяем среднюю площадь.
Удалить большие контуры выбросов. Мы повторяем контуры снова и удаляем большие контуры, если они
5x
больше, чем средняя площадь контура, заполняя контур. Вместо использования фиксированной области порога, мы используем этот динамический порог для большей устойчивости.Расширьте вертикальное ядро, чтобы соединить символы . Идея состоит в том, чтобы воспользоваться наблюдением, что символы выровнены в столбцах. Расширяя вертикальное ядро, мы соединяем текст, чтобы шум не включался в этот комбинированный контур.
Удалить небольшой шум . Теперь, когда сохраняемый текст связан, мы находим контуры и удаляем все контуры, меньшие, чем
4x
средняя площадь контура.Побитовый - и реконструировать образ . Поскольку у нас есть только желаемые контуры, чтобы сохранить нашу маску, мы побитовые - и сохранить текст и получить наш результат.
Вот визуализация процесса:
У порога Отсу для получения бинарного изображения затем находим контуры, чтобы определить среднюю площадь прямоугольного контура. Отсюда мы удаляем большие контуры выбросов, выделенные зеленым цветом, заполняя контуры
Далее мы строим вертикальное ядро и расширяем, чтобы соединить символы. Этот шаг соединяет весь необходимый текст, чтобы сохранить и изолирует шум в отдельные капли.
Теперь мы находим контуры и фильтруем, используя область контура, чтобы удалить небольшой шум
Здесь все удаленные шумовые частицы выделены зеленым
Результат
Код
Примечание. Традиционная обработка изображений ограничивается установлением порога, морфологическими операциями и фильтрацией контуров (аппроксимация контура, площадь, соотношение сторон или обнаружение больших двоичных объектов). Поскольку входные изображения могут различаться в зависимости от размера символов, найти единственное решение довольно сложно. Возможно, вы захотите изучить свой собственный классификатор с помощью машинного / глубокого обучения для динамического решения.
источник