Інші відповіді припускають, що ви маєте справу з растровим зображенням графіка. Але на сьогодні гарною практикою є публікація графіків у векторній формі. У цьому випадку ви можете досягти набагато більшої точності відновлених даних і навіть оцінити похибку відновлення, якщо працювати безпосередньо з кодом векторного графіка, не перетворюючи його на растрове зображення.
Оскільки документи публікуються в Інтернеті у вигляді PDF-файлів, я вважаю, що у вас є файл PDF, який містить векторний графік з даними, які ви хочете відновити з нього (отримуйте в числовій формі) та оцінюючи введену помилку відновлення.
Перш за все, PDF - це векторний формат, який в основному є текстовим (його можна прочитати текстовим редактором). Проблема полягає в тому, що він може (і майже завжди) містити стиснуті потоки даних, які потребують нестисненості, щоб прочитати їх текстовим редактором. Ці стислі потоки даних зазвичай містять потрібну нам інформацію.
Існує кілька способів розпакувати потоки даних, щоб перетворити PDF-файл у текстовий документ із читаним PDF-кодом. Напевно, найпростішим способом є використання безкоштовної утиліти QPDF з --stream-data=uncompress
опцією :
qpdf infile.pdf --stream-data=uncompress -- outfile.pdf
Деякі інші способи описані тут і тут .
Створений outfile.pdf може відкрити текстовий редактор. Тепер вам потрібен PDF-довідник посібника 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. Якщо в позиціонуванні кліщів є помітні помилки, ви можете зменшити помилку, встановивши координати кліщів на лінійну модель. Ця лінійна функція тепер може бути використана для отримання оригінальних координат точок шляху (тобто в системі координат ділянки).