Очистка фонового изображения для распознавания текста - PullRequest
2 голосов
/ 31 октября 2019

Через tesseract-OCR Я пытаюсь извлечь текст из следующих изображений на красном фоне.

enter image description here

У меня проблемы с извлечением текста вполя B и D, потому что есть вертикальные линии. Как можно очистить фон следующим образом:

вход:

enter image description here

вывод:

enter image description here

какая идея? Изображение без рамки: enter image description here

1 Ответ

1 голос
/ 01 ноября 2019

Вот два метода очистки изображения с использованием Python OpenCV

Метод # 1: пороговое значение Numpy

Поскольку вертикальные линии, горизонтальные линии и фон являютсякрасным мы можем воспользоваться этим и использовать пороговое значение Numpy, чтобы изменить все красные пиксели выше порогового значения на белый.

enter image description here

import cv2
import numpy as np

image = cv2.imread('1.jpg')

image[np.where((image > [0,0,105]).all(axis=2))] = [255,255,255]

cv2.imshow('image', image)
cv2.waitKey()

Метод № 2: Традиционная обработка изображений

Для более общего подхода, если линии не были красными, мы можем использовать простые методы обработки изображений для очистки изображения. Чтобы удалить вертикальные и горизонтальные линии, мы можем создать специальные ядра, чтобы изолировать линии и удалить их, используя маскирование и побитовые операции. После удаления линий мы можем использовать пороговое значение, морфологические операции и контурную фильтрацию для удаления красного фона. Вот визуализация процесса


Сначала мы строим вертикальные и горизонтальные ядра, а затем cv2.morphologyEx(), чтобы обнаружить линии. Отсюда у нас есть отдельные маски горизонтальных и вертикальных линий, затем побитовые или две маски для получения маски со всеми удаляемыми линиями. Далее мы поразрядно - или с исходным изображением удаляем все строки

enter image description here enter image description here enter image description here enter image description here

Теперь, когда линии удалены, мы можем работать над удалением красного фона. Мы пороговые для получения двоичного изображения и выполняем морфологические операции для сглаживания текста

enter image description here

Есть еще маленькие точки, поэтому для их удаления мы находим контуры иФильтр с использованием минимальной пороговой области для удаления небольшого шума

enter image description here

Наконец, мы инвертируем изображение, чтобы получить наш результат

enter image description here

import cv2

image = cv2.imread('1.jpg')

# Remove vertical and horizontal lines
kernel_vertical = cv2.getStructuringElement(cv2.MORPH_RECT, (1,50))
temp1 = 255 - cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel_vertical)
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (50,1))
temp2 = 255 - cv2.morphologyEx(image, cv2.MORPH_CLOSE, horizontal_kernel)
temp3 = cv2.add(temp1, temp2)
removed = cv2.add(temp3, image)

# Threshold and perform morphological operations
gray = cv2.cvtColor(removed, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 180, 255, cv2.THRESH_BINARY_INV)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2))
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=1)

# Filter using contour area and remove small noise
cnts = cv2.findContours(close, 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 < 10:
        cv2.drawContours(close, [c], -1, (0,0,0), -1)

final = 255 - close 
cv2.imshow('removed', removed)
cv2.imshow('thresh', thresh)
cv2.imshow('close', close)
cv2.imshow('final', final)
cv2.waitKey()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...