Перейти к содержимому
Compvision.ru
mrgloom

image registration

Recommended Posts

есть в computer vision такая задача как image registration

по сути совмещение картинок ,которые немного отличаются.

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

т.е. рисунок как я понимаю отражает картину как сместились точки одного изображения относительно другого.

final_dist.bmp

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

тут еще стоит уточнить, что искажение объекта нельзя описать матрицей гомографии, т.к. оно не симметрично и не однородно.

я впринципе нашел некоторые материалы по

non-rigid\nonlinear image registration

хмм оказывается можно еще через optical flow

Dense Image Registration

Elastic registration

Another examples of non-rigid methods are diffusion based

registration, level sets registration, and optical flow

based registration.

пример "поля преобразований" в атаче.

post-701-0-85230200-1335352199_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

тут кстати еще всплывает вопрос про optical flow, в алгоритме же выделяются особые точки, а потом прослеживаются?

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

вроде есть dence optical flow, но не уверен что это то.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

нашел программу Drop - Deformable Registration using Discrete Optimization

1-s2.0-S0360301601016674-gr7.jpg

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

тут еще возникает вопрос, допустим я имею это поле- сетку с каким то дискретным шагом и хочу как то аналитически(в виде формулы) попытаться описать это преобразование, как мне это сделать?

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

1-s2.0-S1077314203000092-gr5.gif

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

попробовал поэкспериментировать с плотным оптическим потоком из опенцв.

взял оригинал и взял исказил бочкой.

вроде бы даже не так уж и плохо .показывает нечто похожее на правду.

post-701-0-10586700-1336132605_thumb.png

post-701-0-73416700-1336132620_thumb.png

post-701-0-87215600-1336132660_thumb.png

попробовал так же, сделать на реальной большой картинке, и получается ,что если место без каких либо особых примечательностей, то там картина не восстановима, а так работает, осталось понять какая точность и как карту из optical flow засунуть в remap для проверки.

post-701-0-37355300-1336141461_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Ну и заполняем массив ремапа значением координаты точки плюс вектор смещения.

Можно еще векторы смещений сгладить гауссианом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

я вообще для какой задачи хотел применить оптический поток - для самокалибровки камеры.

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

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

только тут проблема получается в том как сопоставлять саму эту метку)

т.к. она тоже получается не всегда прямоугольная, а тоже искажается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах


Mat copnvert2flow(const Mat& velx, const Mat& vely)

{

    Mat flow(velx.size(), CV_32FC2);

    for(int y = 0 ; y < flow.rows; ++y)

        for(int x = 0 ; x < flow.cols; ++x)                        

            flow.at<Point2f>(y, x) = Point2f(velx.at<float>(y, x), vely.at<float>(y, x));            

    return flow;

}

//похоже старая функция просто

void calcOpticalFlowHS( const Mat& prev, const Mat& curr, int usePrevious, double lambda, TermCriteria criteria, Mat& flow)

{        

    Mat velx(prev.size(), CV_32F), vely(prev.size(), CV_32F);

    CvMat cvvelx = velx;    CvMat cvvely = vely;

    CvMat cvprev = prev;    CvMat cvcurr = curr;

    cvCalcOpticalFlowHS( &cvprev, &cvcurr, usePrevious, &cvvelx, &cvvely, lambda, criteria );

    flow = copnvert2flow(velx, vely);

}

Mat frame1= cvLoadImage("сетка_бочка.png",0);

	Mat frame0= cvLoadImage("сетка.png",0);

	Mat velx, vely;

	Mat flow;

	/* Termination criteria */

	CvTermCriteria IterCriteria;

	IterCriteria.type = CV_TERMCRIT_ITER;

	IterCriteria.max_iter = 100;

	calcOpticalFlowHS(frame0,frame1,0,0.1,IterCriteria,flow);   

	//calcOpticalFlowHS(frame0,frame1,0,5,TermCriteria(TermCriteria::MAX_ITER, 400, 0),flow);   

	imwrite("out_dense_flow.png",flow);

попробовал другой метод, он более удобен т.к. выдает по поток x,y отдельно, но он почему то вылетает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а падает на imwrite так что не алгоритме дело.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

http://www.gris.tu-darmstadt.de/teaching/courses/ws1011/cv2/slides/l8-denseflow-v1_0.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

продолжил копать тему.

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

http://fiji.sc/wiki/index.php/Feature_Extraction

http://fiji.sc/wiki/index.php/TrakEM2

http://fiji.sc/wiki/index.php/BUnwarpJ

http://fiji.sc/wiki/index.php/Register_Virtual_Stack_Slices

пока только не понял как преобразование из Feature_Extraction применить.

кстати что странно сшитие двух кадров там работает с помощью фурье(http://fiji.sc/wiki/index.php/Stitching_2D/3D), хотелось бы чтобы алгоритмы друг друга дополняли, потому что и у того и того существуют случаи когда они фейлятся.

остается не ясным вопрос если делать image registration с фотографиями чуть смещенного объекта и немного по разному искаженными будет ли алгоритм это смещение учитывать или нет, если утрировать, то для примера 2 картинки где на 1 лева пустота справа часть картинки, а на 2 наоборот часть картинки, а справа пустота, так вот алгоритм соединит только нужные части с данными или же попытается наложить картинку на картинку, а потом дополнительно исказить?

и еще вопрос скажем ,когда мы смотрим преобразование по точкам SIFT, то у нас получается в общем случае матрица 3х3.(и сюда например искажение бочка никак не вписывается)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

http://bigwww.epfl.ch/thevenaz/unwarpj/

unwarpj несмотря на красивые картинки в статье для тестовой картинки выдал неправильные результаты.

post-701-0-77770100-1342431394_thumb.png

post-701-0-36896700-1342431403_thumb.png

post-701-0-79992400-1342431437_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

http://my.fit.edu/~lwei/isvc2010_slides_liu_ribeiro_shape.pdf

обзор методов (для шейпов) non-rigid shape matching

обзор для медицинских изображений

http://www.siam.org/meetings/op08/Modersitzki.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

а потом мы хотим всё это вписать в какое либо преобразование - например аффинное\перспективное и т.д.

как это сделать?

опять же возвращаемся к решению переопределенной системы? нужна ли до какая либо фильтрация?

еще кое что есть в ITK

http://www.itk.org/Wiki/ITK/Examples/Registration/ImageRegistrationMethodBSpline

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

а потом мы хотим всё это вписать в какое либо преобразование - например аффинное\перспективное и т.д.

как это сделать?

Самый распространённый способ - RANSAC и его вариации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

http://www.codeproject.com/Articles/24809/Image-Alignment-Algorithms

http://www.rsdn.ru/article/multimedia/InverseCompositionalAlgorithm.xml

по сути это что то рядом с оптическим потоком, как я понял ограничение в том, что

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

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

а в коде вообще указано Lucas-Kanade(forwards additive) и Baker-Dellaert-Matthews(inverse compositional)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

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

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×