LINUX.ORG.RU

[C][И снова Я] Image Processing Library

 


0

2

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

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

Ну подскажите мне пожалуйста, если здесь есть кто-нибудь, занимающийся обработкой изображений: вдруг существует нормальная свободная библиотека, реализующая нужный мне элементарный функционал? Желательно на CUDA, но можно и просто с кодами - все меньше времени придется тратить на переписывание...

P.S. Просто я действительно не очень-то силен в программировании, а когда еще и алгоритм надо чуть ли не с нуля разрабатывать - так это вообще труба. После обеда часов 6 сидел, элементарный алгоритм быстрого поиска связанных областей на изображении клепал. А ведь его еще и распараллелить на сотню-другую потоков надо...

☆☆☆☆☆

Image Processing Library примерно всё что можно сделать в GIMP'е или OpenCV. Твои задачи слишком специализированные и совсем не 'Image Processing'

mashina ★★★★★
()
Ответ на: комментарий от mashina

Куда уж там, специализированные. Триангуляция и тесселяция вовсю используются всякими библиотеками отображения ландшафтов, только выковырять их оттуда сложновато - не тащить же из-за пары алгоритмов библиотеку в несколько десятков мегабайт! Еще ладно, были бы эти алгоритмы новыми - так многим из них уже более 20 лет!

Анализом гартманограмм уже занимаются лет 60 (а то и больше). Правда, изначально все делалось вручную, но я исхожу из принципа «лучше день потерять, зато потом за час долететь». Да и по-моему, накопленные за вчерашнюю ночь ~7Гб снимков вручную придется обрабатывать с полгода...

Просто бесит то, что все эти алгоритмы давно уже реализованы, но под GPL или какой-нибудь другой свободной лицензией никто не спешит их выкладывать... :(

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от mashina

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

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от OldFatMan

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

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

А вообще, в матлабе полным-полно разных интересных полезных вещей. Но кто ж коды откроет...

Eddy_Em ☆☆☆☆☆
() автор топика

там по предыдущим темам...

а обязательно сплайны?

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

скорее всего придется сгладить (обычным блуром или медианным фильтром) дифференцированное изображение

это будет эквивалент сплайна как я понимаю.

psv1967 ★★★★★
()
Ответ на: комментарий от psv1967

Ага. Только у нас не для глаза, а для шестиметрового зеркала :) Хоть отверстий всего лишь 256 (+2 маркера), надо для начала хотя бы в автоматическом режиме научиться нумеровать все отверстия, определять их координаты и находить положение маркеров для определения ориентации гартманограммы. Восстановление волнового фронта по отклонениям обнаруженных координат пятен и их интенсивностей от идеальных значений - дело более простое...

Алгоритмическая сторона более-менее ясна, неясно лишь, как бы все это упростить: для отождествления пятен нужно использовать один из методов blob detection; для поиска маркеров - определить координаты двух пятен, находящихся на наибольшем удалении от одной из 16-ти прямых, по которым расположены остальные пятна (здесь все решается при помощи простых преобразований Хафа); пронумеровать пятна тоже можно при помощи преобразований Хафа - пробегаясь поочередно по всем лучам, начиная от заданного маркера, и нумеруя обнаруженные на первом этапе области. Задать прямоугольники для вычисления центра тяжести и интегральной интенсивности в каждом пятне тоже можно исходя из анализа пронумерованных областей (или же делать это сразу - на первом этапе)...

Т.е. все вроде бы ясно, но как это сделать, чтобы производительность вычислений была повыше - не очень понятно.

Вот и сижу, разбираюсь...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от psv1967

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

Нельзя. Шум при дифференцировании только усилится. Гладкости здесь не выйдет никакой. Например, для выделения связанных областей здесь нельзя использовать фильтр Лапласа - только лапласиан гауссианы.

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

Для восстановления спектров слабых объектов нужно использовать именно аппроксимацию сплайнами, чтобы вычесть из спектра фон неба, а затем, еще раз аппроксимируя - уже спектр, за счет искривления спектральных линий попытаться улучшить разрешение...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

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

а что это будет? адаптивная оптика?

psv1967 ★★★★★
()
Ответ на: комментарий от Eddy_Em

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

psv1967 ★★★★★
()
Ответ на: комментарий от psv1967

а что это будет? адаптивная оптика?

Нет, анализ искривления поверхности зеркала в процессе эксплуатации + поверка после переалюминирования.

Интерполировать ничего не надо как я понимаю?

Надо будет: спектр объекта «вырезается» для получения спектра неба, т.е. получается «дырка».

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

И выпирает, поэтому и нужны не «простые» B-сплайны, а адаптивные симплекс сплайны (т.е. необходимо сделать оптимальную триангуляцию и вычислить сплайны, аппроксимируя методом наименьших квадратов - или даже лучше методом минимума модуля отклонения, причем в «дырке» сплайны соседних симплексов должны быть сшиты - т.е. там вместо аппроксимации должна быть просто интерполяция краев «дырки»).

придется регуляризировать решение

Ага, и математика там - мама не горюй (выходит за области матана и алгебры, в которых я ориентируюсь).

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Да, сглаживание при обработке таких изображений не годится еще и потому, что всякие космические частицы и прочий мусор типа «соль» будет заметно искажать интенсивность в соседних пикселях. Медиана же понижает разрешение...

Eddy_Em ☆☆☆☆☆
() автор топика

leptonica.com выросла из document image processing, тк товарищ бломберг причастен к Xerox, djvu и многой крутизне, некоторые ваши задачи там очень круто решены, ну и С.

CImg выросла как результат работы французов в области inpainting, active contours и других всяких активных змей.

А вообще на linuxgraphics.ru был пару лет назад обзор либ.

nikitos ★★★
()
Ответ на: комментарий от nikitos

Спасибо, лептонику посмотрю.

CImg не годится - он только для «плюсов».

На linuxgraphics.ru что-то ничего интересного в обзорах не нашел.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

> CImg не годится - он только для «плюсов».

Это не аргумент: можно написать простые обёртки под свои нужды для использования CImg из Си, тут ничего сложного нет.

Sorcerer ★★★★★
()
Ответ на: комментарий от nikitos

Спасибо за ссылку на «лептонику»: там очень много полезных функций. Теперь надо еще разобраться, что там к чему - документация практически отсутствует...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

очень красиво медианный фильтр работает по тройке изображений

реальный1

реальный2

0 (полученный реальныйХ-реальныйХ)

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

psv1967 ★★★★★
()
Ответ на: комментарий от psv1967

Это тривиальные процедуры. Годятся лишь для усреднения bias'ов, темновых и плоских полей. Научные данные так усреднять нельзя - теряем информацию.

С гартманограммами вообще нельзя ничего усреднять, иначе потеряем сведения о влиянии на изображение воздушных потоков от зеркала (при разнице температур воздуха и зеркала градусов в 6-10 эти потоки заметно искажают гартманограмму).

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

>Не совсем то, что нужно, но скачаю - может, какой нужный функционал оттуда выдерну...

Практически все вышеописанные преобразования и фильтры там реализованы.

http://gwyddion.net/documentation/ http://gwyddion.net/module-list.php

Ну и написано там на хорошем C+glib.

dn2010 ★★★★★
()
Ответ на: комментарий от psv1967

Усреднять можно только если разница температур зеркала и окружающего воздуха не выше пары градусов. Иначе - размажем влияние на изображение турбулентных потоков воздуха.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от dn2010

Почитаю на досуге, спасибо.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Если медиана по серии из 7 — 15 (сколько там надо что бы турбулентности были-небыли на каждом элементе) изображений то тоже нет?

Или поток турбулентный как линза влияет? Тогда надо детект движения на картинке делать и вырезать все меняющиеся области. Накапливать неподвижные области пока не перекроется вся область измерения.

Как алгоритм?

psv1967 ★★★★★
()
Ответ на: комментарий от psv1967

Или поток турбулентный как линза влияет?

Конечно. Почитайте.

Как алгоритм?

Отложил до понедельника. В выходные отдохнуть хочу. Сегодня, пока катался на велосипеде, продумал несколько вариантов. Отождествлять связанные области (попутно определяя координаты содержащих их прямоугольников) буду при помощи библиотеки с «лептоники» - в конце рабочего дня проверил, с моими изображениями она работает отлично. Далее, либо «тупым» методом нахождения центра тяжести, либо вписыванием гауссианы определю точные координаты центров каждого пятна и суммарные интенсивности. Далее - определю приблизительные координаты центра гартманограммы. Перебирая все найденные центры пятен, получу для них R - расстояния от приблизительного центра - и \phi - угловую координату. Сортируя с некоторыми пороговыми значениями (которые легко рассчитать исходя из разброса R и \phi), определю принадлежность каждого пятна к определенному кольцу и определенной прямой. Для каждого кольца, содержащего больше, скажем, 25 пятен, найду более точно (например, методом наименьших квадратов) центр и радиус. Уточню реальное положение центра гартманограммы и скорректирую координаты идеальных радиусов и прямых. Затем уточню положения точек, вошедших в «обособленные» кольца или прямые (с малым количеством пятен) - часть из них будет приписана ближайшим кольцу/прямой, две должны будут быть выявлены как опорные. Исходя из положения реперов, определю общую ориентацию картины, соответственно ей перенумерую пятна, а затем для каждого пятна определю отклонение от идеального положения. После этого останется лишь построить профиль волнового фронта.

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

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от psv1967

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

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Обзор: http://www.linuxgraphics.ru/articles.php?article_id=16

По поводу документации к leptonica - почитайте сайт, он иерархично описывает что там реализовано (возможно не тупо функция - аргументы - что делает, а в применении к конкретным задачам, я думаю такая документация качественнее на этапе проектирования), вот секция о Image Processing: http://leptonica.com/local-sources.html

nikitos ★★★
()

Ну и в добавление к списку библиотек, изучив лептонику, возможно имеет смысл разобраться с OpenCV (есть подозрение что работать будет быстрее) если вдруг кроме растра возникнут задачи вычислительной геометрии (например найти минимальную содержащую окружность для блоба итп итд) - советую посмотреть в сторону http://www.cgal.org/, правда там ++.

nikitos ★★★
()
Ответ на: комментарий от nikitos

Спасибо. Буду изучать. Правда, читать не перечитать...

Eddy_Em ☆☆☆☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.