Pytesseract получает только часть текста из изображения

#python #ocr #python-tesseract

#python #ocr #python-tesseract

Вопрос:

Я пытаюсь использовать pytesseract для обнаружения текста из этого изображения:

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

В частности, меня больше волнует обнаружение незавершенного коммерческого перерыва. для достижения этой цели я использовал следующий код:

 from PIL import Image
import pytesseract
print(pytesseract.image_to_string(Image.open('/home/me/Desktop/dataset/my-dataset/Apex-Legends/loustreams_001.jpg')))
 

Однако он возвращает:

 



nercial break in progress
 

Я знаю, что не должен ожидать результата SoTA от одной строки кода, но текст очень заметен. Как я могу это улучшить?

Ответ №1:

Вы можете использовать image_to_data для получения строки «Выполняется рекламный перерыв».

  1. Преобразование изображения в rgb
  2. Получить вывод в виде словаря
  3. Если обнаруженный текст превышает пороговый уровень достоверности, отобразите.

Код:

 import cv2
from pytesseract import *

img = cv2.imread("6cNav.jpg")
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
res = image_to_data(rgb, output_type=Output.DICT)

out_txt = ""

for i in range(0, len(res["text"])):
    x = res["left"][i]
    y = res["top"][i]
    w = res["width"][i]
    h = res["height"][i]

    txt = res["text"][i]
    cnf = int(res["conf"][i])

    if cnf > 95:
        text = "".join(txt).strip()
        cv2.rectangle(img,
                      (x, y),
                      (x   w, y   h),
                      (0, 0, 255), 2)
        cv2.putText(img,
                    text,
                    (x, y - 10),
                    cv2.FONT_HERSHEY_SIMPLEX,
                    1.2, (0, 255, 255), 3)
        out_txt  = " "   text

print(out_txt)
cv2.imshow("img", img)
cv2.waitKey(0)
 

Вывод:

введите описание изображения здесь

 Commercial break in progress
 

Пожалуйста, обратите внимание, что моя pytesseract версия 4.1.1

Обновленный код


Для всех приведенных выше изображений вы можете применить adaptive-threshold

введите описание изображения здесь

  • (1-е и 3-е изображения также похожи на приведенные выше)

результатом будет:

 output 1:
Commercial loreak in progress

output 2:
Commercial break in progress

output 3:
Commercial break in progress
 

Код:

 import cv2
import pytesseract

img1 = cv2.imread("6cNav.jpg")
img2 = cv2.imread("IKHKa.jpg")
img3 = cv2.imread("VTJse.jpg")

img_lst = [img1, img2, img3]

for i, img in enumerate(img_lst):
    gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    thr = cv2.adaptiveThreshold(gry, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                                cv2.THRESH_BINARY_INV, 11, 2)

    res = pytesseract.image_to_string(thr, config="--psm 6")
    print("output {}:".format(i 1))
    print(res)
 

Комментарии:

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

2. Привет. Пара вещей. Во-первых, я не могу получить те же результаты, что и вы. Я просто получаю представление о точном изображении таким, какое оно есть. Во-вторых, я не получаю текстовый вывод Commercial break in progress

3. Кроме того, предоставленный вами код работает только для того изображения, которое я предоставил. Я должен был добавить больше примеров, но в основном фон в этом режиме ожидания меняется, что негативно влияет на производительность вашего кода..

4. Я обновил свой ответ. Смотрите Обновленную часть кода .