2012-01-11 63 views
1

我写了一种方法将三种颜色的渐变应用于图像。 颜色是蓝色 - >黄色 - >红色。 我的颜色从黄色到红色平滑过渡,但如果亮度低于0.5,从蓝色→黄色的过渡是从蓝色到绿色到黄色的颠簸,所以它不是光滑的。 我想对图像具有类似热影像的效果。在图像上应用色彩插值

我不知道我在做什么错,我写了下面的方法。 我计算应用于颜色模板的原始像素的亮度。

public void applyGradient() 
{ 
    size = width * height; 
    float r, g, b; 
    float redTemp, yellowTemp, blueTemp; 
    float luminance = 0; 
    float result; 
    index = 0; 
    redTemp = 0xff000000 | (255 << 16) | (0 << 8) | 0; 
    yellowTemp = 0xff000000 | (255 << 16) | (255 << 8) | 0; 
    blueTemp = 0xff000000 | (0 << 16) | (0 << 8) | 255; 
    while(index < size) 
    { 
     r = (rgbInput[index]& 0x00FF0000) >> 16; 
     g = (rgbInput[index]& 0x0000FF00) >> 8; 
     b = (rgbInput[index]& 0x000000FF); 


    luminance = ((r+b+g)/3)/255; 
    if (luminance < 0.5) 
    { 
     result = (float) ((yellowTemp * luminance * 2.0) + blueTemp * (0.5 - luminance) * 2.0); 
    } 
    else 
    { 
     result = (float) (redTemp * (luminance - 0.5) * 2.0 + yellowTemp * (1.0 - luminance) * 2.0);   
    } 

    output[index] = (int)result; 
    index++; 
    } 

} 

回答

0

根据亮度的分布,我觉得你的问题是在这里:

if (luminance < 0.5) 
{ 
    result = (int) ((yellowTemp * luminance * 2.0) + blueTemp * (0.5 - luminance) * 2.0); 
} 
else 
{ 
    result = (int) (redTemp * (luminance - 0.5) * 2.0 + yellowTemp * (1.0 - luminance) * 2.0);   
} 

如果亮度小于0.5,亮度非常小,那么你会得到蓝色。例如,如果亮度是0.0000001,那么黄色将是(0.0000001 * 2.0)= 0.0000002并且蓝色将是((0.5-0.0000001)* 2.0)= 0.9999998,这比蓝色多6个数量级,而不是黄色。 ((0.6 - 0.5)* 2.0)= 0.2和黄色将((1.0 - 0.6)* 2.0)= 0.8这应该给你一些黄色如果你的亮度分布总是在尾巴,那么如果亮度为0.9,那么红色将是0.8,黄色将是0.2。 (如果亮度= 0.9999,那么红色将是0.9998和黄色0.0002)。

如果你检查亮度的分布,它总是在尾部,即总是非常小或非常大,那么你不会得到任何黄色。另一方面,如果你的亮度分布是高斯或对数正态,那么我建议你在你的yellowTemp或redTemp计算中有一个错误。

+0

我发现,如果我使所有变量浮动,然后我得到良好的黄色红色分布,如果亮度> 0.5。但如果它在下面,它需要从蓝色变成黄色,我会从蓝色变成绿色变黄。我如何顺利地从蓝色变为黄色:s。从黄色到红色似乎不成问题。 – LordrAider 2012-01-11 11:39:57

+0

从黄色到红色的计算与从蓝色到黄色的计算不同。尝试:结果=(int)((yellowTemp *(1.0-亮度)* 2.0)+ blueTemp *(0.5-亮度)* 2.0);或者其中的一些变化。 – 2012-01-11 21:43:20

+0

也无法正常工作:(当从黄色变为红色,从蓝色变为黄色时,必须有不同的东西:)。 – LordrAider 2012-01-12 09:26:08