Pull to refresh

Comments 16

Поделитесь, пожалуйста, результатом работы алгоритма. И, если не секрет, для чего вы искали эти изофоты?
Вот — как выглядит в 2D: 2D а вот так — в 3D: 3D

Этот алгоритм нужен был мне для улучшения метода определения центра тяжести «точечных» объектов, а также для кое-каких других операций (например, вычисления энергии в кружке) — в рамках постепенно разрабатываемой мной программки для простого просмотра/редактирования FITS-файлов и (главное, для чего я ей занялся) восстановления поверхности зеркала по гартманограммам.
Простите, не нашел определения «гартманограммы». Это способ контроля качества оптики?
Да, контроль качества оптики методом Гартманна (с использованием специальной диафрагмы-маски). Кроме того, если известно состояние оптики и есть быстрая камера, можно анализировать текущее состояние атмосферы и при помощи блока адаптивной оптики (например, активного вторичного зеркала) частично компенсировать атмосферные искажения. Но это еще в будущем для БТА.
А можно вопрос?
А чем изофоты отличаются вот от этого?
image
У вас — обычные границы, найденные дифференциальным фильтром (изображение), а мне необходимо получить структуру с координатами каждой изолинии.
А методов выделения границ, конечно, полным-полно. Если изофоты просто надо нарисовать, не вычисляя узлы, то достаточно квантовать изображение на нужное количество уровней, а затем вычислить модуль градиента, который и отобразит нам все изолинии.
а такой вариант?
image
изображение бинарное 0,1

и найти замкнутые области

почему спрашиваю.
Эта штука невероятно быстрая.
3000x3000 бдет штробить в риал тайме.
Вы можете пройтись по ссылочке на мой ЖЖ, где описывается первый, неудачный подход.
Считалось очень быстро (т.к. маска была всего одна), но только для изображений, не содержащих проблемных участков (несколько изолиний через 1 пиксель; сложный профиль изолиний и т.п.).
Можно бинаризовать изображение по каждому искомому уровню и найти затем контуры, но все равно ведь придется пробегаться по каждому контуру и вычислять более-менее точные координаты.
Так что, основная проблема со временем здесь не в поиске контуров изолиний, а в вычислении их узлов.
Можно уточнение?
«придется пробегаться по каждому контуру и вычислять более-менее точные координаты.»

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

А что есть «узлы» в вашем понимании?
получив такое изображение как приведено выше, можно говорить о точных координатах белых точек/линий.
как мы можем видеть, ширина этих линий точно в 1 пиксель.

При том, что координата изолинии может проходить, скажем, через точку (1.001, 100.097). А округление до пикселя слишком угрубит вычисления. Так можно делать только в очень редких случаях.
Ну, а если вам, например, надо с точностью до одной тысячной пикселя посчитать центр тяжести изображения, придется и контуры вычислять более-менее надежно.

А что есть «узлы» в вашем понимании?

Это просто некоторые точки с высокой надежностью близкие к реально проходящей изолинии.
понятно
я упустил тот факт что у вас «изображение» это уже «производная» от некоторых данных.

;)
Можете прислать мне несколько изображений, я получу для них изолинии, а вы сравните со своими вариантами.

Но метод о котором я говорю один из самых точных, что я видел.
img-service.com/overview/cellular_neural_boolean_filtering.html
habrahabr.ru/blogs/image_processing/128803/

Там же ссылки на научную основу.
я упустил тот факт что у вас «изображение» это уже «производная» от некоторых данных

Нет, это не производная: обычное изображение.
Можете прислать мне несколько изображений, я получу для них изолинии, а вы сравните со своими вариантами

Сегодня не могу: с работы уже ушел, а дома интернет очень медленный. Изображения же — порядка 18МБ в несжатом виде, в сжатом — магабайт по 10 на изображение будет.
Но метод о котором я говорю один из самых точных, что я видел

Не забывайте, что у меня — не поиск границ и/или резких перепадов интенсивности, а поиск линий одинакового уровня. Это несколько иная задача.
Да, добавлю еще, что зачастую после отыскания узлов каждой изофоты применяют еще и сглаживание — B-сплайнами, например.
С того момента, как вы упомянули зеркала, я был уверен, что вы связаны с астрофизикой и ваш жж это только подтверждает. Я учусь на физика-теоретика и лично мне было бы очень интересно знать, какие задачи может найти себе программист в космосе.
Задач достаточно много: и в области теоретической физики, и в прикладной области. Обработка изображений до сих пор активно развивается, нужны новые методы, позволяющие упростить рутинную работу и повысить точность получаемых данных.
Всякое машинное зрение, теории управления и т.д., и т.п. тоже нужны.

В общем, много чего надо сделать, и как всегда времени на все не хватает, вот так и пользуемся полусобранными приборами, полуфункционирующим софтом и т.п.
Попробовал вчера распараллелить (вычислять в четырех отдельных потоках изолинии для каждого уровня) — выигрыш довольно небольшой. Если без распараллеливания изолинии тестового изображения 3Кх3К по 16 подуровням строились за 1.2с, то с распараллеливанием — за 0.75с.
Похоже, все-таки довольно много времени отбирает построение маски (которое и так распараллелено).
Буду думать на досуге, как видоизменить алгоритм, чтобы маски строились быстрее (например, маску уровня i+1 можно строить на основе маски уровня i, проверяя лишь ненулевые пиксели предыдущей маски — тогда вычислений и разыменования указателей будет меньше).
Sign up to leave a comment.

Articles