Преобразование растрового графика в таблицу данных
Такие задачи иногда возникают. Например, совсем недавно мне в руки попали данные натурного эксперимента, проводившегося 10 лет назад. Те графики, которые мне необходимы, оказались оформлены в виде… обычных растровых *.bmp-файлов. Таблиц со значениями среди материала по эксперименту не оказалось. А таблицы значений очень бы пригодились, ведь эти данные надо сравнить с моими результатами моделирования, а потом оформить всё это дело на должном уровне.Эта проблема возникала ещё пару раз в прошлом. Например, когда я помогал моей любимой женщине делать курсовой по электрическим машинам — расчеты вели в Maple, а большинство расчетных данных имелись в учебнике Копылова в виде графиков. И это тоже растр. И много было попорчено крови, прежде чем нужные таблицы было вбиты нами в программу.
В общем, если у человека нет проблем, он их придумывает, чтобы успешно и героически их решать. Почесав затылок и вооружившись гуглом я стал искать не слишком болезненное решение задачи.
Понятно, что первый этап — растровые графики надо превратить в векторные. А из векторного формата, особенно если он открытый, числовые даные можно вытащить, маштабировать и превратить в таблицу.
Первым делом я опробовал Inkscape. Редактор этот я использую очень часто — несмотря на то что начало работы с ним давалось тяжело, на сегодня он — главный инструмент для рисования различных картин для статей, докладов и прочей научной документации.
Однако автоматические средства векторизации с задачей не справились, вернее справились, но не так как хотелось бы. Вполне возможно, что я не до конца разобрался с ними. В любом случае, попытки использовать Inkscape были оставлены на неопределенный срок и взор снова обратился к гуглу.
Ответ был найден… на ЛОРе! Ответом стал — Easy Trace Pro. По словам авторов эта программа — интелектуальный трассировщик картографических данных, и предназначена для векторизации карт.
Данная программа — проприетарное ПО для OS Windows, однако, вместе с платной версией 9 авторами предалагается полнофункциональная предыдущая версия — 7.99 для бесплатного скачивания и неограниченного использования. Кроме того, на сайте есть инструкция по запуску Easy Trace с помощью wine. Последнее я не пробовал — запустил виртуальную машину с виндой и установил бесплатную версию.
Результат превзошел мои ожидания. Возможно, использованная техника это очередной «велосипед», но она дала свои плоды, и если Вам это тоже интересно — прошу под кат.
Итак, у нас есть растровый график. По хорошему для данного примера надо бы взять тот график по эксперименту, что вызвал весь сыр-бор. Но (не надо кидать в меня тапком) я не буду его публиковать. Данные переданы мне для личного использования, а разрешения на публикацию никто не давал, а я не спрашивал. Так что для иллюстрации решения задачи возьмем мой график, предварительно превратив его в растровый, например в тот же PNG. PNG взят, чтобы пощадить время и нервы моих читателей, для ускорения загрузки картинки.
Устанавливаем Easy Trace Pro и создаем там новый проект на основе растрового файла
Задаем единицы измерения и положение начала координат — я взял миллиметры и левый нижний угол
В итоге наш проект готов
Векторизация растра это процесс не исключающий ручной труд. Тем более здесь несколько графиков, мои данные эксперимента тоже были такого плана. Поэтому, первое что мы делаем — выбираем цвет, по которому будет производится трассировкаИнструменты → Трассировка → Набор цветов
Мышинным курсором наводимся на нужный график и после появления в окошке у курсора нужного цвета кликаем.
На этом скрине курсор мыши не получился — видимо стесняется, но выбранный график видно на следующем скрине — он подсвечен розовым
Теперь будем трассировать. Руководство к программе я не читал, так что действовал на обум, и надо сказать, программа достаточно дружественна для нового пользователя
Инструменты → Трассировка → Криволинейная
После этого щелкаем курсором в начало графика
И программа чертит вдоль кривой графика довольно длинную линию, выбирая её из всего содержимого по заданному нами цвету. И останавливается только там, где её непонятно, куда идти дальше. На скриншоте видно — наткнулась на высокочастотную «мазню». Этот участок придется аккуратно пройти вручную
После того как мы минуем его, трассировка уверенно рванет дальше, точно идя по кривой графика
и опять остановится. До конца идти придется вручную, но очевидно, что для достаточно гладких кривых, процесс будет проходить автоматически без помех.
После того как мы прошли весь график, у нас имеется векторная кривая, которую надо конвертировать в таблицу точек.
Файл → Экспорт
В появившемся окне выбираем формат.
Надо сказать, выбор не велик, и единтвенная позиция, которая нас заинтересует это CSV, который можно будет открыть в Excel или LibreOffice Calc. Далее настраиваем параметры экспорта, в частности выбираем векторный слой, в котором расположен наш график
задаем имя файла
и обращаем внимание на тип разделителя колонок данных — запятая, что стоит по умолчанию, нас устроит
Всё, в файле graph.csv имеются данные, снятые с растрового графика.
Естественно, нас интересуют X, Y не в миллиметрах от левого нижнего угла, а единицы измерения, отложенные по осям. Кроме того, необходимо скорректировать положение начала координат. Этим мы займемся в LibreOffice Calc, хотя можно использовать и любое другое ПО, подходящее для обработки массивов данных.Открываем таблицу данных в LibreOffice Calc.
Здесь обращаем внимание на кодировку, язык выбираем «вражеский» — дабы разделителем целой и дробной части была точка. Импортируем таблицу начиная с 4-й строки, игнорируя два последних столбца с нулями. Жмем ОК и получаем таблицу данных.
Теперь скорректируем ноль. Для этого измерим, на каком расстоянии находится ноль от нижнего и левого края картинки. От левого очевидно на 15,325 мм, так как это первая точка графика. Вычитаем это значение из всех значений первого столбца.
Ордината первой точки тоже равна нулю, значит из второго столбца надо вычесть 69,342. Но это в данном случае. В противном случае, в Easy Trace есть линеечка, которой можно определить смещение нуля.
Готово, нуль находится там где надо. Теперь вычислим масштаб по осям. Обмерим линейкой ось времени и ось ординат. Выходит такой расклад: 20 секундам соответствует 184,4 мм оси абсцисс, а 600 килоньтонам — 80,4 мм оси ординат. По пропорции корректируем значения с столбца C и D нашей таблицы.
В общем, ура — у нас есть таблица данных, выдранная из растрового графика. Осталось проверить насколько это всё соответствует истине.
Для исходного графика из примера у меня имеются данные (сам же их и получил), поэтому я просто построю оба графика и мы сравним их
Совпадение хромает лишь в местах, где линия графика была смазана на растре, но при должной сноровке можно было подогнать её и получше.
Тем не менее, у нас есть таблица данных, которые можно строить в вектор, интерполировать, и обрабатывать так, как нам требуется.
Изложенный подход довольно бесхитростный и доступен каждому. Сам делаю это впервые, по первой сработавшей подсказке, поэтому могу не ориентироваться в технике подобных работ. Если читатель может предложить что-то более рациональное, то автор открыт для конструктивной критики.Благодарю за внимание!