Преобразование растрового графика в таблицу данных

Такие задачи иногда возникают. Например, совсем недавно мне в руки попали данные натурного эксперимента, проводившегося 10 лет назад. Те графики, которые мне необходимы, оказались оформлены в виде… обычных растровых *.bmp-файлов. Таблиц со значениями среди материала по эксперименту не оказалось. А таблицы значений очень бы пригодились, ведь эти данные надо сравнить с моими результатами моделирования, а потом оформить всё это дело на должном уровне.Эта проблема возникала ещё пару раз в прошлом. Например, когда я помогал моей любимой женщине делать курсовой по электрическим машинам — расчеты вели в Maple, а большинство расчетных данных имелись в учебнике Копылова в виде графиков. И это тоже растр. И много было попорчено крови, прежде чем нужные таблицы было вбиты нами в программу.

В общем, если у человека нет проблем, он их придумывает, чтобы успешно и героически их решать. Почесав затылок и вооружившись гуглом я стал искать не слишком болезненное решение задачи.

Понятно, что первый этап — растровые графики надо превратить в векторные. А из векторного формата, особенно если он открытый, числовые даные можно вытащить, маштабировать и превратить в таблицу.

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

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

Ответ был найден… на ЛОРе! Ответом стал — Easy Trace Pro. По словам авторов эта программа — интелектуальный трассировщик картографических данных, и предназначена для векторизации карт.

Данная программа — проприетарное ПО для OS Windows, однако, вместе с платной версией 9 авторами предалагается полнофункциональная предыдущая версия — 7.99 для бесплатного скачивания и неограниченного использования. Кроме того, на сайте есть инструкция по запуску Easy Trace с помощью wine. Последнее я не пробовал — запустил виртуальную машину с виндой и установил бесплатную версию.

Результат превзошел мои ожидания. Возможно, использованная техника это очередной «велосипед», но она дала свои плоды, и если Вам это тоже интересно — прошу под кат.

Итак, у нас есть растровый график. По хорошему для данного примера надо бы взять тот график по эксперименту, что вызвал весь сыр-бор. Но (не надо кидать в меня тапком) я не буду его публиковать. Данные переданы мне для личного использования, а разрешения на публикацию никто не давал, а я не спрашивал. Так что для иллюстрации решения задачи возьмем мой график, предварительно превратив его в растровый, например в тот же PNG. PNG взят, чтобы пощадить время и нервы моих читателей, для ускорения загрузки картинки.01f4ecfa71814a7ebe549a1bc8f55dcb.png

Устанавливаем Easy Trace Pro и создаем там новый проект на основе растрового файла24d4f3b9a916492396b0eb02c02ee4ae.PNG

Задаем единицы измерения и положение начала координат — я взял миллиметры и левый нижний угол255da7475afc4b7f93e6ea741c7c2c64.PNG

В итоге наш проект готовab01a321df3344d1ada8f29aae2f5b0c.PNG

Векторизация растра это процесс не исключающий ручной труд. Тем более здесь несколько графиков, мои данные эксперимента тоже были такого плана. Поэтому, первое что мы делаем — выбираем цвет, по которому будет производится трассировкаИнструменты → Трассировка → Набор цветов

Мышинным курсором наводимся на нужный график и после появления в окошке у курсора нужного цвета кликаем.

98752f1d20aa4a9a912aade7608c41ee.PNG

На этом скрине курсор мыши не получился — видимо стесняется, но выбранный график видно на следующем скрине — он подсвечен розовым

3f151bc6987242e09641ce7ef3646fe6.PNG

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

Инструменты → Трассировка → Криволинейная

После этого щелкаем курсором в начало графика

2bbbf35b7abe4fb0b5d0fb17fb864bc4.PNG

И программа чертит вдоль кривой графика довольно длинную линию, выбирая её из всего содержимого по заданному нами цвету. И останавливается только там, где её непонятно, куда идти дальше. На скриншоте видно — наткнулась на высокочастотную «мазню». Этот участок придется аккуратно пройти вручную

7fa7f90b5ea24668809502f478d05c16.PNG

После того как мы минуем его, трассировка уверенно рванет дальше, точно идя по кривой графика

1cf8a7e11cc3446e8b12e98879355842.PNG

и опять остановится. До конца идти придется вручную, но очевидно, что для достаточно гладких кривых, процесс будет проходить автоматически без помех.

После того как мы прошли весь график, у нас имеется векторная кривая, которую надо конвертировать в таблицу точек.

Файл → Экспорт

В появившемся окне выбираем формат.

9f5ff23a684743ff95f7afd2feeb37bd.PNG

Надо сказать, выбор не велик, и единтвенная позиция, которая нас заинтересует это CSV, который можно будет открыть в Excel или LibreOffice Calc. Далее настраиваем параметры экспорта, в частности выбираем векторный слой, в котором расположен наш график

2b0eafcdfe7549e6bb50b32cbfa38ccd.PNG

задаем имя файла

b3927884c1f64632b8824dbc65280d0f.PNG

и обращаем внимание на тип разделителя колонок данных — запятая, что стоит по умолчанию, нас устроит

d559aa56b0fe40c882c59b5acc117f64.PNG

Всё, в файле graph.csv имеются данные, снятые с растрового графика.

Естественно, нас интересуют X, Y не в миллиметрах от левого нижнего угла, а единицы измерения, отложенные по осям. Кроме того, необходимо скорректировать положение начала координат. Этим мы займемся в LibreOffice Calc, хотя можно использовать и любое другое ПО, подходящее для обработки массивов данных.Открываем таблицу данных в LibreOffice Calc.

c16feb2a40b74e8c9a776fe637c1f23b.png

Здесь обращаем внимание на кодировку, язык выбираем «вражеский» — дабы разделителем целой и дробной части была точка. Импортируем таблицу начиная с 4-й строки, игнорируя два последних столбца с нулями. Жмем ОК и получаем таблицу данных.

c2d2e0c8aac54418abc2ac65517444d8.png

Теперь скорректируем ноль. Для этого измерим, на каком расстоянии находится ноль от нижнего и левого края картинки. От левого очевидно на 15,325 мм, так как это первая точка графика. Вычитаем это значение из всех значений первого столбца.

Ордината первой точки тоже равна нулю, значит из второго столбца надо вычесть 69,342. Но это в данном случае. В противном случае, в Easy Trace есть линеечка, которой можно определить смещение нуля.

45b5c862903847fbb83894ca174beb45.png

Готово, нуль находится там где надо. Теперь вычислим масштаб по осям. Обмерим линейкой ось времени и ось ординат. Выходит такой расклад: 20 секундам соответствует 184,4 мм оси абсцисс, а 600 килоньтонам — 80,4 мм оси ординат. По пропорции корректируем значения с столбца C и D нашей таблицы.

В общем, ура — у нас есть таблица данных, выдранная из растрового графика. Осталось проверить насколько это всё соответствует истине.

b4b9c708bf5b4f0a92f5bfac54bf90e5.png

Для исходного графика из примера у меня имеются данные (сам же их и получил), поэтому я просто построю оба графика и мы сравним их

1dea97858ac9488ea8211f59517073c8.png

Совпадение хромает лишь в местах, где линия графика была смазана на растре, но при должной сноровке можно было подогнать её и получше.

Тем не менее, у нас есть таблица данных, которые можно строить в вектор, интерполировать, и обрабатывать так, как нам требуется.

Изложенный подход довольно бесхитростный и доступен каждому. Сам делаю это впервые, по первой сработавшей подсказке, поэтому могу не ориентироваться в технике подобных работ. Если читатель может предложить что-то более рациональное, то автор открыт для конструктивной критики.Благодарю за внимание!

© Habrahabr.ru