在图像上应用颜色插值

时间:2012-01-11 09:05:00

标签: c++ math image-processing filter interpolation

我写了一个方法,将3种颜色的渐变应用于图像。 颜色是蓝色 - >黄色 - >红色。 我正在从黄色到红色的颜色平滑过渡,但如果亮度低于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++;
    }

}

1 个答案:

答案 0 :(得分: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.6 - 0.5)* 2.0)= 0.2,黄色为((1.0 - 0.6)* 2.0)= 0.8,如果您的亮度分布为0,则会给出一些黄色如果亮度为0.9,则红色将为0.8,黄色为0.2。 (如果亮度= 0.9999,则红色为0.9998,黄色为0.0002)。

如果你检查亮度的分布并且总是在尾部,即总是非常小或非常大,那么你将不会得到任何黄色。

另一方面,如果您的亮度分布是高斯分布或对数正态分布,那么我建议您在yellowTemp或redTemp计算中出错。