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

Яркости пары изображений

Recommended Posts

Есть пара изображений:

post-2854-0-02256600-1303464189_thumb.jppost-2854-0-48118700-1303464192_thumb.jp

При наложении получается сие чудо:

post-2854-0-78092600-1303464092_thumb.jp

Каким образом можно сравнять яркости этой пары ?

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


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

Погуглите Multiband Blending.

и здесь есть материал по склейке (6-я лекция):

http://www.csie.ntu.edu.tw/~cyy/courses/vfx/05spring/lectures/handouts/

  • Like 1

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


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

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

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


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

работает, но медленно.

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);

          }

       }

  • Like 1

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


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

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

+ возможно какие то идеи и от High Dynamic Range взять

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


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

[offtop]

Уже вторая ссылка. Ты выучил японский?

[/offtop]

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


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

ссылки чтобы не забыть и чтобы кто-то еще мог использовать.

pdf-ка на английском, коменты в коде тоже, так что особых проблем нет.

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


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

1-s2.0-S1359645411008998-gr6.jpg

вроде обсуждали в каких то еще темах, но не нашел.

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

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


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

допустим у нас 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;

}

и при объединении красного и зеленого получается

Image_002.png

почему получается такая неравномерность?

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

Image_20-02-2013%20%5B17-10-22%5D.png

это взаимозаменяемые или дополняющие операции?

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


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

я имею ввиду обведенные участки

Image_002_.png

а по идее граница смешивания в 50% должна быть как проведена синяя линия.

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


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

Я вывел значения с alpha=0.5 и допуском в каждую сторону равным 0.1, посмотрите что получается.

Линии уровня не идут параллельно линии alpha=0.5, отсюда и проблемы.

post-1-0-68971000-1361537464_thumb.png

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


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

ну и как тогда делать? допустим нашли мы эту линию уровня 0.5 (кстати может тупо взять диагональ прямоугольника лучше?)

и потом для каждой точки мы можем например определить кратчайшее расстояние до этой линии уровня.

максимальное расстояние будет от угловой точки и можно тогда взять процент как dist/max_dist*0.5

но что получиться не очень понятно.

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

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

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


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

+ еще более сложный случай

3_more.PNG

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

как в области где 3 изображения пересекаются будет выглядеть линия уровня интересно?

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


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

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

и не очень понятно как это потом всё интерполировать.

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


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

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

для каждого цвета, мы можем построить карту 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

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


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

Ну так это уравнение Пуассона :)

Еще могу дать свою реализацию некоторых функций по книжке:

"Meshfree approximation methods with MATLAB"

post-1-0-55246200-1364816002_thumb.png

main.cpp

  • Like 1

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


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

и что делает эта программа в 3д?

судя по этому

http://www.slideshare.net/prashkan90/gradient-image-blending

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

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

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


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

Программа в 3д, строит аппроксимацию по нерегулярному набору точек.

А по совмещению изображений (расчет прозрачности) было тут: http://www.compvision.ru/forum/index.php?showtopic=1202

Замкнутая область важна, так как это начальные условия для решения диффуров.

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


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

http://www.compvision.ru/forum/index.php?showtopic=1199

ну тогда скорее это.

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

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

по идее можно последовательно добавлять по картинке, но это не совсем правильно.

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


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

Можно попробовать построить сопряжения для всех возможных пар, и усреднить. То есть если изображений три, то 1-2, 1-3, 2-3.

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


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

mrgloom, а вы хотите совмещать изображения просто которые с одного местоположения снятые?

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


Ссылка на сообщение
Поделиться на других сайтах
вы хотите совмещать изображения просто которые с одного местоположения снятые?

типа панорама.

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

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]

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×