【问题标题】:Apply color interpolation on image在图像上应用颜色插值
【发布时间】:2012-01-11 09:04:59
【问题描述】:

我编写了一个方法来为图像应用 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++;
    }

}

【问题讨论】:

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


    【解决方案1】:

    根据亮度的分布,我认为你的问题在这里:

    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.9,则红色为 0.8,黄色为 0.2。 (如果亮度 = 0.9999,则红色为 0.9998,黄色为 0.0002)。

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

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

    【讨论】:

    • 我发现如果我让所有变量都浮动,那么如果亮度 > 0.5,我会得到很好的黄色到红色分布。但是如果它在下面并且它需要从蓝色变为黄色,我会得到从蓝色到绿色到黄色的颜色颠簸。我怎样才能顺利地从蓝色变为黄色:s。从黄色到红色似乎不是问题。
    • 您的黄色到红色计算与您的蓝色到黄色计算不同。尝试:结果 = (int) ((yellowTemp * (1.0- 亮度) * 2.0) + blueTemp * (0.5 - 亮度) * 2.0);或它的一些变体。
    • 也不工作:(。从黄色到红色和从蓝色到黄色时必须有一些不同的东西。无论如何谢谢:)。
    • 当亮度小于 0.5 时,尝试将亮度发送到 std::out。即 if (luminance
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 2013-08-07
    相关资源
    最近更新 更多