Я пытаюсь создать скрипт, который будет выделять определенные 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)
``