Как перевести картинку в график
Программа для оцифровки графиков, чертежей, рисунков: алгоритмы проекта «Репетитор: математика»
Содержание
Вступительное слово
В различных областях, связанных с наукой и образованием, инженерным делом встречается задача, связанная с получением данных с графиков, созданных в то время, когда еще не существовало цифровых носителей, или реальные данные, по которым созданы графики, были утеряны, или, наконец, график является финальной формой работы некоторых приборов, не выдающими набор координат точек в явном виде.
Для того, чтобы получить данные, нужно “оцифровать” такой график (или графический объект), другими словами, нужно получить набор абсцисс и ординат точек графика — далее над ними можно будет производить различные манипуляции: построить новый (качественный) график, производить вычисления, переведя его в новый формат (например, построив сплайн) и пр.
Принцип работы
Работа программы довольно проста. Необходимо поместить цифровую иллюстрацию (скан, фото, скриншот, другая картинка) на некоторое поле на “первый” слой. Далее выполняется еёручная обработка:
Для создания программы оцифровки графиков — как и для многих других задач — мы используем язык Wolfram Language.
Описание программы
Конечно, мы не будем описывать, как работает по шагам весь код программы, представленной ниже, это было бы очень долго и, как нам кажется, тех, кого заинтересует рассматриваемый вопрос или, более того, тех перед кем он остро стоит — сами смогут разобраться во всех “винтиках” кода, благо, он краток.
Мы же обратим внимание на его главные элементы.
Начнем с набора функций, которые потребуются для реализации. Вы можете посмотреть на то, что делает каждая из них, в документации:
Одной из основных функций в работе данной программы является функция DynamicModule для создания интерактивных пространств и объектов. С её помощью происходит «оживление» всей конструкции.
Функция Grid необходима для организации пространства — она позволяет строить таблицы различной формы и размещать в их ячейках контент: тексты, слайдеры, иллюстрации, интерактивные объекты и т. д.
Функции LocatorPane, Slider, Slider2D, InputField служат для того, чтобы сделать интерактивные элементы — поле с выбором точек, слайдеры (одно- и двумерные, соответственно), поле ввода текста (для области определения функции).
Для «рисования» графическими примитивами служит функция Graphics (и если нужно в 3D — то Graphics3D).
И, конечно, самой важной здесь является функция BSplineCurve, которая позволяет представить набор точек в виде готовой кривой B-сплайна.
На видео ниже вы можете посмотреть то, как работает программа вживую:
Финальный код программы
Итоговая функция на самом деле не так велика, как могло бы показаться. Хотя это, конечно, прямое следствие больших возможностей Wolfram Language:
Преимущества работы с оцифрованными функциями на примерах
Естественно с графикой до оцифровки какая-либо работа крайне затруднена, однако, после того, как вы оцифровали график, скажем, с помощью нашей программы, вы можете уже очень многое. Покажем несколько примеров.
Например, пусть дан график:
Давайте оцифруем его (см. видео выше) и произведем вычисления.
Для начала только заменим головную часть полученного в ходе работы программы выражения с BSplineCurve на BSplineFunction, которая строит аналитическое выражение с которым можно уже производить вычисления:
Единственный недостаток — это то, что такая функция нормирована на 1, т. е. функция f(t) при изменении t от 0 до 1 пробежит все свои значения, которыми являются точки B-сплайна:
Однако, с этим легко бороться. Достаточно построить интерполяционный полином:
После этого уже можно делать, что угодно.
Построить график, скажем, от 1 до 9:
Проинтегрировать функцию по всей области задания:
Построить график производной:
Найти длину кривой:
Или же аналитическое представление кривой (в параметрическом виде):
А можно, конечно, и просто облагородить изначальный график:
Извлечение данных из картинки с помощью Illustrator и Excel 1
В данном примере используется Excel 2013 и Illustrator СС, но метод применим и для других версий и программ. Сложность низкая, требуются базовые навыки работы в Illustrator и Excel.
В качестве исходника будет выступать вот такой безымянный скан без подписанных значений для каждого столбца. Ниже мы пошагово расскажем, как такую картинку можно перевести в интерактивную диаграмму, причем более наглядную.
Рис. 1. Исходная гистограмма
1. Открываем исходное изображение в Иллюстраторе. Нужно убедиться, что оно расположено строго горизонтально.
2. Расставляем направляющие с постоянным интервалом таким образом, чтобы на один год приходилась одна направляющая.
3. С помощью инструмента «Перо» создаем две ломанные кривые, вручную отмечая высоту столбцов. Принадлежащие одному году точки кривых размещаем друг под другом, ориентируясь на созданные на прошлом шаге направляющие. Это нужно для того, чтобы ряд координат X был одинаков у обеих кривых.
Рис. 2. Поверх исходной растровой картинки положены направляющие и нарисованы две векторные кривые
Рис. 3. Лишнее удалено, кривые отзеркалены по вертикали и выровнены по верхнему левому углу монтажной области
6. В коде нас интересуют только координаты точек, из которых состоят красная и синяя кривые. На рисунке ниже искомые данные выделены красным. Проведём автозамену в два этапа так, чтобы целая и дробная части отделялись запятой, а не точкой. Это нужно для того, чтобы позднее Эксель правильно понимал формат числа.
Рис. 5. Искомые части кода
7. В неизменённых данных запятая разделяет пару координат X и Y. Так как запятая будет выполнять роль разделителя целой и дробной частей, то разделять координаты X и Y должен другой символ. В нашем случае это — точка с запятой. Проведём замену запятой на точку с запятой.
Рис. 6. Замена разделителя координат X и Y
8. Теперь можно заменить точки на запятые. Описанный порядок замены не позволит испортить данные. Если провести замену точки на запятую сразу в исходных данных, это приведёт к тому, что запятая будет выполнять несколько ролей и при обработке данных в Экселе возникнут трудности.
Рис. 7. Замена десятичного разделителя, итоговый формат данных
9. Вставляем первый из наборов координат в ячейку Экселя.
Рис. 8. Вставка в ячейку
10. Не снимая выделения с этой ячейки во вкладке меню «Данные» нажимаем «Текст по столбцам». Нужно разбить текстовую строку в ячейке на отдельные ячейки, каждая из которых будет содержать в себе пару координат: X и Y. В качестве разделителя ячеек выбираем «пробел».
Рис. 9. Разбивка текста на ячейки, первый шаг
Рис. 10. Разбивка текста на ячейки, пробел в качестве разделителя
11. Далее нам нужно превратить горизонтальный ряд ячеек в вертикальный. Для этого выделим все ячейки, копировать → нажать правой кнопкой мыши на пустую ячейку ниже → специальная вставка → транспонировать. Горизонтальный ряд удаляем, оставляя только вертикальный.
Рис. 11. Превращение строки в столбец
12. Теперь нужно разбить столбец надвое, в левом будут координаты X, в правом Y. Разделителем в примере выступит точка с запятой. После разбивки нужно проверить, чтобы строки следовали сверху вниз от минимума к максимуму, ориентируясь по первому столбцу (A). Этот столбец в настоящем примере соответствует координатам X.
Рис. 12. Разбивка столбца надвое
Рис. 13. Разделённые и отсортированные столбцы координат
13. Проводим описанную выше обработку и для второго набора координат, отвечающего за вторую кривую.
14. Данные уже можно отобразить в виде точечной диаграммы. Причём, новые версии Экселя распознают пары столбцов X и Y, если в контекстном меню диаграммы зайти в «Тип диаграммы» и рассмотреть предложенные варианты.
Рис. 14. Извлечённые данные и автоматически построенная точечная диаграмма
15. У обоих наборов координат столбец X одинаков. Заменим их столбцом годов как в исходной картинке. По данным такого вида можно строить графики и гистограммы.
Рис. 15. Координаты X заменены на года
Рис. 16. Расчет коэффициента соответствия условных единиц реальным
17. Выделим коэффициент, копировать → выделить оба столбца Y → правая клавиша → специальная вставка → умножить.
Рис. 17. Домножение столбцов Y на коэффициент соответствия
18. В итоге у нас есть набор данных в Экселе, который соответствует исходной картинке, см. рисунок ниже.
Рис. 18. Исходная гистограмма со значениями
19. Такой тип диаграммы используется в исходнике, но это вовсе не значит, что он подобран хорошо. Если задача это позволяет, попробуйте подобрать более подходящий способ представления. В данном случае динамику по годам будет легче оценить по линейной диаграмме с маркерами.
Рис. 19. График с маркерами, построенный по обработанным данным
20. С помощью этой инструкции данные извлечённые из картинки можно обрабатывать, анализировать, строить по ним диаграммы другого типа. Нашей целью было сделать интерактивную визуализацию, ниже показан результат и генерирующий его код.
И вот что из этого получилось:
Если у вас есть похожие «помощники»– делитесь! Будем рады узнать что-то новое.
В подготовке материала вместе с Андреем Постуховым участвовали Олег Степанов и Максим Горчаков
Сохранение диаграммы в качестве рисунка
Диаграмму можно быстро скопировать в другое приложение или сохранить как отдельный файл изображения.
Щелкните диаграмму, которую вы хотите сохранить как рисунок.
Переключение в приложение, в которое вы хотите скопировать диаграмму. Если вы хотите сохранить файл в отдельном файле изображения, откройте любимый графический редактор, например Microsoft Paint.
Поместите курсор в то место, где вы хотите разместить диаграмму, а затем выберите на ленте кнопку Вировать или нажмите кнопку CTRL+V на клавиатуре.
Если вы вклеили диаграмму в графический редактор, чтобы сохранить ее как отдельный файл изображения, используйте файл > Сохранить, чтобы сохранить ее как новый файл.
Совет: Если вокруг диаграммы много ненужных элементов, вы можете удалить ее с помощью инструмента обрезки графического редактора.
Выбор формата графического файла
При сохранении диаграммы в виде нового файла изображения необходимо выбрать формат файла. Вот некоторые из наиболее популярных вариантов.
Рисунки, созданные в любой из программ, отображаются в другой программе точно так, как и в исходной.
Обеспечивает поддержку 256 цветов и сохранение данных изображения при сжатии файла.
Лучше всего подходит для рисунков с богатой цветовой гаммой, например для отсканированных фотографий.
Позволяет улучшать качество графических изображений на веб-сайтах благодаря возможности делать прозрачными части рисунка и регулировать яркость.
Преобразование растрового графика в таблицу данных
Такие задачи иногда возникают. Например, совсем недавно мне в руки попали данные натурного эксперимента, проводившегося 10 лет назад. Те графики, которые мне необходимы, оказались оформлены в виде… обычных растровых *.bmp-файлов. Таблиц со значениями среди материала по эксперименту не оказалось. А таблицы значений очень бы пригодились, ведь эти данные надо сравнить с моими результатами моделирования, а потом оформить всё это дело на должном уровне.
Эта проблема возникала ещё пару раз в прошлом. Например, когда я помогал моей любимой женщине делать курсовой по электрическим машинам — расчеты вели в Maple, а большинство расчетных данных имелись в учебнике Копылова в виде графиков. И это тоже растр. И много было попорчено крови, прежде чем нужные таблицы было вбиты нами в программу.
В общем, если у человека нет проблем, он их придумывает, чтобы успешно и героически их решать. Почесав затылок и вооружившись гуглом я стал искать не слишком болезненное решение задачи.
Понятно, что первый этап — растровые графики надо превратить в векторные. А из векторного формата, особенно если он открытый, числовые даные можно вытащить, маштабировать и превратить в таблицу.
Первым делом я опробовал Inkscape. Редактор этот я использую очень часто — несмотря на то что начало работы с ним давалось тяжело, на сегодня он — главный инструмент для рисования различных картин для статей, докладов и прочей научной документации.
Однако автоматические средства векторизации с задачей не справились, вернее справились, но не так как хотелось бы. Вполне возможно, что я не до конца разобрался с ними. В любом случае, попытки использовать Inkscape были оставлены на неопределенный срок и взор снова обратился к гуглу.
Ответ был найден… на ЛОРе! Ответом стал — Easy Trace Pro. По словам авторов эта программа — интелектуальный трассировщик картографических данных, и предназначена для векторизации карт.
Данная программа — проприетарное ПО для OS Windows, однако, вместе с платной версией 9 авторами предалагается полнофункциональная предыдущая версия — 7.99 для бесплатного скачивания и неограниченного использования. Кроме того, на сайте есть инструкция по запуску Easy Trace с помощью wine. Последнее я не пробовал — запустил виртуальную машину с виндой и установил бесплатную версию.
Результат превзошел мои ожидания. Возможно, использованная техника это очередной «велосипед», но она дала свои плоды, и если Вам это тоже интересно — прошу под кат.
1. Постановка задачи
Итак, у нас есть растровый график. По хорошему для данного примера надо бы взять тот график по эксперименту, что вызвал весь сыр-бор. Но (не надо кидать в меня тапком) я не буду его публиковать. Данные переданы мне для личного использования, а разрешения на публикацию никто не давал, а я не спрашивал. Так что для иллюстрации решения задачи возьмем мой график, предварительно превратив его в растровый, например в тот же PNG. PNG взят, чтобы пощадить время и нервы моих читателей, для ускорения загрузки картинки.
Устанавливаем Easy Trace Pro и создаем там новый проект на основе растрового файла
Задаем единицы измерения и положение начала координат — я взял миллиметры и левый нижний угол
В итоге наш проект готов
2. Трассировка линии графика и конвертация в табличный формат
Векторизация растра это процесс не исключающий ручной труд. Тем более здесь несколько графиков, мои данные эксперимента тоже были такого плана. Поэтому, первое что мы делаем — выбираем цвет, по которому будет производится трассировка
Мышинным курсором наводимся на нужный график и после появления в окошке у курсора нужного цвета кликаем.
На этом скрине курсор мыши не получился — видимо стесняется, но выбранный график видно на следующем скрине — он подсвечен розовым
Теперь будем трассировать. Руководство к программе я не читал, так что действовал на обум, и надо сказать, программа достаточно дружественна для нового пользователя
После этого щелкаем курсором в начало графика
И программа чертит вдоль кривой графика довольно длинную линию, выбирая её из всего содержимого по заданному нами цвету. И останавливается только там, где её непонятно, куда идти дальше. На скриншоте видно — наткнулась на высокочастотную «мазню». Этот участок придется аккуратно пройти вручную
После того как мы минуем его, трассировка уверенно рванет дальше, точно идя по кривой графика
и опять остановится. До конца идти придется вручную, но очевидно, что для достаточно гладких кривых, процесс будет проходить автоматически без помех.
После того как мы прошли весь график, у нас имеется векторная кривая, которую надо конвертировать в таблицу точек.
В появившемся окне выбираем формат.
Надо сказать, выбор не велик, и единтвенная позиция, которая нас заинтересует это CSV, который можно будет открыть в Excel или LibreOffice Calc. Далее настраиваем параметры экспорта, в частности выбираем векторный слой, в котором расположен наш график
и обращаем внимание на тип разделителя колонок данных — запятая, что стоит по умолчанию, нас устроит
Всё, в файле graph.csv имеются данные, снятые с растрового графика.
3. Перевод данных в интересующие нас единицы измерения
Естественно, нас интересуют X, Y не в миллиметрах от левого нижнего угла, а единицы измерения, отложенные по осям. Кроме того, необходимо скорректировать положение начала координат. Этим мы займемся в LibreOffice Calc, хотя можно использовать и любое другое ПО, подходящее для обработки массивов данных.
Открываем таблицу данных в LibreOffice Calc.
Здесь обращаем внимание на кодировку, язык выбираем «вражеский» — дабы разделителем целой и дробной части была точка. Импортируем таблицу начиная с 4-й строки, игнорируя два последних столбца с нулями. Жмем ОК и получаем таблицу данных.
Теперь скорректируем ноль. Для этого измерим, на каком расстоянии находится ноль от нижнего и левого края картинки. От левого очевидно на 15,325 мм, так как это первая точка графика. Вычитаем это значение из всех значений первого столбца.
Ордината первой точки тоже равна нулю, значит из второго столбца надо вычесть 69,342. Но это в данном случае. В противном случае, в Easy Trace есть линеечка, которой можно определить смещение нуля.
Готово, нуль находится там где надо. Теперь вычислим масштаб по осям. Обмерим линейкой ось времени и ось ординат. Выходит такой расклад: 20 секундам соответствует 184,4 мм оси абсцисс, а 600 килоньтонам — 80,4 мм оси ординат. По пропорции корректируем значения с столбца C и D нашей таблицы.
В общем, ура — у нас есть таблица данных, выдранная из растрового графика. Осталось проверить насколько это всё соответствует истине.
Для исходного графика из примера у меня имеются данные (сам же их и получил), поэтому я просто построю оба графика и мы сравним их
Совпадение хромает лишь в местах, где линия графика была смазана на растре, но при должной сноровке можно было подогнать её и получше.
Тем не менее, у нас есть таблица данных, которые можно строить в вектор, интерполировать, и обрабатывать так, как нам требуется.
Заключение
Изложенный подход довольно бесхитростный и доступен каждому. Сам делаю это впервые, по первой сработавшей подсказке, поэтому могу не ориентироваться в технике подобных работ. Если читатель может предложить что-то более рациональное, то автор открыт для конструктивной критики.
Благодарю за внимание!
P.S.: Easy Trace Pro прекрасно запускается и работает под wine, так что необходимости в виртуальной Windows нет
Использование рисунка на диаграмме
Диаграмму можно улучшить, вставив изображение (например, логотип компании) в область диаграммы. Кроме того, вы можете использовать заливку рисунком, чтобы привлечь внимание к определенным элементам диаграммы, таким как область диаграммы, область построения, маркеры данных (в г столбце, линире, области, пузырьковой, объемной графике, а также на диаграммах с областями легенда (в двух- и объемных диаграммах) или трехмерные стены и потолок диаграммы.
Вы также можете скопировать рисунок на диаграмму или в элементы диаграммы, такие как маркеры данных в объемных графиках, точечная диаграмма или неисполнена. Если рисунок больше не нужен, его можно удалить.
Вставка рисунка на диаграмму
Щелкните в области диаграммы.
На вкладке Вставка в группе Иллюстрации нажмите кнопку Рисунки.
Найдите рисунок, который нужно вставить, и дважды щелкните его.
Совет: Чтобы добавить несколько рисунков, щелкните их, удерживая нажатой кнопку CTRL, а затем нажмите кнопку Вставить.
Чтобы изменить размер рисунка, перетащите его маркер изменения размера от центра рисунка или к его центру. Для этого вы можете сделать следующее:
Чтобы сохранить центр рисунка в том же месте, перетащите его, удерживая на удержании CTRL.
Чтобы сохранить пропорции рисунка, перетащите его, удерживая на удержании shift.
Чтобы сохранить центр рисунка в одном месте и сохранить его пропорции, при перетаскиваниях удерживайте на удержание CTRL+SHIFT.
Вы также можете выбрать рисунок и ввести нужный размер в поля Высота фигуры и Ширина фигуры (вкладка Формат, группа Размер).
Чтобы переместить рисунок, перетащите его в нужное место.
Примечание: Рисунки, вставленные в диаграмму, внедряются в диаграмму, поэтому увеличивают размер файла. Чтобы уменьшить размер файла, можно добавить ссылку на рисунок, а не вставить его. В диалоговом окне Вставка рисунка щелкните рисунок, который вы хотите вставить, щелкните стрелку рядом с кнопкой Вставить ивыберите связать с файлом.
Заполнение элемента диаграммы рисунком
На диаграмме щелкните область диаграммы, область печати, маркер данных, легенду, объемную стену или объемный пол, которые вы хотите заполнить рисунком.
Откроется панель Работа с диаграммами с дополнительными вкладками Конструктор, Макет и Формат.
На вкладке Формат в группе Стили фигур нажмите кнопку Заливка фигуры 
Найдите рисунок, который нужно вставить, и дважды щелкните его.
Копирование рисунка в элемент диаграммы или диаграммы
Выберите рисунок, который вы хотите скопировать, и нажмите CTRL+C.
Щелкните, чтобы выбрать область диаграммы или элемент диаграммы, в который вы хотите в нее вклеить рисунок.
Нажмите CTRL+V, чтобы вировать выделение.
Удаление рисунка из диаграммы
Выполните одно из следующих действий:
Чтобы удалить рисунок, вставленный в диаграмму, щелкните его и нажмите кнопку DELETE.
Чтобы удалить рисунок, который был заполнен элементом диаграммы, выберите его и сделайте следующее:
На вкладке Формат в группе Текущий фрагмент нажмите кнопку Формат выделенного фрагмента.
На вкладке Заливка & линия 
Совет: Чтобы удалить рисунок и другие эффекты заливки, примененные к выбранному элементу диаграммы, выберите нет заливки.
Вставка рисунка на диаграмму
Щелкните в области диаграммы.
Откроется панель Работа с диаграммами с дополнительными вкладками Конструктор, Макет и Формат.
На вкладке Макет в группе Вставка нажмите кнопку Рисунок.
Найдите рисунок, который нужно вставить, и дважды щелкните его.
Совет: Чтобы добавить несколько рисунков, щелкните их, удерживая нажатой кнопку CTRL, а затем нажмите кнопку Вставить.
Чтобы изменить размер рисунка, перетащите его маркер изменения размера от центра рисунка или к его центру. Для этого вы можете сделать следующее:
Чтобы сохранить центр рисунка в том же месте, перетащите его, удерживая на удержании CTRL.
Чтобы сохранить пропорции рисунка, перетащите его, удерживая на удержании shift.
Чтобы сохранить центр рисунка в одном месте и сохранить его пропорции, при перетаскиваниях удерживайте на удержание CTRL+SHIFT.
Вы также можете выбрать рисунок и ввести нужный размер в поля Высота фигуры и Ширина фигуры (вкладка Формат, группа Размер).
Чтобы переместить рисунок, перетащите его в нужное место.
Примечание: Рисунки, вставленные в диаграмму, внедряются в диаграмму, поэтому увеличивают размер файла. Чтобы уменьшить размер файла, можно добавить ссылку на рисунок, а не вставить его. В диалоговом окне Вставка рисунка щелкните рисунок, который вы хотите вставить, щелкните стрелку рядом с кнопкой Вставить ивыберите связать с файлом.
Заполнение элемента диаграммы рисунком
На диаграмме щелкните область диаграммы, область печати, маркер данных, легенду, объемную стену или объемный пол, которые вы хотите заполнить рисунком.
Откроется панель Работа с диаграммами с дополнительными вкладками Конструктор, Макет и Формат.
На вкладке Формат в группе Стили фигур выберите элемент Заливка фигуры.
Найдите рисунок, который нужно вставить, и дважды щелкните его.
Копирование рисунка в элемент диаграммы или диаграммы
На диаграмме или на диаграмме выберите рисунок, который вы хотите скопировать.
На вкладке Главная в группе Буфер обмена нажмите кнопку Копировать 
Сочетания клавиш. Чтобы скопировать выделение, нажмите клавиши CTRL+C.
Щелкните область диаграммы или элемент диаграммы, в который вы хотите в нее вклеить рисунок.
На вкладке Главная в группе Буфер обмена нажмите кнопку 
Сочетания клавиш. Чтобы вировать выделение, нажмите клавиши CTRL+V.
Удаление рисунка из диаграммы
Выполните одно из следующих действий:
Чтобы удалить рисунок, вставленный в диаграмму, щелкните его и нажмите кнопку DELETE.
Чтобы удалить рисунок, который был заполнен элементом диаграммы, выберите его и сделайте следующее:
На вкладке Макет в группе Текущий фрагмент нажмите кнопку Формат выделенного фрагмента.
Нажмите кнопкуЗаливка и в области Заливкавыберите авто.
Совет: Чтобы удалить рисунок и другие эффекты заливки, примененные к выбранному элементу диаграммы, выберите нет заливки.






















