@fantom_ask

Как улучшить код получения текста с картинки?

Как улучшить код получения текста с картинки?
У меня есть вот такой код
from PIL import Image
import pytesseract
import cv2
import os

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

base_dir = os.path.dirname(os.path.abspath(__file__))
image = base_dir + r'\tmp\test.PNG'
d = Image.open(image)
preprocess = "thresh"

# загрузить образ и преобразовать его в оттенки серого
image = cv2.imread(image)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# проверьте, следует ли применять пороговое значение для предварительной обработки изображения

if preprocess == "thresh":
    gray = cv2.threshold(gray, 0, 255,
        cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

# если нужно медианное размытие, чтобы удалить шум
elif preprocess == "blur":
    gray = cv2.medianBlur(gray, 3)

# сохраним временную картинку в оттенках серого, чтобы можно было применить к ней OCR
filename_dir = base_dir +"\gray\{}.png".format(os.getpid())
cv2.imwrite(filename_dir, gray)

# загрузка изображения в виде объекта image Pillow, применение OCR, а затем удаление временного файла
text = pytesseract.image_to_string(Image.open(filename_dir))
print(text)
os.remove(filename_dir)

# показать выходные изображения
cv2.imshow("Image", image)
cv2.imshow("Output", gray)

Я хочу что бы он лучше распознавал текст с картинки
вот пример

5f510ff21bcde419209991.png
5f5110122fd75340164300.png
5f511009a015e979426576.png
gray
5f5110272720c933726529.png
5f51102f31b07998117621.png
5f5110346b558104839302.png
Text
fright, tine to put the old girl to work.

When you'll step off the Blue Liner onto the island of Cloverton, your new life will begin.


O Bone Dig
23 - 59 (63)

ME ero rpart

toc mary

v fits te arg Saahe any Mn fof
Poth

Как мне это сделать?
  • Вопрос задан
  • 84 просмотра
Решения вопроса 1
@MasterCard000
Думаю вы так хотели ?
5f515e7c76f0a841509570.png
Конечно не 100% результат, но вы с настройками можете поиграться
import cv2
import pytesseract

def text(img, size, chan):
    pytesseract.pytesseract.tesseract_cmd = r'Tesseract-OCR\tesseract.exe'
    scale_percent = int(size)# Процент от изначального размера
    image = cv2.imread(img)
    width = int(image.shape[1] * scale_percent / 100)
    height = int(image.shape[0] * scale_percent / 100)
    dim = (width, height)
    resized = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)
    gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)        #
    ret, threshold_image = cv2.threshold(gray, chan, 150, 1, cv2.THRESH_BINARY)
    text = pytesseract.image_to_string(threshold_image, config='--psm 11')
    # cv2.imshow("123", threshold_image)
    # cv2.waitKey(0)
    return text

text1 = text("1.png", 350, 150)
print(text1,"\n\n")

text2 = text("2.png", 350, 30)
print(text2,"\n\n")

text3 = text("3.png", 350, 160)
print(text3,"\n\n")
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Viktor_T2
python developer
Предобработка изображений с CV очень важна.
Есть много разных фокусов, вот например https://stackoverflow.com/questions/39233823/openc... ну и других много разных.
Вот здесь пишут что качество распознавания зависит от ширины буквы в пикселях: https://groups.google.com/forum/#!msg/tesseract-oc...
Это к вопросу о дпи.
3. тесеракту можно передавать его тессерактовы параметры, например:
conf = u"--psm 11"
text = TS.image_to_string(Image.open('1111.jpg'), config=conf)
psm - Режимы сегментации страницы:
0 Только ориентация и обнаружение скриптом (OSD).
1 Автоматическая сегментация страницы с OSD.
2 Автоматическая сегментация страницы но без OSD или OCR.
3 Полностью автоматическая сегментация страницы, но без OSD. (По умолчанию)
4 Предполагается единичная колонка текста переменной длины.
5 Предполагается единый унифицированный блок вертикально выравненного текста.
6 Предполагается единый унифицированный блок текста.
7 Обрабатывать изображение как единичную текстовую строку.
8 Обрабатывать изображение как единичное слово.
9 Обрабатывать изображение как единичное слово в круге.
10 Обрабатывать изображение как единичный символ.
11 Разреженный текст. Найти столько текста, сколько возможно без особого порядка.
12 Разреженный текст с OSD.
13 Сырая строка. Обрабатывать изображение как единичную текстовую строку, обход специфичных для Tesseract хаков.

Идеально точного результата не будет никогда, только больше ошибок или меньше ошибок.
Ответ написан
NeiroNx
@NeiroNx
Программист
Увеличить разрешение текста до 150...300 dpi.
тессеракт достаточно тупая система - чем больше точек приходится на букву тем лучше.

на ваших образцах в лучшем случае 75dpi - это очень мало.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы