赞
踩
现在工业彩色相机越来越普及,经常会遇到解读颜色,即就是色调hue,所以我们经常会把常用的rgb转换hsl,h就是色调,颜色。h的定义0-360,如下:
用到的转换公式如下:
翻译成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;
}
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。