Когда я только-только устроился на новую работу в ноябре 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
С этим уже можно работать :) Сохраняются только те точки, что были отмечены. Это было сделано по той причине, что во всех моих программах используется та же библиотека для интерполяции функций, что применена здесь. Поэтому если я вручную отметил столько точек, что интерполированный график совпал с исходным - я могу быть уверен, в моих программах при загрузке этих данных будет то же самое. А меньше точек - меньше вычислений, что не может не радовать.
Вот такая вот программа. Скачать ее можно
отсюда, а исходные коды лежат
здесь. Если есть какие-то конструктивные предложения, с радостью выслушаю, а если будет время - могу что-то поправить или дополнить.