mrgloom 242 Report post Posted April 25, 2012 есть в computer vision такая задача как image registration по сути совмещение картинок ,которые немного отличаются. а вот интересно узнать, есть ли алгоритм который (подобно алгоритму который делает морфинг, только в обратную сторону как бы) выдает некоторое поле преобразований, примерно как на картинке. т.е. рисунок как я понимаю отражает картину как сместились точки одного изображения относительно другого.final_dist.bmp 1 Share this post Link to post Share on other sites
mrgloom 242 Report post Posted April 25, 2012 тут еще стоит уточнить, что искажение объекта нельзя описать матрицей гомографии, т.к. оно не симметрично и не однородно. я впринципе нашел некоторые материалы по 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. пример "поля преобразований" в атаче. Share this post Link to post Share on other sites
mrgloom 242 Report post Posted May 2, 2012 тут кстати еще всплывает вопрос про optical flow, в алгоритме же выделяются особые точки, а потом прослеживаются? а есть такие алгоритмы чтобы каждому пикселю(или не знаю даже как там решается вопрос с дискретностью) ставится в соответсвие другой пиксель на следующем кадре. вроде есть dence optical flow, но не уверен что это то. Share this post Link to post Share on other sites
mrgloom 242 Report post Posted May 4, 2012 нашел программу Drop - Deformable Registration using Discrete Optimization которая делает похожее на то что мне нужно, там сетка гнется, используется это правда для MRI, в программе много параметров и не очень понятно как она вообще работает, и изображения нормальных форматов она не ест. тут еще возникает вопрос, допустим я имею это поле- сетку с каким то дискретным шагом и хочу как то аналитически(в виде формулы) попытаться описать это преобразование, как мне это сделать? есть еще алгоритмы которые позволяют накладывать точки, соответственно это можно использовать для контуров, возможно это применимо и в этой задаче. Share this post Link to post Share on other sites
mrgloom 242 Report post Posted May 4, 2012 попробовал поэкспериментировать с плотным оптическим потоком из опенцв. взял оригинал и взял исказил бочкой. вроде бы даже не так уж и плохо .показывает нечто похожее на правду. попробовал так же, сделать на реальной большой картинке, и получается ,что если место без каких либо особых примечательностей, то там картина не восстановима, а так работает, осталось понять какая точность и как карту из optical flow засунуть в remap для проверки. Share this post Link to post Share on other sites
Smorodov 578 Report post Posted May 4, 2012 Если опт. поток плотный, то мы знаем, куда съехала каждая точка (для такого разреженного случая как у вас, можно линейную (квадратичную,...) интерполяцию применить ). Ну и заполняем массив ремапа значением координаты точки плюс вектор смещения. Можно еще векторы смещений сгладить гауссианом. Share this post Link to post Share on other sites
mrgloom 242 Report post Posted May 5, 2012 насчет запихнуть в ремап, попозже посмотрю, интересно посмотреть на ошибку которую выдаёт алгоритм, но и так видно, что если область без особенностей, то ничего не выйдет. я вообще для какой задачи хотел применить оптический поток - для самокалибровки камеры. т.е. допустим есть камера у нее есть искажения(возможно довольно сложные), я на эту камеру снимаю плоскость, направлена она параллельно, без всяких наклонов. и я подумал, теоретически даже мне необходимо иметь всего лишь прямоугольную "метку" определенной вокруг одного пикселя(изначально можно принять за центр изображения, т.к. предположительно там меньше всего искажений),а потом эту метку сдвигать во все стороны пока она не покроет начальное изображение,т.е. ориентируясь по этой метке мы получим все координаты этого начального пикселя на изображении. только тут проблема получается в том как сопоставлять саму эту метку) т.к. она тоже получается не всегда прямоугольная, а тоже искажается. Share this post Link to post Share on other sites
mrgloom 242 Report post Posted May 5, 2012 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
mrgloom 242 Report post Posted May 5, 2012 а падает на imwrite так что не алгоритме дело. Share this post Link to post Share on other sites
mrgloom 242 Report post Posted May 5, 2012 метод оказался хуже чем предыдущий, наверно потому что он не использует пирамиду. а вот тут пишут, что можно получить поток, затем варпнуть изображение посмотреть на разницу резултата и того что получилось и так сходится до требуемой точности. 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
mrgloom 242 Report post Posted July 16, 2012 продолжил копать тему. нашел несколько плагинов для 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
mrgloom 242 Report post Posted July 16, 2012 http://bigwww.epfl.ch/thevenaz/unwarpj/ unwarpj несмотря на красивые картинки в статье для тестовой картинки выдал неправильные результаты. Share this post Link to post Share on other sites
kilop 7 Report post Posted July 17, 2012 ммм, интересно надо разобраться с этим Share this post Link to post Share on other sites
mrgloom 242 Report post Posted August 9, 2012 http://www.picsl.upenn.edu/ANTS/ вроде для морфометрии но тема близкая Share this post Link to post Share on other sites
mrgloom 242 Report post Posted August 24, 2012 http://my.fit.edu/~lwei/isvc2010_slides_liu_ribeiro_shape.pdf обзор методов (для шейпов) non-rigid shape matching обзор для медицинских изображений http://www.siam.org/meetings/op08/Modersitzki.pdf Share this post Link to post Share on other sites
mrgloom 242 Report post Posted December 19, 2012 я вот подумал, что если мы имеем соответствие для всех пикселей изображения между двумя картинками. некоторые соответствия неправильные, некоторые точки могут на 2-х изображениях не присутствовать одновременно. а потом мы хотим всё это вписать в какое либо преобразование - например аффинное\перспективное и т.д. как это сделать? опять же возвращаемся к решению переопределенной системы? нужна ли до какая либо фильтрация? еще кое что есть в ITK http://www.itk.org/Wiki/ITK/Examples/Registration/ImageRegistrationMethodBSpline Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted December 19, 2012 я вот подумал, что если мы имеем соответствие для всех пикселей изображения между двумя картинками. некоторые соответствия неправильные, некоторые точки могут на 2-х изображениях не присутствовать одновременно. а потом мы хотим всё это вписать в какое либо преобразование - например аффинное\перспективное и т.д. как это сделать? Самый распространённый способ - RANSAC и его вариации. Share this post Link to post Share on other sites
mrgloom 242 Report post Posted March 14, 2014 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