【Delphi】RGB值转色轮值
算法如下(来自维基百科):

设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max 等价于 r, g 和 b 中的最大者。设 min 等于这些值中的最小者。要找到在 HSL 空间中的 (h, s, l) 值,这里的 h ∈ [0, 360)是角度的色相角,而 s, l ∈ [0,1] 是饱和度和亮度,计算为:

HSL.PNG


实现代码如下(原创 = =):

输入:R,G,B (real类型)
输出:0~1之间的real类型数据,乘以360得角度值

function RGB2H(R:real;G:real;B:real):real;
var
mi:real;
ma:real;
del_R,del_G,del_B,del_Max:real;
H : real;
begin

R:=R/255;
G:=G/255;
B:=B/255;

mi:=Min(R,Min(G,B));
ma:=Max(R,Max(G,B));
del_Max:=Ma-Mi;

if(del_Max = 0) then
begin
  H := 0;
end
  else
begin

del_R := ((Ma-R/6.0)+(del_Max/2.0))/del_Max;
del_G := ((Ma-G/6.0)+(del_Max/2.0))/del_Max;
del_B := ((Ma-B/6.0)+(del_Max/2.0))/del_Max;

if R=Ma then begin H:=del_B-del_G; end
else if G=Ma then begin H:=(1.0/3.0)+del_R-del_B; end
else if B=Ma then begin H:=(2.0/3.0)+del_G-del_R; end
end;


if(H<0) then H:=H+1;
if(H>1) then H:=H-1;

RGB2H:=H;

end;

还需要这两个函数,本来在cpp的math.h里有的,delphi找不到,自己写

function Min(a:real;b:real):real;
begin
  if a < b then
  begin
  Min := a;
  end
  else
  begin
  Min := b;
  end;
end;

function Max(a:real;b:real):real;
begin
  if a > b then
  begin
  Max := a;
  end
  else
  begin
  Max := b;
  end;
end;
+355  科创币    delete   2009-07-02    学术
来自 软件综合
 
2009-7-2 16:04:12
1楼
LZ讲解一下Delphi的好玩语法,让更多的人接触Delphi
if R=Ma then begin H:=del_B-del_G; end
else if G=Ma then begin H:=(1.0/3.0)+del_R-del_B; end
else if B=Ma then begin H:=(2.0/3.0)+del_G-del_R; end
end;
折叠评论
加载评论中,请稍候...
折叠评论
93°(作者)
2楼
就是这个!!就是这个!!!!我在这上面飚了半小时

if R=Ma then begin H:=del_B-del_G; end
else if G=Ma then begin H:=(1.0/3.0)+del_R-del_B; end
else if B=Ma then begin H:=(2.0/3.0)+del_G-del_R; end
end;

if == if

begin == {
end(没分号的)== }
end;(有分号)== }

但是
示例:

if(a==b){     //<-这个就是"begin"
b=a;
}      //<-这个就是"end",没分号
else
{                                //"begin"
....
}      //<-这个就是有分号的end
折叠评论
加载评论中,请稍候...
折叠评论
93°(作者)
3楼
所以,翻译下来就是这样

if(R==Ma){
H=del_B-del_G;
}
elseif(G==Ma){
H=(1/3)+del_R-del_B;
}
else if(B==Ma){
H=(2.0/3.0)+del_G-del_R;
}
+1012  科创币    delete   2009-07-02    bon.
折叠评论
加载评论中,请稍候...
折叠评论
93°(作者)
4楼
示例:

var
a:string;
begin
a:=floattostr(360*RGB2H(strtoint(edit1.Text),strtoint(edit2.Text),strtoint(edit3.Text)));
showmessage(a);

RGB=0,0,255 ,蓝色

色轮角度就是240°:
delp1.PNG
折叠评论
加载评论中,请稍候...
折叠评论
5楼
刚看你那第一张图,,晕乎乎,纠结,,然后,终于晓得了



PS:这有什么实用性= =
折叠评论
加载评论中,请稍候...
折叠评论
93°(作者)
6楼
图像识别
仅仅靠RGB值很难判断颜色,但是用色轮角度就可以指定一个范围内的颜色
折叠评论
加载评论中,请稍候...
折叠评论
7楼
譬如,进行颜色检出的时候,RGB模式有3个分量,而hsv模式中颜色相关分量都在H变量中了

下面两张以前截的视频中对公交车进行跟踪时就使用了H分量,进行直方图变换,归一化和逆变换后进行追踪
bbb.JPG

aaa.JPG

折叠评论
加载评论中,请稍候...
折叠评论
8楼
虽然不是很明白你在说什么  但是知道用处了
折叠评论
加载评论中,请稍候...
折叠评论
2009-07-16 18:06:44
2009-7-16 18:06:44
93°(作者)
9楼
刚才写验证码识别,用到了HSL。翻译成VB.NET了

正好放上来

    Public Function Min(ByVal a As Double, ByVal b As Double) As Double
        If a &lt; b Then
            Return a
        Else
            Return b
        End If
    End Function

    Public Function Max(ByVal a As Double, ByVal b As Double) As Double
        If a &gt; b Then
            Return a
        Else
            Return b
        End If
    End Function

    Public Function RGB2H(ByVal r As Double, ByVal g As Double, ByVal b As Double) As Double
        Dim mi, ma As Double
        Dim del_r, del_g, del_b, del_max As Double
        Dim h As Double

        r = r / 255
        g = g / 255
        b = b / 255

        mi = Min(r, Min(g, b))
        ma = Max(r, Max(g, b))
        del_max = ma - mi

        If del_max = 0 Then
            h = 0
        Else
            del_r = ((ma - r / 6.0) + (del_max / 2.0)) / del_max
            del_g = ((ma - g / 6.0) + (del_max / 2.0)) / del_max
            del_b = ((ma - b / 6.0) + (del_max / 2.0)) / del_max



            If r = ma Then
                h = del_b - del_g
            Else
                If g = ma Then
                    h = (1.0 / 3.0) + del_r - del_b
                Else
                    If b = ma Then
                        h = (2.0 / 3.0) + del_g - del_r
                    End If
                End If
            End If

            If h &lt; 0 Then h = h + 1
            If h &gt; 1 Then h = h - 1

        End If
        Return h
    End Function
折叠评论
加载评论中,请稍候...
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
ID:{{user.uid}}
{{user.username}}
{{user.info.certsName}}
{{user.description}}
{{format("YYYY/MM/DD", user.toc)}}注册,{{fromNow(user.tlv)}}活动
{{submitted?"":"投诉"}}
请选择违规类型:
{{reason.description}}
支持的图片格式:jpg, jpeg, png