Python Тессеракт кирилли c проблема с символами - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь создать скрипт, который будет выделять определенные c слова внутри изображений, используя tesseract. Мой подход работает отлично для большинства языков, кроме языков с кириллицей c символов, таких как русский или греческий.

Например, при использовании этого изображения , когда я извлекаю текст, используя tesseract image_to_string, он печатается правильно (см. ниже)

Извлечено с помощью image_to_string

Но когда я пытаюсь обработать изображение и выделить нужный текст, используя данные тессеракта ["text"], я получаю текст, который не содержит кириллицы c символов (см. ниже)

Пример 1 data ["text"]

Пример 2 data ["text" ]

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

Это мой код:

import cv2
import urllib

pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

image = cv2.imread("test_russian.png")

target_word = ["длинной"]

# Process image: morph and invert
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 1))
processed = cv2.morphologyEx(gray_image, cv2.MORPH_OPEN, kernel, iterations=1)
inverted = 255 - processed

# Extract text
words_string = pytesseract.image_to_string(inverted, lang='rus', config='--psm 6')
print(f"Text extracted using image_to_string: \n {words_string}")

# Copy image to get data
image_copy = image.copy()
data = pytesseract.image_to_data(inverted, output_type=pytesseract.Output.DICT)

# Search for word
for word in target_word:
    print(f"\n from target word {word} and lowered {word.lower()} \n")
word_occurences = [i for i, word in enumerate(data["text"]) if word.lower() == word.lower() in target_word]

print("Text from data['text']: ")
for i, word in enumerate(data["text"]):
    print(f"I : {i} and word: {word}")

for occ in word_occurences:
    print(f"Occ: {occ}")
    w = data["width"][occ]
    h = data["height"][occ]
    l = data["left"][occ]
    t = data["top"][occ]
    p1 = (l + w, t + h)
    p2 = (l, t + h)

    image_copy = cv2.line(image_copy, p1, p2, color=(0, 60, 255), thickness=2)

# Resize images
image_copy = cv2.resize(image_copy, (920, 640))
gray_image = cv2.resize(gray_image, (920, 640))
inverted_image = cv2.resize(inverted, (920, 640))

# Show and save image
cv2.imshow("proccesed and inverted", inverted_image)
cv2.imshow("gray", gray_image)
cv2.imshow("identified text", image_copy)

cv2.imwrite("identified_text.png", image_copy)

cv2.waitKey(0)
``



...