eddy_em: (Костерок)
[personal profile] eddy_em
Итак, я продолжаю допиливать свой велосипед для работы с фитсами. Теперь добавлены еще кое-какие полезные штуки. Глядишь, до нового года хотя бы процентов 10 предполагаемого функционала запилю. А там еще немного — и будет автомат для технических ночей (а то и не только).

Чтобы перечислить возможности, просто сделаю:
./fitsread -h

Использование: fitsread [аргументы] [префикс выходного файла]

	Где аргументы:

  -4, --conn4=arg      label 4-connected components with giventhreshold
  -8, --conn8=arg      label 8-connected components with giventhreshold
  -B, --binarize=arg   binarize image by threshold (in %%from dynamic range)
  -D, --del-rec        удалить все записи с указанной подстрокой
  -a, --add-rec        добавить запись в FITS-шапку
  -b, --bottom=arg     the lowest value, all data less than 'bottom' vould be set to it
  -d, --del-key        удалить указанный ключ
  -h, --help           отобразить эту справку
  -i, --infile=arg     входной файл
  -o, --outfile=arg    выходной файл
  -p, --pipeline       установить параметры конвейера, аргументы: type:[help]:...
		type - тип преобразования (help для справки)
		help - список доступных для данного 'type' опций
  -s, --stat           отобразить статистические параметры входного и выходного изображения
  -t, --top=arg        the lowest value, all data more than 'top' vould be set to it
  -v, --verbose        уровень подробностей вывода (каждый -v увеличивает его)
  --inplace            записать изменения в тот же файл
  --mean               вычислить среднее арифметическое всех перечисленных изображений
  --median             вычислить медиану всех перечисленных изображений
  --rewrite            перезаписать выходной файл, если он существует (только с опцией -i)
  --sum                вычислить сумму всех перечисленных изображений

Итак, добавлены: работа с FITS-шапкой (добавление, изменение и удаление записей); обрезка по заданным уровням (нужно иной раз бывает при конвейерной обработке); пакетная обработка изображений (среднее арифметическое, медиана и сумма всех перечисленных в параметрах изображений); бинаризация изображения по заданному (в доле от динамического диапазона) уровню, если уровень указан как отрицательное число, бинаризованное изображение инвертируется; маркировка 4- и 8-связных областей (на выходе получается файл с нумерованными областями вроде картинок ниже).

Конечно, этого мало. Как минимум нужно еще добавить вычисление параметров пятен по найденным маскам с 4- или 8-связностью, а для этого нужно будет еще автоматом вычислять фон и вычитать из изображения. Кроме того, неплохо было бы еще добавить автоматическое "выпрямление" длиннощелевых спектров для большего удобства дальнейшей обработки (это я на будущее для применения со снимками с IRBIS), ну и работу с "пачками" изображений (когда в одном файле находится несколько изображений).

2015.12.22_17:24:50
Пронумерованные пятна на гартманнограмме

2015.12.22_17:27:06
Нумеруя связанные области инвертированного изображения легко вытащить фон для дальнейшего извлечения

Date: 2015-12-22 09:55 pm (UTC)
From: [identity profile] asm786.livejournal.com
> Как минимум нужно еще добавить вычисление параметров пятен по найденным маскам с 4- или 8-связностью, а для этого нужно будет еще автоматом вычислять фон и вычитать из изображения.

Хз, как там в астрономии, в своих задачах находил связные компоненты заливкой, и относительно компактно их хранил в памяти в виде массива отрезков горизонтальных прямых. Если отрезки упорядочены в лексикографическом порядке, то достаточно на 1 отрезок хранить x координату начала и конца (или длину отрезка) и 1 бит, указывающий на то, стоит ли увеличивать текущее значение у.

Если бинарное изображение - не шахматная доска с пикселами, то такое хранение явно экономичнее по памяти, чем маска меток компонент. Также получается в лаконичной форме писать алгоритмы обхода по маскам, заданные таким образом, ну и не нужно думать о том, хватит ли типа данных (не будет ли целочисельного переполнения) массива меток для подсчёта всех компонент на картинке.

В качестве теста представлений смотрел задачки:
1) jbig2 кодировщик, тоесть нужно найти одинаковые буквы на изображении. Мера схожести букв - определяется как количество пикселей, не совпавших при наложении одной буквы на вторую, ну и процесс повторяется для 9 возможных "подёргиваний" по сторонам.

Заговнокодил со своим представлением, и взял "32-пикселя за такт" версию из лептоники, моя оказалась всего в 3 раза медленнее, хотя кода пришлось написать совсем чуть чуть.

2) генерацию контура связной компоненты - тут раз в 5 по скорости порвал "лептонику"

3) операцию морфологической реконструкции (эт заливка по маркерам, заданных второй бинарной маской) - тут в зависимости от картинок - если много мелких объектов, то лептоника на уровне по скорости, если объектов не много, или они большие и "гладкие" - то "строко-представление" опять обгоняет лептонику.

Такое, может и для астро-задач есть смысел в такое попробовать? Только у меня оно на С++, если что.
Edited Date: 2015-12-22 09:58 pm (UTC)

Date: 2015-12-23 05:41 am (UTC)
From: [identity profile] eddy-em.livejournal.com
Сами по себе связные области не несут никакой полезной информации. Для фона нужно вычислить какой-нибудь сглаживающий полином, чтобы вычесть из изображения; для объектов либо вычислить аппроксимирующую поверхность, либо, аккуратно сглаживая вбросы, вычислить основные параметры по нефильтрованному изображению (только за вычетом фона, в который и BIAS автоматом входит; а на больших экспозициях еще и темновой надо предварительно вычитать).

Со связными областями я еще до конца не закончил. На выходе должен получаться удобоваримый массив масок: координаты левого верхнего угла области интереса, ее размер и сама область в виде "сжатого" бинарного изображения (1 пиксель == 1 бит). Пока вот какой "бенчмарк" получается для велосипеда (i5-3210M CPU @ 2.50GHz x2cores x2hyper):
 * 0.25 megapixels
 * 4: time/object = 1.7 +- 0.1 us  (7.0us per megapixel)
 * 8: time/object = 3.9 +- 0.1 us  (15.6us per megapixel)
 *
 * 1 megapixel
 * 4: time/object = 5.3 +- 0.0 us  (5.3us per megapixel)
 * 8: time/object = 13.3 +- 0.1 us  (13.3us per megapixel)
 *
 * 4 megapixels
 * 4: time/object = 22.3 +- 2.2 us  (5.6us per megapixel)
 * 8: time/object = 57.6 +- 1.3 us  (14.4us per megapixel)
 *
 * 16megapixels
 * 4: time/object = 146.1 +- 1.6 us  (9.1us per megapixel)
 * 8: time/object = 229.7 +- 1.0 us  (14.4us per megapixel)

Забавно, что с точки зрения времени на один объект на мегапиксель изображения оба метода поиска связных областей дают примерно константную скорость.

> из лептоники
Поиск 4- и 8-связных компонент, а также эрозию и дилатацию я завелосипедил сам, т.к. в лептонике крайне медленно это все считается.

> генерацию контура связной компоненты - тут раз в 5 по скорости порвал "лептонику"
Я тоже себе для этого пилил свою реализацию "шагающих квадратов".

> Такое, может и для астро-задач есть смысел в такое попробовать?
Если исходники под GPL, в любом случае не помешает посмотреть, даже несмотря на
> Только у меня оно на С++
Правда, если С++ полноценный, т.е. с кучей объектов, виртуальных функций, наследований и т.д., и т.п., то преобразовать это в сишный код будет сложно, проще с нуля написать, поняв идею алгоритма.
// на С++ переходить не собираюсь, т.к. считаю его жутким оверхедом в моих задачах.

October 2025

S M T W T F S
   1234
567 89 1011
121314 15161718
19202122232425
2627 28293031 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 24th, 2026 07:57 pm
Powered by Dreamwidth Studios