TroyashkA 12 Жалоба Опубликовано April 22, 2011 Есть пара изображений: При наложении получается сие чудо: Каким образом можно сравнять яркости этой пары ? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 22, 2011 Погуглите Multiband Blending. и здесь есть материал по склейке (6-я лекция): http://www.csie.ntu.edu.tw/~cyy/courses/vfx/05spring/lectures/handouts/ 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 22, 2011 linear blending самый простой случай, но он становится не таким простым когда склеиваются не 2 изображения, а больше. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 22, 2011 работает, но медленно. mat_image[j] массив структур, содержащих указатель на изображении и всякие данные. смысл такой, что ищем прямоугольную область перекрытия и используя cvAddWeighted смешиваем изображения в разных пропорциях. а если область сложная(как на картинке наклонная) то по хорошему надо найти направление прекрытия. int dx=mat_image[i][j+1].x-mat_image[i][j].x; int dy=mat_image[i][j+1].y-mat_image[i][j].y; int wc=mat_image[i][j].src->width-abs(dx); //ширина области перекрытия int hc=mat_image[i][j+1].src->height-abs(dy); //высота области перекрытия double L=0.5*(wc); for (int k=0;k<L+1;k++) { // левый шов на 2 изображении //mat_image[i][j].src и mat_image[i][j+1].src соседние изображения cvSetImageROI(mat_image[i][j].src,cvRect(MIN(dx+wc/2+k,mat_image[i][j].src->width-1),MAX(0,dy),1,hc)); cvSetImageROI(mat_image[i][j+1].src,cvRect(MIN(wc/2+k,mat_image[i][j].src->width-1),abs(MIN(0,dy)),1,hc)); double beta = 0.5*(1+k/L); double alpha = 1-beta; IplImage* dst = cvCloneImage(mat_image[i][j+1].src); cvAddWeighted(mat_image[i][j].src, alpha, mat_image[i][j+1].src, beta, 0.0, dst); cvCopy(dst, mat_image[i][j+1].src); cvResetImageROI(mat_image[i][j+1].src); cvResetImageROI(mat_image[i][j].src); cvReleaseImage(&dst); // освобождение памяти if (k!=0) { //правый шов на 1 изображении cvSetImageROI(mat_image[i][j].src,cvRect(MAX(0,dx+wc/2-k),MAX(0,dy),1,hc)); cvSetImageROI(mat_image[i][j+1].src,cvRect(MAX(0,wc/2-k),abs(MIN(0,dy)),1,hc)); dst = cvCloneImage(mat_image[i][j+1].src); cvAddWeighted(mat_image[i][j+1].src, alpha, mat_image[i][j].src, beta, 0.0, dst); cvCopy(dst, mat_image[i][j+1].src); cvResetImageROI(mat_image[i][j+1].src); cvResetImageROI(mat_image[i][j].src); cvReleaseImage(&dst); } } 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
TroyashkA 12 Жалоба Опубликовано April 22, 2011 Спасибо! Буду разбираться ... Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано May 4, 2011 скорее всего надо не только плавно выровнять границу, но и еще привести к среднему яркость 2-х изображений. + возможно какие то идеи и от High Dynamic Range взять Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано August 12, 2011 http://www.cb.uu.se/~cris/blog/index.php/archives/76 Poisson Blending http://opencv.jp/opencv2-x-samples/poisson-blending нахождение оптимальных швов http://courses.graphicon.ru/files/courses/vision2/2011/lectures/cv2011_15_photomontage_part1.pdf http://courses.graphicon.ru/files/courses/vision2/2011/lectures/cv2011_16_photomontage_part2.pdf метод используемый в Hugin http://enblend.sourceforge.net/details.htm Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано January 11, 2012 http://opencv.jp/opencv2-x-samples/poisson-blending [offtop] Уже вторая ссылка. Ты выучил японский? [/offtop] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано January 11, 2012 ссылки чтобы не забыть и чтобы кто-то еще мог использовать. pdf-ка на английском, коменты в коде тоже, так что особых проблем нет. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано July 16, 2012 вроде обсуждали в каких то еще темах, но не нашел. вообщем проблема примерно как на картинке, меня интересует вот какой вопрос, получается, что блендинг это всего лишь локальное размытие границы, а то что например у нас яркость в панормае от начала до конца возрастает или каким либо образом флуктуирует не учитывается, т.е. вроде есть алгоритмы для выравнивания яркости на одном изображении, может как то можно проанализировать все элементы мозаики и потом выровнять всё элементы относительно какого то уровня яркости? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано February 21, 2013 допустим у нас 2 изображения пересекаются и область пересечения прямоугольник. считаю по простой формуле for( int y = 0; y < h; ++y ) { for( int x = 0; x < w; ++x ) { int da= min(x,y); int db= min(w-x,h-y); double alpha= (double)da/(da+db); pd[x].blue= (alpha*pIma[x].blue+(1-alpha)*pImb[x].blue); pd[x].green= (alpha*pIma[x].green+(1-alpha)*pImb[x].green); pd[x].red= (alpha*pIma[x].red+(1-alpha)*pImb[x].red); } pIma+= w_a; pImb+= w_b; pd+= w; } и при объединении красного и зеленого получается почему получается такая неравномерность? еще вопрос когда нам требуется, чтобы мы производили не просто блендинг, а разрезание по минимальному шву это взаимозаменяемые или дополняющие операции? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано February 22, 2013 я имею ввиду обведенные участки а по идее граница смешивания в 50% должна быть как проведена синяя линия. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано February 22, 2013 Я вывел значения с alpha=0.5 и допуском в каждую сторону равным 0.1, посмотрите что получается. Линии уровня не идут параллельно линии alpha=0.5, отсюда и проблемы. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано February 22, 2013 ну и как тогда делать? допустим нашли мы эту линию уровня 0.5 (кстати может тупо взять диагональ прямоугольника лучше?) и потом для каждой точки мы можем например определить кратчайшее расстояние до этой линии уровня. максимальное расстояние будет от угловой точки и можно тогда взять процент как dist/max_dist*0.5 но что получиться не очень понятно. отмеченные области кстати воспринимаются как линии скорее всего потому, что градиент по линии слабее, чем градиент идущий от грани. это получается как на пирамиду сверху смотреть, где яркость пикселя как высота. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано February 22, 2013 + еще более сложный случай есть области где мы пересекаемся по 2 изображения, а есть где сразу 3. как в области где 3 изображения пересекаются будет выглядеть линия уровня интересно? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано February 26, 2013 есть еще вариант взять точку и из точки пускать лучи на стенку области и в зависимости от длины луча по разному меняется градиент, альфа цвет меняется с 0.5 до 0. но не понятно, какая это это должна быть точка(возможно центр тяжести) и не очень понятно как это потом всё интерполировать. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 1, 2013 я вот еще подумал, что если у нас есть полигон, стороны которого отрезки, каждый отрезок "имеет свой цвет". для каждого цвета, мы можем построить карту distance transform, только непонятно как потом в конкретной точке смешивать цвета? pix= ima*Ca+imb*Cb+imc*Cc должно ли быть Ca+Cb+Cc=1 ? (т.е. надо как то пронормировать наверно.) по идее можно было бы использовать формулу для коэффициентов типа Ca= dista/(dista+distb+distc) но во-первых получается, что чем меньше dista тем меньше вклад изображения, а должно быть наоборот. и получается, что у нас не совсем distance transform, т.к. у нас есть как бы еще краевые условия, что на краю, т.е. на отрезке из которых состоит полигон, должен быть чистый цвет. может быть всё таки надо как то отталкиваться от градиента по направлению изолинии, но я что то не очень представляю как это сделать. про distance transform http://www.cs.cornell.edu/courses/cs664/2008sp/handouts/cs664-7-dtrans.pdf Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 1, 2013 или может быть это что то типа heat equation? http://people.math.sfu.ca/~mkropins/math922/lectures/heatsolvers.html Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 1, 2013 Ну так это уравнение Пуассона Еще могу дать свою реализацию некоторых функций по книжке: "Meshfree approximation methods with MATLAB" main.cpp 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 1, 2013 и что делает эта программа в 3д? судя по этому http://www.slideshare.net/prashkan90/gradient-image-blending похоже это, то что нужно, т.е. как раз есть граница где есть чистый цвет и мы должны вычислить градиент по которому будем смешивать изображения, только проблема в том ,что у меня не 2 изображения,а несколько и непонятно как это учитывать. причем там рассматривается изображение с замкнутой областью, не знаю может быть это важно? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 1, 2013 Программа в 3д, строит аппроксимацию по нерегулярному набору точек. А по совмещению изображений (расчет прозрачности) было тут: http://www.compvision.ru/forum/index.php?showtopic=1202 Замкнутая область важна, так как это начальные условия для решения диффуров. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 1, 2013 http://www.compvision.ru/forum/index.php?showtopic=1199 ну тогда скорее это. ну у меня задача как стоит, есть 2 прямоугольных изображения и они пересекаются как прямоугольник, у этого пересечения на левом и верхнем отрезке одно краевое условие (один цвет), на правом и нижнем другое. ну и потом усложнение, когда мы берем и пересекаем уже несколько прямоугольников как на картинке выше. по идее можно последовательно добавлять по картинке, но это не совсем правильно. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 1, 2013 Можно попробовать построить сопряжения для всех возможных пар, и усреднить. То есть если изображений три, то 1-2, 1-3, 2-3. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kilop 7 Жалоба Опубликовано April 1, 2013 mrgloom, а вы хотите совмещать изображения просто которые с одного местоположения снятые? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 2, 2013 вы хотите совмещать изображения просто которые с одного местоположения снятые? типа панорама. вот тут вроде есть внизу ссылки, но я так и не понял, что именно используется для блендинга. http://docs.opencv.org/modules/stitching/doc/introduction.html в stitching модуле есть отдельный класс blender. там 2 метода: http://docs.opencv.org/modules/stitching/doc/blenders.html какой то FeatherBlender и MultiBandBlender[A Multiresolution Spline with Application to Image Mosaics] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах