2013-04-03 102 views
0

我有一个由不同颜色的段组成的多边形(样本图像上的红色和绿色)。在多边形中混合颜色

以及在多边形(灰色区域)的每个像素我需要计算系数以获得像素的颜色: pix_color =红色*的Ca +绿色*的Cb

边界条件是,在边界色彩系数必须= 1(例如,对于红色边界,Ca = 1 Cb = 0)。

所以我想在多边形的内部区域实现从红色到绿色的“平滑”过渡。

我该怎么办?

enter image description here

更新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,或两倍绿红,或Ca = 0.333和Cb = 0.666

enter image description here

+0

好吧,我明白了。但我怎么能做到这一点3种或更多的颜色(见更新)。 – mrgloom