Применение цветовой интерполяции на изображении - PullRequest
1 голос
/ 11 января 2012

Я написал метод для применения к изображению градиента для 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 голосов
/ 11 января 2012

В зависимости от распределения яркости, я думаю, что ваша проблема здесь:

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,99999998, что на 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.

...