问题重新创建 PhotoShop 的色调\饱和度\亮度

问题描述 投票:0回答:0

我正在尝试调整与 PhotoShop 相同的 HSV 色彩空间。

我试过的

RGB 到 HSV,看来这是正确的一步。但是我发现HSV调整是骗人的。无论我尝试调整色调\饱和度\亮度,结果都不等于PS。

最后,我改变主意转成HSL,我得到了相同的结果。但是在S小于V(RGB到HSV)的情况下结果是正确的。

S大于V,在PS中还有另一种情况,饱和度会随着光线的变化而变化(RGB To HSL),这是非线性关系,我无法模拟。

步骤:

  1. RGB 到 HSL;

  2. RGB 到 HSV;

  3. 代码逻辑...

       if(HSV.S  less than HSV.V);
    
       Adjust HSL; //H range = -180 to180, Sat = -1 to 1, Light = -1 to 1;
    

    功能

       if(S or L less than 0)
    
        _S=S+S*Op;
    
        _L=L+L*Op;
    
       else
    
        _S=S+(1-S)*Op
    
        _L=L+(1-L)*Op
    
        HSL TO RGB
    
    1. 如果(HSV.S 大于 HSV.V)

      Nonlinear relation //If add L value,the S will be reduce.
      

HLSL代码:

     //RGB to HSL

    Color.xyz=RGB_TO_HSL(Color.xyz);

     //Adjustment of increment
      //x ~hue  [-180,180]
      //y ~saturation  [-1,1]or[-100%,100%]
      //z ~bright      [-1,1]or[-100%,100%]
    float3 Op = HSVOperate[basehsv].xyz;

    //H

    float Flag = Color.x;

    Color.x += Op.x;

    if (Color.x > 360)

        Color.x -= 360;

    else if(Color.x<0)

        Color.x += 360;

    //S
    float Gap = Max - Min;

    float S, V;

    if (Max == 0)

        S = 0;

    else

        S = Gap / Max;

    V = Max;

    if (S <=V){

        if (Op.z<0)

            Color.z = Color.z + Color.z*Op.z;

        else

            Color.z = Color.z + (1 - Color.z)*Op.z;

        if (Op.y < 0)

            Color.y = Color.y + Color.y*Op.y;

        else

            Color.y = Color.y + (1 - Color.y)*Op.y;

    }

    else if(S >V){

         // process Blue as same as S<V; I don't know why result was

         // correct.

        if (Flag <= 270 && Flag > 210)

        {
            if (Op.z<0)

                Color.z = Color.z + Color.z*Op.z;

            else

                Color.z = Color.z + (1 - Color.z)*Op.z;

            if (Op.y < 0)

                Color.y = Color.y + Color.y*Op.y;

            else

                Color.y = Color.y + (1 - Color.y)*Op.y;

        }

        else


        {   

              // Add directly for Saturation

                Color.z = Color.z +Op.z;

                if (Color.y > 1)

                    Color.y = 1;

                if(Color.y<0)

                    Color.y = 0;
                 //But bright will has a influence  to Saturation
                 // ? 
                 // ? I can't simulate the relation using matlab,
                 // Because   different S and V,different relation.

        }

    }

    //L
    Color.xyz=HSL_TO_RGB(Color.xyz);
image image-processing shader photoshop hlsl
© www.soinside.com 2019 - 2024. All rights reserved.