Другие ответчики предполагают, что вы имеете дело с растровым изображением графика. Но в настоящее время хорошей практикой является публикация графиков в векторном виде. В этом случае вы можете добиться гораздо более высокой точности восстановленных данных и даже оценить ошибку восстановления, если работаете с кодом векторного графа напрямую, не преобразовывая его в растровое изображение.
Поскольку документы публикуются в Интернете в виде файлов PDF, я предполагаю, что у вас есть файл PDF, который содержит векторный график с данными, которые вы хотите восстановить из него (получите в числовой форме), и оцените внесенную ошибку восстановления.
Прежде всего, PDF - векторный формат, который в основном текстовый (может быть прочитан текстовым редактором). Проблема заключается в том, что он может (и почти всегда) содержать сжатые потоки данных, которые необходимо распаковать, чтобы прочитать их в текстовом редакторе. Эти сжатые потоки данных обычно содержат необходимую нам информацию.
Существует несколько способов распаковать потоки данных, чтобы преобразовать файл PDF в текстовый документ с читаемым кодом PDF. Вероятно, самый простой способ - использовать бесплатную утилиту QPDF с --stream-data=uncompress
опцией :
qpdf infile.pdf --stream-data=uncompress -- outfile.pdf
Некоторые другие способы описаны здесь и здесь .
Сгенерированный файл outfile.pdf может быть открыт текстовым редактором. Теперь вам нужно PDF Reference Manual 1.7, чтобы понять, что вы видите. Не паникуйте в этот момент! Вам нужно знать только несколько операторов, описанных в «ТАБЛИЦЕ 4.9 Операторы построения пути» на страницах 226 - 227. Наиболее важными являются операторы (первый столбец содержит спецификацию координат для оператора, второй - оператор, а третий - имя оператора ):
x y m moveto
x y l lineto
x y width height re rectangle
h closepath
В большинстве случаев достаточно знать эти четыре оператора для восстановления данных.
Теперь вам нужно импортировать файл outfile.pdf в виде текста в некоторую программу, где вы можете манипулировать данными. Я покажу, как это сделать с Mathematica .
Импорт файла:
pdfCode = Import["outfile.pdf", "Text"];
Теперь я предполагаю самый простой случай: граф содержит линию, состоящую из множества двухточечных отрезков. В этом случае каждый сегмент линии кодируется так:
268.79999 408.92975 m
272.39999 408.92975 l
Извлечение всех таких сегментов из кода PDF:
lines = StringCases[pdfCode,
StartOfLine ~~ x1 : NumberString ~~ " " ~~ y1 : NumberString ~~ " m\n" ~~
x2 : NumberString ~~ " " ~~ y2 : NumberString ~~ " l\n"
:> ToExpression@{{x1, y1}, {x2, y2}}];
Визуализация их:
Graphics[{Line[lines]}]
Вы получите что-то вроде этого (статья, с которой я работаю, содержит четыре графика):
Каждые два соседних сегмента имеют одну точку. Так что в этом случае вы можете превратить последовательности соседних сегментов в пути:
paths = Split[lines, #1[[2]] == #2[[1]] &];
Теперь вы можете визуализировать все пути отдельно:
Graphics[{Line /@ paths}]
На этом рисунке вы можете выбрать (двойным щелчком) путь, который вы ищете, скопировать графику и вставить как новый Graphics
. Для преобразования его обратно в список точек вы берете элемент {1, 1, 1}
. Теперь у нас есть точки не в системе координат графика, а в системе координат PDF-файла. Нам нужно установить отношения между ними.
На приведенном выше графике вы выбираете галочки вручную (удерживая Shift
для многократного выбора), затем копируете их и вставляете как новые Graphics
. Вот как вы можете извлечь координаты горизонтальных отметок:
Теперь проверьте разницу между галочками:
Differences[reHorTicks]
Из этих различий вы можете видеть, насколько точно позиционирование галочек в файле PDF. Это дает оценку ошибки, вносимой путем преобразования исходных точек данных в векторный граф, включенный в файл PDF. Если есть заметные ошибки в позиционировании тиков, вы можете уменьшить их, подгоняя координаты тиков к линейной модели. Эта линейная функция теперь может использоваться для получения исходных координат точек пути (то есть в системе координат графика).