Интерполяция сплайнами Акимы.
May. 20th, 2013 02:33 pmИногда втемяшишь себе что-то в голову, и уже ночью снятся формулы и идеи.
Озадачился тут масштабированием поверхности по одной оси. Точнее, масштабное увеличение одной оси, для сохранения пропорций объекта. Пока решил топорно, в результате выглядит ужасной лесенкой.

Страшная лесенка, при масштабировании в 200 раз
В результате мой взгляд упал в интерполяцию. Сейчас с удовольствием (лучше всякой худ. лит-ры) читаю книжку о вычислительной математике, которую я собирался прочитать на новогодние праздники. О кубической интерполяции все мы знаем. Начал гуглить готовые алгоритмы, и наткнулся на отличный пост http://habrahabr.ru/post/130873/ с разбором полётов разных алгоритмов. А от туда на сайтец с программой Akima spline interpolation program.
Берём исходные точки
1
1.5
1.7
2
2.1
2.2
7
7.1
3.2
2
2
2
7
2
2
Без интерполяции, только с линейной интерполяцией (гнуплот сам строит такой) получается следующий график.

График, построенный линейной интерполяцийей
Скармливает точки программе (без переделок), и на выходе получаем

Те же данные, но интерполированные сплайнами Акимы
Алгоритму быть. Теперь осталось выкорчевать процедуры из исходной программы и вставить в свою.
P.S. Любой пост всегда украсит красивый график :))
Озадачился тут масштабированием поверхности по одной оси. Точнее, масштабное увеличение одной оси, для сохранения пропорций объекта. Пока решил топорно, в результате выглядит ужасной лесенкой.

Страшная лесенка, при масштабировании в 200 раз
В результате мой взгляд упал в интерполяцию. Сейчас с удовольствием (лучше всякой худ. лит-ры) читаю книжку о вычислительной математике, которую я собирался прочитать на новогодние праздники. О кубической интерполяции все мы знаем. Начал гуглить готовые алгоритмы, и наткнулся на отличный пост http://habrahabr.ru/post/130873/ с разбором полётов разных алгоритмов. А от туда на сайтец с программой Akima spline interpolation program.
Берём исходные точки
1
1.5
1.7
2
2.1
2.2
7
7.1
3.2
2
2
2
7
2
2
Без интерполяции, только с линейной интерполяцией (гнуплот сам строит такой) получается следующий график.

График, построенный линейной интерполяцийей
Скармливает точки программе (без переделок), и на выходе получаем

Те же данные, но интерполированные сплайнами Акимы
Алгоритму быть. Теперь осталось выкорчевать процедуры из исходной программы и вставить в свою.
P.S. Любой пост всегда украсит красивый график :))
no subject
Date: 2013-05-20 11:47 am (UTC)Надо будет почитать про эти сплайны Акимы поподробней. Вдруг они и для астроизображений будут лучше кубических B-сплайнов?
no subject
Date: 2013-05-20 11:53 am (UTC)Там в посте на хабре ссылка была с описанием.
no subject
Date: 2013-05-20 12:07 pm (UTC)no subject
Date: 2013-05-20 12:19 pm (UTC)no subject
Date: 2013-05-20 08:06 pm (UTC)Пришлось ограничиться полиномиальной, кубической.
Алгоритм отлаживал, помню, на Спектруме...
no subject
Date: 2013-05-20 08:11 pm (UTC)Если я ничего не путаю...
no subject
Date: 2013-05-20 08:21 pm (UTC)Главное что можно просто для души считать сплайны :))))
no subject
Date: 2013-05-20 08:25 pm (UTC)Если мы оставим неизменной энергию, то на основе нескольких снимков (либо же в случае периодичности сигнала, на основе одного снимка) мы можем "улучшить" этот сигнал (вплоть до всяких методов "сверхразрешения").
Хотя, конечно, выбор метода зависит прежде всего от того, что мы хотим с исходными данными сделать.
no subject
Date: 2013-05-20 08:28 pm (UTC)Блин, уже и забыл все напрочь! Да и мощности нынешних компьютеров таковы, что, к стыду своему, становишься вылитым быдлокодером: реализуешь не наиболее оптимальный, а наиболее простой (с точки зрения реализации) алгоритм... Эдак совсем "думалка" откажет, и закончу свои дни "на ферме"...
no subject
Date: 2013-05-20 08:57 pm (UTC)no subject
Date: 2013-05-20 09:00 pm (UTC)no subject
Date: 2013-05-20 09:20 pm (UTC)Тебе-то, как я понял, просто надо было красиво сгладить данные?
И вообще, что это? Еще какие-то наборы данных с дозиметра?
no subject
Date: 2013-05-20 09:38 pm (UTC)Демонстрация апроксимации - это вообще от балды взятые цифры, на пробу пера.
Мой вопрос выше - исключительно праздный интерес, как обрабатывают астрономические данные :))))
no subject
Date: 2013-05-21 04:37 am (UTC)Многие по-старинке (теряя уйму информации), те же, кому нужно на уровне чуть ли не SNR<1 выдрать полезный сигнал, пользуются всякими разными методиками (от Фурье с вейвлетами и до всяких диких симплекс-сплайнов). Мы вот, например, с коллегой уже пару лет периодически при встречах обсуждали, как было бы хорошо симплекс-сплайны "натягивать" на спектры (да и на фотометрию тоже), чтобы в наилучшей степени избавиться от фона. Но воз и ныне там (времени нет, чтобы по-человечески разобраться в той жуткой математике, а готовых реализаций не существует).
Вот, кстати, насчет готовых реализаций: я столкнулся с тем, что вообще нет в природе библиотек для обработки изображений (особенно — астроизображений). Каждый городит свои велосипеды. Я потихоньку решил хотя бы взять, да собрать все свои велосипеды в одну библиотечку.
Правда, здесь надо быть осторожным, чтобы очередное openCV не получилось...
no subject
Date: 2013-05-21 05:51 am (UTC)no subject
Date: 2013-05-21 06:16 am (UTC)Собственно, у нас в исходных данных уже никакой гладкой функции нет. Я имею в виду измеренные данные.
Изначально, дискретизация искажает нашу функцию больше, чем любая дальнейшая интерполяция. Собственно, интерполируют как раз для того, чтобы снизить шум, т.е. (не вполне точно, но близко по смыслу) отклонения от измеряемой функции. С этой позиции любая интерполяция будет лучше чем без неё.
Хотя нет, не любая, как минимум полиномы низших степеней могут выдавать шум даже больший, чем у просто квантованного сигнала. О, блин, как давно это было...
Естественно, интеграл под интерполированой кривой будет c погрешностью (вот эти самые "плюс-минус шумы"), при любом способе обработки, вопрос только в допустимом уровне этой погрешности. И, когда меня учили, сплайны были наилучшим вариантом в этом смысле. Может сейчас что-то новое появилось, не знаю.
Я рассуждаю с точки зрения радиотехника :))) В том смысле, что в других применениях это может быть и по-другому...
no subject
Date: 2013-05-21 06:33 am (UTC)Не интерполируют, а аппроксимируют. Интерполяция как раз пытается уменьшить квантование, как можно меньше искажая исходные данные.
Вот, кстати, задача выделения фона в астроизображениях — именно аппроксимация: после триангуляции изображения выделяются узлы, по которым будет строиться аппроксимация; а все точки исходного изображения в междоузлиях используются для уточнения аппроксимирующего полинома. Задача крайне сложная: мы ее до сих пор не решили (и, судя по публикациям, никто еще ее не решил практически — теории то выше крыши).
no subject
Date: 2013-05-21 10:35 am (UTC)Я, собственно, именно об этом. Интерполяцией уменьшают шумы квантования.
no subject
Date: 2013-07-14 07:24 pm (UTC)Посмотрел http://homepage.hispeed.ch/david.frey/ про сплайн Акимы, но к сожалению настолько глубоко не знаю С чтобы переделать под себя. Помогите пожалуйста, имеется StringGrid с данными. Необходимо их интерполировать сплайном Акимы.
no subject
Date: 2013-07-15 12:38 pm (UTC)Ну и потом, отличный повод выучить си!
no subject
Date: 2013-07-15 04:16 pm (UTC)Повод выучить си хороший, но к сожалению сроки, сроки...
no subject
Date: 2013-07-16 06:55 am (UTC)./aspline --help
И программе можно скармливать файл данных формата:
x1 y1
x2 y2
....
xn yn
во float, в качестве разделителя дроби используется точка. Необходимо так же указывать количество точек интерполирования. В это количество точек входит и количество уже введённых данных. Положим у вас 10 точек, а нужно плюс к этим десяти интерполировать между ними ещё 100 точек, то надо задать 110 точек. В общем смотрите хелп на программу. Там всё просто.
no subject
Date: 2013-07-16 07:36 am (UTC)Наверно я вообще отстал от поезда, не могли бы вы подробнее рассказать.
"собрать под линукс" - мне непонятно, уж извините.
Но если не сложно растолкуйте.
no subject
Date: 2013-07-16 08:52 am (UTC)После чего с помощью браузера в линуксе качаете этот архив. Он качается в папку Загрузки (или Downloads в нелокализованной версии). Правой кнопкой жмёте по архиву, и выбираете "Распаковать сюда". Открываете консоль (Терминал, в стандартных приложениях), вбиваете:
cd /home/<ваш пользователь в системе>/Загрузки/aspline/
или просто cd ~/Загрузки/aspline
и оказываетесь в папке с исходниками. Там вбиваете make и жмёте enter. Дальше, чтобы запустить программу с выводом хелпа вводите:
./aspline --help
Читаете, что там написано и пробуете. Дальше разжовывать не буду, ибо лениво ставить эту программу.
Желательно подумать над каждой командой, что я тут привёл и проверить её на ошибки самостоятельно. Я вбивал из головы.
З.Ы. Возможно, если вы найдёте gcc под windows, то всю эту процедуру можно будет повторить и там. Там нет платформозависимого кода.
no subject
Date: 2016-03-09 06:13 am (UTC)no subject
Date: 2016-03-09 06:21 am (UTC)no subject
Date: 2021-08-06 09:48 am (UTC)Не сохранилось ли случаем скачанных исходников?
no subject
Date: 2021-08-06 09:50 am (UTC)no subject
Date: 2021-08-06 10:08 am (UTC)no subject
Date: 2021-08-17 03:52 am (UTC)