ImageGraph2Txt - программа "оцифровки" графиков

Apr 29, 2012 00:40

Когда я только-только устроился на новую работу в ноябре 2010 года, мне дали первое задание - оценить, можно ли через пеленгатор системы лазерной связи разглядеть хотя бы какие-то звезды. Пеленгатор - это оптико-электронная система, которая должна находить луч маяка от наземного пункта и затем, управляя опорно-поворотным устройством, удерживать его по центру. Маяк - это лазер с длиной волны 800 нм (ближний ИК), а чтобы он был лучше заметен на фоне Земли, решено было поставить в пеленгаторе светофильтр, пропускающий только 775..815 нм. Надо было составить перечень звезд, которые можно разглядеть на фоне шумов, если светофильтр присутствует, и еще один - если мы его все-таки уберем, специально, чтобы увидеть звезды - это помогло бы уточнить ориентацию нашей системы связи. Мало ли, как ее закрепили и насколько деформировались от нагревов-охлаждений несущие конструкции?

Я с энтузиазмом взялся за работу. Выспросил все параметры объектива - диаметр, коэффициент пропускания, функцию рассеяния точки, узнал, какая матрица стоит - Star250. Это КМОП-матрица с паршивенькими характеристиками, зато стойкая к космическим лучам. В даташите на нее приводилась спектральная чувствительность:



Неопрятный график - сетка идет только по горизонтали, и то очень редко. Кроме этого изображения, ничего нет - а мне нужен этот график в численном виде, чтобы посчитать, какой отклик вызовут звезды разных спектральных классов. В тот момент я поступил по-простому - распечатал этот график на бумаге, расчертил линейкой сетку, после чего ручками "вбил" общую форму кривой - без этих жутких пульсаций, обсуловленных интерференцией со светом, который переотразился от покровного стекла матрицы.

А через некоторое время написал программку, которая существенно упрощает процесс "оцифровки графиков". Потом время от времени дописывал ее, добавлял новые возможности (работа с логарифмическими осями, вставка изображения непосредственно из буфера обмена, возможность обрезать изображение прямо в программе и пр.), даже иконку ей сделал какую-никакую :). Сразу скажу - я не программист, и писал ее для себя. Но, по-моему, получилось неплохо, может, кому-то и пригодится. Итак, встречайте - ImageGraph2Txt!


Для начала загружаем изображение. Можно из файла (поддерживается bmp,gif,jpg,tiff,png,в общем, большинство картинок), а можно из буфера обмена. Это удобно, если есть какой-нибудь большой документ в формате pdf или djvu. Тогда попросту открываем нужную страницу, делаем график побольше, и жмем print screen. Кнопка "Из буфера обмена" становится доступной, жмем на нее :)


Выделяем на картинке сам график и жмем "обрезать". Идем сразу во вторую вкладку - "Выбор координат". Жмем "отметить оси". В строке состояния появляется подсказка:


Следуем подсказкам - отмечаем начало координат и по одной точке на оси x и y, напротив одного из отмеченных значений. Вводим в поля, какие координаты у начала координат (в нашем случае 400 нм и 0 А/Вт) и у двух отмеченных точек. Как только все сделано - мы можем поводить мышкой по графику, а в строке состояния будут изображаться правильные  координаты - это уже удобно!


Если нужны только точные значения в нескольких точках - на этом можно и закончить. А можно продолжить.
Переходим на следующую вкладку, выбираем цвет кривой, порядок интерполяции (0 - ступеньками, 1 - соединение прямыми линиями, 3 - кубическая сплайн-интерполяция с непрерывной первой и второй производными), подписываем оси и начинаем отмечать характерные точки:


Остается только сохранить все в текстовом файле. Вот, что получается:

[general] title=Спектральная чувствительность матрицы Star 250 Xname=Длина волны, нм Yname=Чувствительность, А/Вт order=1 [data] 398,75 0,0348082595870206 408,75 0,0554572271386431 438,75 0,0890855457227139 448,75 0,0955752212389381 458,75 0,0908554572271386 468,75 0,110914454277286 478,75 0,105604719764012 488,75 0,128613569321534 497,5 0,126253687315634 508,75 0,11976401179941 520 0,128613569321534 528,75 0,145132743362832 540 0,140412979351032 550 0,166961651917404 560 0,139823008849558 570 0,170501474926254 580 0,129793510324484 590 0,158702064896755 600 0,149852507374631 608,75 0,153982300884956 620 0,182300884955752 628,75 0,15693215339233 638,75 0,187610619469027 650 0,145722713864307 660 0,138643067846608 670 0,180530973451327 681,25 0,146902654867257 690 0,138053097345133 700 0,177581120943953 720 0,139823008849558 727,5 0,16165191740413 740 0,159882005899705 750 0,133923303834808 760 0,138053097345133 770 0,149852507374631
С этим уже можно работать :) Сохраняются только те точки, что были отмечены. Это было сделано по той причине, что во всех моих программах используется та же библиотека для интерполяции функций, что применена здесь. Поэтому если я вручную отметил столько точек, что интерполированный график совпал с исходным - я могу быть уверен, в моих программах при загрузке этих данных будет то же самое. А меньше точек - меньше вычислений, что не может не радовать.

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

imagegraph2txt, программки

Previous post Next post
Up