Как обнаружить текст с помощью OpenCV - PullRequest
0 голосов
/ 28 марта 2020

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

Я изучаю OpenCV, но не нахожу много контента в Java только в Python. Я хотел бы реализовать это в Java. Но если вы знаете, как это сделать в Python, C ++ - это нормально. Мне просто нужен алгоритм, чтобы получить какое-либо представление.

Мой план - повернуть изображение на 90 °, сделать его двоичным изображением (пороговое значение), определить область интереса (область интересов), в данном случае текст или может быть прямоугольник формы, обрезать белый прямоугольник, в котором находится текст, и, наконец, использовать OCR с Tesseract для получения текста (PISF - 28 - 1469 - 3).

Но для извлечения текста с использованием tesseract все в порядке, я знаю, как это сделать. Мне просто нужно получить белый прямоугольник, в котором находится текст, или минимальную область, в которой содержится текст, и сохранить его в лучшей форме, чтобы позже использовать его с Tesseract (OCR).

Я бы использовал скрипт в пакетном режиме потому что у меня нет только этого изображения. И другие изображения могут иметь разные размеры.

Может ли кто-нибудь мне помочь?

Я буду признателен за любую помощь.

Мое изображение это:

enter image description here

1 Ответ

4 голосов
/ 29 марта 2020

Вот один из способов сделать это в Python / OpenCV

  • Считать ввод
  • Преобразовать в оттенки серого
  • Порог
  • Использовать морфологию удалить маленькие белые или черные области и закрыть текст белым цветом
  • Получить самый большой прямоугольник с вертикальной ориентацией контура
  • Извлечь текст из ограничивающего прямоугольника этого контура
  • Сохранить результаты


Ввод:

enter image description here

import cv2
import numpy as np

# load image
img = cv2.imread("rock.jpg")

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

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

# apply morphology to clean up small white or black regions
kernel = np.ones((5,5), np.uint8)
morph = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
morph = cv2.morphologyEx(morph, cv2.MORPH_OPEN, kernel)

# thin region to remove excess black border
kernel = np.ones((3,3), np.uint8)
morph = cv2.morphologyEx(morph, cv2.MORPH_ERODE, kernel)

# find contours
cntrs = cv2.findContours(morph, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cntrs = cntrs[0] if len(cntrs) == 2 else cntrs[1]

# Contour filtering -- keep largest, vertically oriented object (h/w > 1)
area_thresh = 0
for c in cntrs:
    area = cv2.contourArea(c)
    x,y,w,h = cv2.boundingRect(c)
    aspect = h / w
    if area > area_thresh and aspect > 1:
        big_contour = c
        area_thresh = area

# extract region of text contour from image
x,y,w,h = cv2.boundingRect(big_contour)
text = img[y:y+h, x:x+w]

# extract region from thresholded image
binary_text = thresh[y:y+h, x:x+w]  

# write result to disk
cv2.imwrite("rock_thresh.jpg", thresh)
cv2.imwrite("rock_morph.jpg", morph)
cv2.imwrite("rock_text.jpg", text)
cv2.imwrite("rock_binary_text.jpg", binary_text)

cv2.imshow("THRESH", thresh)
cv2.imshow("MORPH", morph)
cv2.imshow("TEXT", text)
cv2.imshow("BINARY TEXT", binary_text)
cv2.waitKey(0)
cv2.destroyAllWindows()


Предел изображения:

enter image description here

Морфологически очищенное изображение:

enter image description here

Извлеченное изображение области текста:

enter image description here

Извлеченное двоичное изображение области текста:

enter image description here

...