Ответы пользователя по тегу PNG
  • Как получить файл .csv из .png?

    @karmoed Автор вопроса
    Для тех, кто тоже ищет ответ, публикую сам. Спасибо Василий Банников Василий Банников за то, что посоветовал разобраться с тессерактом. Похоже, что это единственный рабочий вариант.

    Тессеракт установить легче, чем я описал в вопросе. Качать отсюда, иначе можно пару часов пытаться решить разного рода проблемы. ..
    Так же нужно добавить "tessdata" в переменные среды ОС. При установке выбрать русский язык в качестве пакета.

    Установить через CMD:
    pip install pytesseract pillow
    pip install opencv-python


    После пары часов пыток ChatGpt я всё таки смог получить очень прекрасный пример кода. До этого я в сумме потратил часов 8 на то, чтобы организовать символы в фотошопе так, чтобы тессеракт хорошо их распознавал. Мне нужно было распознать и кириллицу и латиницу, так что я делал это в 2 подхода. В примере ниже сразу обрабатывается и кириллица и латиница

    Иногда ChatGpt приводит примеры с "image_to_data", иногда с "image_to_boxes". Хоть сперва Чат утверждает, что image_to_data":


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


    Это не так. На практике всё же приходим к этому выводу:

    image_to_data возвращает данные о распознанных строках и словах, а не о каждом символе, как это делает image_to_boxes.

    image_to_data - определяет строки, а image_to_boxes - каждый символ, поэтому используйте только последний метод

    Как сообщил ChatGpt - он выхватывает готовые решения из инета. Я перепробовал пару десятков... Добиться адекватного значения высоты не удалось, потому что для её определения ChatGpt даёт мне примеры с image_to_data, а это не подходит для распознавания каждого символа. Но хоть добился хоть какого-то определения ширины и игрека, похожих на правду.

    Скрипт для запуска (пример от ChatGpt):

    import pytesseract
    import cv2
    
    # установить путь к файлу tesseract.exe (если это необходимо)
    pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
    
    img = cv2.imread(ПУТЬ_ИМЯ_ИЗОБРАЖЕНИЯ)
    
    # преобразовать изображение в серое
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # распознать каждый символ на изображении
    boxes = pytesseract.image_to_boxes(gray, lang='rus+eng') # кириллица + латиница 
    
    
    # распознать каждый символ на изображении
    boxes = pytesseract.image_to_boxes(gray, lang='rus+eng')
    
    
    # нарисовать прямоугольники вокруг символов на изображении
    for b in boxes.splitlines():
        b = b.split(' ')
        x, y, w, h = int(b[1]), int(b[2]), int(b[3]), int(b[4])
    
        h_real = img.shape[0] - y - h # вычисляем реальную высоту символа
        cv2.rectangle(img, (x, img.shape[0]-y), (w, img.shape[0]-h), (0, 0, 255), 1)
    
        print(f"Символ: {b[0]}, X: {x}, Y: {img.shape[0]-h}, Ширина: {w - x}")
    
    
    # сохранить результат в файл
    cv2.imwrite('result.png', img)


    Вот как это выглядит:
    spoiler

    641f5a58c2c22139155286.png

    Но этот пример изображения основан на отредактированном в фотошопе (ушло несколько часов) таким образом, чтобы он адекватно распознавался в более простом примере. Сперва распознавал латиницу, затем кириллицу. Сейчас распознаются оба языка. Обратите внимание на отступы между символами - иногда нужно его увеличивать или уменьшать. Так же часто приходится менять символы (не буквы) местами, чтобы они адекватно определялись и не сливались в одно целое.

    Так что не рассчитывайте, что сразу получите результат как в моём примере, возможно придётся экспериментировать.

    Так же вам может пригодиться словарь со всеми нужными ID и символами. В ответ не влезает (более 10к символов), так что словарь и пример вывода в консоль результата данных, на основе изображения выше (оно под спойлером), напишу в отдельном комментарии ниже.
    Ответ написан
    1 комментарий