Большинством программистов алгоритм обесцвечивания представляется интуитивно – просто среднее арифметическое каналов RGB. Это верный подход, но один из – иногда тупо не хватает цветности и контрастности, картинка сливается в серое малоразличимое нечто.

Вот тут я встретил описание еще двух методов.

grayscalemethods

Обратите внимание на светлые тона при использовании luminosity метода – насколько их интенсивность выделена по сравнению с average.

Вот текст шейдеров в FLSL:

// grayscale luminosity
float grayscaleLum(float4 color) {
    return 0.21*color.r+0.72*color.g+0.07*color.b;
}

float4 grayscaleLumColor(float4 color) {
    return float4(grayscaleLum(color));
}

// grayscale lightness 
float grayscaleLightness(float4 color) {
    return max(max(color.r,color.g),color.b)+min(min(color.r,color.g),color.b)/2;
}
float4 grayscaleLightnessColor(float4 color) {
    return float4(grayscaleLightness(color));
}

// grayscale average 
float grayscaleAverage(float4 color) {
    return (color.r+color.g+color.b)/3;
}
float4 grayscaleAverageColor(float4 color) {
    return float4(grayscaleAverage(color));
}

@Ariel логично поправил меня с шейдером luminosity

float4 luminance( float4 color )
{
    return color * dot( color.rgb, const( 0.3, 0.59, 0.11 ) );
}

Enjoy )

Join the conversation! 2 Comments

  1. […] Чтобы понять, где «высвечивать» блики — переводим текстуру в грейскейл по luminosity алгоритму. […]

    Reply

Leave a Reply

Category

3D FX

Tags

, ,