2012-01-11 1 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,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).

Если вы проверяете распределение яркости и всегда находитесь в хвостах, то есть всегда очень маленьком или очень большом, тогда вы не получите желтого цвета.

С другой стороны, если ваше распределение яркости является гауссовским или log-нормальным, то я бы предположил, что у вас есть ошибка в вашем вычислении yellowTemp или redTemp.

+0

Я узнал, что если бы я сделал все переменные, то я получаю хорошее распределение от желтого до красного, если яркость> 0,5. Но если он ниже, и он должен идти от синего до желтого, я получаю цветные удары от синего до зеленого до желтого. Как я могу плавно перейти от синего до желтого: s. От желтого до красного, похоже, не проблема. – LordrAider

+0

Ваши расчеты от желтого до красного отличаются от ваших расчетов от синего до желтого. Попробуйте: result = (int) ((yellowTemp * (1.0- яркость) * 2.0) + blueTemp * (0.5 - яркость) * 2.0); или некоторые изменения этого. –

+0

не работает также :(Должно быть что-то другое при переходе от желтого до красного и от синего до желтого. Thx в любом случае :). – LordrAider