dlinyj: (Default)
[personal profile] dlinyj
Иногда втемяшишь себе что-то в голову, и уже ночью снятся формулы и идеи.

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


Страшная лесенка, при масштабировании в 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. Любой пост всегда украсит красивый график :))

Date: 2013-05-20 11:47 am (UTC)
From: [identity profile] eddy-em.livejournal.com
А интеграл-то сохраняется?
Надо будет почитать про эти сплайны Акимы поподробней. Вдруг они и для астроизображений будут лучше кубических B-сплайнов?

Date: 2013-05-20 11:53 am (UTC)
From: [identity profile] dlinyj.livejournal.com
В смысле интеграл?

Там в посте на хабре ссылка была с описанием.

Date: 2013-05-20 12:07 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
Значение интеграла от функции по dx[dy], т.е. энергию под кривой.

Date: 2013-05-20 12:19 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Не знаю, правда...

Date: 2013-05-20 08:11 pm (UTC)
From: [identity profile] klapaucy.livejournal.com
Сохраняется - по сравнению с чем? ведь, по идее, у нас исходно никакой функции нет. Только набор дискретных точек, для которых мы пытаемся тем или иным способом функцию "придумать".
Если я ничего не путаю...

Date: 2013-05-20 08:25 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
Поясню: изначально мы имеем некую гладкую функцию (скажем, распределение интенсивности радиосигнала в узком диапазоне частот со временем). В силу природы детектора, мы получаем квантованную и зашумленную функцию, однако, если мы хотим что-либо с этой функцией сделать, нам важно сохранить полную энергию изначальной функции (плюс-минус шумы). Вот, например, "натягивание" полинома совершенно не сохраняет энергию. И NURBS'ы энергию не сохраняют.

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

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

Date: 2013-05-20 09:00 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
А что делают в этом случае? Расскажи, желательно простыми словами.

Date: 2013-05-20 09:20 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
То, что ты сделал, и делают ☺
Тебе-то, как я понял, просто надо было красиво сгладить данные?

И вообще, что это? Еще какие-то наборы данных с дозиметра?

Date: 2013-05-20 09:38 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Конкретно это просто шумы микрофонного входа, гистограммы выстроенные в поверхность. Есть некоторые идеи, обкатываю алгоритм. Там пока всё понятно. Если итересно в гталке поведаю.
Демонстрация апроксимации - это вообще от балды взятые цифры, на пробу пера.

Мой вопрос выше - исключительно праздный интерес, как обрабатывают астрономические данные :))))
Edited Date: 2013-05-20 09:40 pm (UTC)

Date: 2013-05-21 04:37 am (UTC)
From: [identity profile] eddy-em.livejournal.com
> как обрабатывают астрономические данные

Многие по-старинке (теряя уйму информации), те же, кому нужно на уровне чуть ли не SNR<1 выдрать полезный сигнал, пользуются всякими разными методиками (от Фурье с вейвлетами и до всяких диких симплекс-сплайнов). Мы вот, например, с коллегой уже пару лет периодически при встречах обсуждали, как было бы хорошо симплекс-сплайны "натягивать" на спектры (да и на фотометрию тоже), чтобы в наилучшей степени избавиться от фона. Но воз и ныне там (времени нет, чтобы по-человечески разобраться в той жуткой математике, а готовых реализаций не существует).

Вот, кстати, насчет готовых реализаций: я столкнулся с тем, что вообще нет в природе библиотек для обработки изображений (особенно — астроизображений). Каждый городит свои велосипеды. Я потихоньку решил хотя бы взять, да собрать все свои велосипеды в одну библиотечку.
Правда, здесь надо быть осторожным, чтобы очередное openCV не получилось...

Date: 2013-05-21 06:16 am (UTC)
From: [identity profile] klapaucy.livejournal.com
Э-э-э. А интересно разобраться. Взять в руки шашки, так сказать...

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

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

Естественно, интеграл под интерполированой кривой будет c погрешностью (вот эти самые "плюс-минус шумы"), при любом способе обработки, вопрос только в допустимом уровне этой погрешности. И, когда меня учили, сплайны были наилучшим вариантом в этом смысле. Может сейчас что-то новое появилось, не знаю.

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

Date: 2013-05-21 06:33 am (UTC)
From: [identity profile] eddy-em.livejournal.com
> интерполируют как раз для того, чтобы снизить шум
Не интерполируют, а аппроксимируют. Интерполяция как раз пытается уменьшить квантование, как можно меньше искажая исходные данные.

Вот, кстати, задача выделения фона в астроизображениях — именно аппроксимация: после триангуляции изображения выделяются узлы, по которым будет строиться аппроксимация; а все точки исходного изображения в междоузлиях используются для уточнения аппроксимирующего полинома. Задача крайне сложная: мы ее до сих пор не решили (и, судя по публикациям, никто еще ее не решил практически — теории то выше крыши).

Date: 2013-05-21 10:35 am (UTC)
From: [identity profile] klapaucy.livejournal.com
> Интерполяция как раз пытается уменьшить квантование, как можно меньше искажая исходные данные.

Я, собственно, именно об этом. Интерполяцией уменьшают шумы квантования.

Date: 2013-05-20 08:06 pm (UTC)
From: [identity profile] klapaucy.livejournal.com
Хорошее сейчас время, можно сплайны считать :))) Я вот помню, когда делал для диплома оценку различных способов интерполяции, то от сплайнов пришлось отказаться - оценка затрат на расчёт коэффициентов сплайнов для выборки в 256 отсчётов пообещала мне несколько месяцев машинного времени ДВК-3 (XT-шки мне тогда были недоступны) :)))
Пришлось ограничиться полиномиальной, кубической.
Алгоритм отлаживал, помню, на Спектруме...

Date: 2013-05-20 08:21 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Круто, круто!!! А на чем программа была? Бейсик?

Главное что можно просто для души считать сплайны :))))

Date: 2013-05-21 05:51 am (UTC)
From: [identity profile] klapaucy.livejournal.com
Бейсик, конечно, на чем же еще можно было на Спеке считать :)))

Date: 2016-03-09 06:13 am (UTC)
From: [identity profile] kebuda.livejournal.com
Игры для спектрума отнюдь не на бейсике писали.

Date: 2016-03-09 06:21 am (UTC)
From: [identity profile] klapaucy.livejournal.com
на Бейсике тоже писали, несложные :))) сам баловался :)))

Date: 2013-05-20 08:28 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
А я по матану на первом курсе курсовик писал по методам оптимизации расчетов сплайнов. Хоть и был уже конец 20-го века, но компьютеры были еще дохленькими.
Блин, уже и забыл все напрочь! Да и мощности нынешних компьютеров таковы, что, к стыду своему, становишься вылитым быдлокодером: реализуешь не наиболее оптимальный, а наиболее простой (с точки зрения реализации) алгоритм... Эдак совсем "думалка" откажет, и закончу свои дни "на ферме"...

Date: 2013-05-20 08:57 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Брось, наоборот, теперь можно сложными алгоритмами пользоватся играючи. Это прекрасно

Date: 2013-07-14 07:24 pm (UTC)
From: [identity profile] alex iva (from livejournal.com)
Доброй ночи, Dlinyj.
Посмотрел http://homepage.hispeed.ch/david.frey/ про сплайн Акимы, но к сожалению настолько глубоко не знаю С чтобы переделать под себя. Помогите пожалуйста, имеется StringGrid с данными. Необходимо их интерполировать сплайном Акимы.

Date: 2013-07-15 12:38 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Не совсем понимаю, вы хотите чтобы я сделал вашу работу? Можно написать программу на любом удобном языке. Методика интерполирования описана тут http://student.ndhu.edu.tw/~u9111023/akima.pdf . В конце концов, можно взять готовую программу, скармливать ваши значения и просить интерполировать.

Ну и потом, отличный повод выучить си!

Date: 2013-07-15 04:16 pm (UTC)
From: [identity profile] alex iva (from livejournal.com)
Нет, не сделать, а если вы уже под себя переделали, то поделиться если не жалко.
Повод выучить си хороший, но к сожалению сроки, сроки...

Date: 2013-07-16 06:55 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Дык, я ничего не переделывал. Просто скачал программу http://homepage.hispeed.ch/david.frey/spline_1.2.tar.gz собрал под линукс (распаковываете, заходите в папке и выполняете Make). После чего можно посмотреть список комманд:

./aspline --help

И программе можно скармливать файл данных формата:

x1 y1
x2 y2
....
xn yn


во float, в качестве разделителя дроби используется точка. Необходимо так же указывать количество точек интерполирования. В это количество точек входит и количество уже введённых данных. Положим у вас 10 точек, а нужно плюс к этим десяти интерполировать между ними ещё 100 точек, то надо задать 110 точек. В общем смотрите хелп на программу. Там всё просто.

Date: 2013-07-16 07:36 am (UTC)
From: [identity profile] alex iva (from livejournal.com)
Добрый день. Спасибо за помощь.
Наверно я вообще отстал от поезда, не могли бы вы подробнее рассказать.
"собрать под линукс" - мне непонятно, уж извините.
Но если не сложно растолкуйте.

Date: 2013-07-16 08:52 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Ставите на виртуальную машину линукс. Я рекомендую Linux Mint, т.к. он наиболее похож на винду

После чего с помощью браузера в линуксе качаете этот архив. Он качается в папку Загрузки (или Downloads в нелокализованной версии). Правой кнопкой жмёте по архиву, и выбираете "Распаковать сюда". Открываете консоль (Терминал, в стандартных приложениях), вбиваете:

cd /home/<ваш пользователь в системе>/Загрузки/aspline/
или просто cd ~/Загрузки/aspline

и оказываетесь в папке с исходниками. Там вбиваете make и жмёте enter. Дальше, чтобы запустить программу с выводом хелпа вводите:

./aspline --help

Читаете, что там написано и пробуете. Дальше разжовывать не буду, ибо лениво ставить эту программу.

Желательно подумать над каждой командой, что я тут привёл и проверить её на ошибки самостоятельно. Я вбивал из головы.

З.Ы. Возможно, если вы найдёте gcc под windows, то всю эту процедуру можно будет повторить и там. Там нет платформозависимого кода.
Edited Date: 2013-07-16 08:55 am (UTC)

Date: 2021-08-06 09:48 am (UTC)
From: [identity profile] eugene perfect (from livejournal.com)
К сожалению, сайт автора http://homepage.hispeed.ch/david.frey/ — издох.

Не сохранилось ли случаем скачанных исходников?

Date: 2021-08-06 09:50 am (UTC)
From: [identity profile] eugene perfect (from livejournal.com)
http://student.ndhu.edu.tw/~u9111023/akima.pdf тоже мертв...

Date: 2021-08-06 10:08 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Куда высылать?

Date: 2021-08-17 03:52 am (UTC)
From: [identity profile] eugene perfect (from livejournal.com)
eugene.yavorsky.1975@gmail.com

January 2026

S M T W T F S
    123
456 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 22nd, 2026 11:23 am
Powered by Dreamwidth Studios