@karmoed

Как получить файл .csv из .png?

Мне нужен файл в формате .csv с данными о символах на .png изображении.
Для того, чтобы импортировать его в игру и сделать перевод, так как встроенный шрифт не поддерживает кириллицу. Я сделал png с кириллическими символами, но для программы, с помощью которой я импортирую .png, нужен файл .csv.
Сам оригинальный .csv выглядит так:

spoiler

46;408;252;6;48;7;0
47;164;152;16;48;16;-1
48;124;52;22;48;22;0
49;215;252;10;48;9;-1
50;286;102;17;48;17;0
51;106;102;18;48;19;0
52;400;102;17;48;17;0
53;217;52;20;48;20;0
54;239;52;20;48;20;0
55;246;102;18;48;19;0

Здесь указаны данные о символах в таком порядке:
ID из таблицы ANCII, x, y, width, height, ?, ? - предназначение двух последних чисел мне неизвестно. Возможно это какое-то смещение по иксу или игрек.

Я уже третий час пытаюсь добиться результатов.
ChatGpt посоветовал мне:

Существуют как коммерческие, так и бесплатные OCR-программы, такие как ABBYY FineReader, Adobe Acrobat, Tesseract и др. Вам необходимо открыть файл .png в выбранной программе OCR и выбрать опцию экспорта данных в формате .csv.


С Tesseract всё сложно, нужно делать билд, запускать из командой строки - это не про меня, я в растерянности.

Для установки ABBYY FineReader требуется Openbox, при установке которого нужно выставить все галочки, чтобы заодно установить и всё яндексовское барахло... На сайте так и написано:
Если снять все галочки, рекомендуемое ПО не установится!

К тому же, уверен, на сайте ABBYY FineReader есть только обычные версии (для PDF). Я так понимаю, что есть версии OCR. Но на рутр..кере версии ABBYY FineReader OCR есть только на MacOs.

EASY SCREEN OCR имеет только х32 версию, отчего не запускается на х64 системе

все онлайн конверторы возвращают пустой .csv файл. А большинство результатов выдачи в гугле упорно предлагает возможность конвертировать .png в .csv, а не наоборот.
Я уже в диком отчаянии...
  • Вопрос задан
  • 179 просмотров
Пригласить эксперта
Ответы на вопрос 1
@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к символов), так что словарь и пример вывода в консоль результата данных, на основе изображения выше (оно под спойлером), напишу в отдельном комментарии ниже.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы