rgb转hsl,红绿蓝转色调饱和度亮度(颜色转换,c#)

现在工业彩色相机越来越普及,经常会遇到解读颜色,即就是色调hue,所以我们经常会把常用的rgb转换hsl,h就是色调,颜色。h的定义0-360,如下:

rgb转hsl,红绿蓝转色调饱和度亮度(颜色转换,c#)_第1张图片

用到的转换公式如下:

rgb转hsl,红绿蓝转色调饱和度亮度(颜色转换,c#)_第2张图片

翻译成c#代码,总感觉效果不好,当红绿蓝颜色值相差不过8或10时,看上去,基本就是灰度图,即0-360里边,找不到结果,我就处理成-1了,即代表灰度图。

代码如下: 

  void RGB2HSL3(int r, int g, int b, ref float H, ref float S, ref float L)
        {//20220927这个版本比0801版本好
            float R, G, B, Max, Min, del_Max;
            R = r / (float)255;     
            G = g / (float)255;
            B = b / (float)255;//做了除法之后B变成了一个很小的值
            Min = Math.Min(R, Math.Min(G, B));    //Min. value of RGB
            Max = Math.Max(R, Math.Max(G, B));    //Max. value of RGB
            del_Max = Max - Min;        //Delta RGB value

            H = 0; S = 0; L = 0;       

            L = (Max + Min) / 2.0f;//亮度

            if (Max == 0)
            {

                S = 0;//饱和度
                H = -1;
             
            }
            else
            {
                //if (Max != Min)
                if (del_Max * 255 > 8)//三原色相差8范围内,认为是灰度图
                {
                    if (R == Max && G >= B) { H = 60 * (G - B) / (float)del_Max + 0; }
                    if (R == Max && G < B) { H = 60 * (G - B) / (float)del_Max + 360; }
                    if (G == Max) { H = 60 * (B - R) / (float)del_Max + 120; }
                    if (B == Max) { H = 60 * (R - G) / (float)del_Max + 240; }


                    if (0 < L && L <= 0.5)
                    {
                        S = del_Max / (Max + Min);
                    }
                    else if (L > 0.5)
                    { S = del_Max / (2 - (Max + Min)); }

                }//三原色相差8范围内,能不能给出灰度值?当没有颜色时gray=0.3r+0.59g+0.11b;//20220927
                else//认为变化不大,同色,即灰度图//20220801
                {
                  
                    H = -1; del_Max = 0;
                  
                    S = 0;
                }

              
            }
        }

 

你可能感兴趣的:(机器视觉自我实现(三),机器视觉,算法)