Jump to content
Compvision.ru
Sign in to follow this  
mrgloom

image registration

Recommended Posts

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

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

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

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

final_dist.bmp

  • Like 1

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

1-s2.0-S0360301601016674-gr7.jpg

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

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

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

1-s2.0-S1077314203000092-gr5.gif

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites


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 отдельно, но он почему то вылетает.

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

нашел несколько плагинов для 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.(и сюда например искажение бочка никак не вписывается)

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×