2013-04-03 4 views
0

У меня есть многоугольник, который состоит из сегментов разных цветов (красный и зеленый на образце).Цвет смеси в полигоне

И для каждого пикселя в многоугольник (серая зона), мне нужно, чтобы рассчитать коэффициенты, чтобы получить цвет пикселя: pix_color = красный * Ca + зеленый * Cb

Граничное условие является то, что на границе цвета коэффициенты должны быть = 1 (например, Ca = 1 Cb = 0 для красной границы).

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

Как я могу это сделать?

enter image description here

Update 2: Я попробовал алгоритм 3 цветовых границ и без выпуклого многоугольника. http://dl.dropbox.com/u/8841028/blending/polygon_full.png

вот мой OpenCV код

//a=red border,b=green,c= blue, da,db,dc min dist to borders. 
    Vec3b pix_ab; 
    pix_ab[2]= r_a*db/(da+db)+r_b*da/(da+db); 
    pix_ab[1]= g_a*db/(da+db)+g_b*da/(da+db); 
    pix_ab[0]= b_a*db/(da+db)+b_b*da/(da+db); 
    Vec3b pix_ac; 
    pix_ac[2]= r_a*dc/(da+dc)+r_c*da/(da+dc); 
    pix_ac[1]= g_a*dc/(da+dc)+g_c*da/(da+dc); 
    pix_ac[0]= b_a*dc/(da+dc)+b_c*da/(da+dc); 
    Vec3b pix_bc; 
    pix_bc[2]= r_b*dc/(db+dc)+r_c*db/(db+dc); 
    pix_bc[1]= g_b*dc/(db+dc)+g_c*db/(db+dc); 
    pix_bc[0]= b_b*dc/(db+dc)+b_c*db/(db+dc); 

    img(y,x)[0]= (pix_ab[0]+pix_ac[0]+pix_bc[0])/3; 
    img(y,x)[1]= (pix_ab[1]+pix_ac[1]+pix_bc[1])/3; 
    img(y,x)[2]= (pix_ab[2]+pix_ac[2]+pix_bc[2])/3; 

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

enter image description here

+0

[Билинейная интерполяция] (http://en.wikipedia.org/wiki/Bilinear_interpolation) не подходит для вас? Вы просто получаете цвет с четырех краев, как предложил Павел. Количество цветов в краях не имеет значения, вы просто добавляете значения RGB. –

+0

@George Aprilis Я не понимаю, какие точки мне нужно выбрать в случае полигона. – mrgloom

+0

Деление многоугольника на треугольники с использованием краев было бы лучшим вариантом, но я думаю, что метод, о котором говорил Павел, должен работать. Если вы интерполируете каждое из значений R, G, B таким же образом, то цвет края может быть любым. –

ответ

2

Дайте каждый внутренний 4 пикселей значения, что указывает расстояние вверх, вниз, влево, вправо до ближайших краев. Используйте самые низкие зеленые и самые низкие красные значения для расчета Ca и Cb.

т.е. для пикселя грубо обозначенной на моей схеме, я хотел бы предложить это 40 от красного, и 20 от зеленого, или в два раза зеленый, как красный, или Са = 0,333 и Cb = 0,666

enter image description here

+0

Хорошо, я понимаю.Но как я могу сделать это для 3 или более цветов (см. Обновление). – mrgloom