eddy_em: (Default)
eddy_em ([personal profile] eddy_em) wrote2011-11-16 03:49 pm
Entry tags:

FITS (Flexible Image Transport System) формат в Octave

Продолжая свое знакомство с Octave решил я попробовать выполнить элементарные операции с FITS-файлами. Как оказалось, в "умолчательном" Octave средств для работы с FITS'ами нет. Но гугл мне помог. Итак, гугл вывел меня на страничку Octave на sourceforge. Я скачал нужный мне пакет FITS, распаковал его и попробовал скомпилировать. Но не тут-то было! При запуске ./configure ничего не произошло. Заглянув в директорию src я не увидел ничего интересного, только элементарный Makefile. Содержимое его подсказало мне, что нужно установить еще и компилятор пакетов Octave - mkoctfile. В мандриве он находится в пакете octave-devel.

Установив нужный пакет я запустил make и получил три файла:

read_fits_image.oct  save_fits_image.oct  save_fits_image_multi_ext.oct
. Куда их поместить, я понятия не имел, но
locate \.oct
вывел меня на директорию
/usr/lib/octave/3.4.2/oct/i586-mandriva-linux-gnu/
, куда (от имени рута, естественно) файлы были скопированы.

Запустив Octave я первым делом проверил, работают ли эти команды. Работают. Чтобы считать файл filename.fits в переменную var необходимо сделать:

var = read_fits_image("filename.fits");

Главное - не забыть точку с запятой в конце команды, дабы не получить потоки цифр! Про точку с запятой я "вспомнил", как раз когда забыл ее поставить. Меня приятно удивило то, что, в отличие от матлаба, заваливающего пользователя бесконечным потоком данных, Octave разбивает вывод по страницам (судя по всему, для вывода на экран используется less).

Чтобы считать еще и шапку файла, выполним:

[var, head] = read_fits_image("filename.fits");

Команда whos показывает, что head - это строковый массив с длиной строк 80 символов (вспоминаем ограничения формата FITS), в который просто построчно переписана вся шапка файла без разбиения на имя/значение/комментарий (т.е. если в Octave планируется работать с шапкой, все это придется сделать самому, либо дописать нужные функции в пакет FITS, благо средства для этого есть).

Отобразить файл на экране я пытался при помощи imshow. Фигвамушки! Я увидел ровным счетом ничего. Зато imagesc показал мне картинку и даже менял цветовую карту на команды colormap. Если вывести картинку в логарифмическом масштабе:

imagesc(log(var));

отображение будет более приятным.

Вспоминая свою fitsview, я с сожалением отметил, что использование gnuplot в качестве "чертилки" сильно действует на нервы: приходится довольно долго ждать, пока Octave передаст гнуплоту необходимые данные, а затем - пока гнуплот их отобразит на экране.

Ну и напоследок простенькая программка для суммирования файлов в директории, имеющих вид object_XXXX.fit (где XXXX - номер), начиная с номера first и заканчивая номером last:

function ret = sum_fits(first, last)
ret = [1 2 3];
frst = 1;
    i = 0;
    for num = [ first : last ]
        i++;
        name = sprintf("object_%04d.fit", num); % получаем имя файла
        II = read_fits_image(name);  % считываем его
        med = median(median(II)); % вычисляем медиану медиан по столбцам
        printf("%d:\tread file %s, median = %d\n", i, name, med); 
        fflush(1); % это нам не матлаб! 
        II -= med; % вычитаем "медиану" (bias'ы рассчитывать лень)
        if(frst == 1)  % суммируем
            frst = 0;
            ret = II;
        else
            ret += II;
        end
    end
end
И пример для изображений, полученных для определения координат центра вращения поля на БТА:
II = sum_fits(1,147);
a = II;
a(find(a < 1)) = 1;
imagesc(log(a))

получаем такую картинку:

Да, чуть не забыл: у Octave есть еще и матлабоподобные интерфейсы, например, QtOctave:

В общем оформление интерфейса довольно приличное, однако, сильно напрягает то, что командная строка вынесена отдельно и в нее нужно тыкнуть мышкой, чтобы начать что-то писать. Так что, CLI у Octave намного лучше и удобнее.