【Delphi】RGB值转色轮值
93°2009/07/02软件综合 IP:广东
算法如下(来自维基百科):

设 (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 学术
来自:计算机科学 / 软件综合
10
 
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
novakon
15年8个月前 IP:未同步
117676
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;
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年8个月前 IP:未同步
117683
就是这个!!就是这个!!!!我在这上面飚了半小时

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
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年8个月前 IP:未同步
117685
所以,翻译下来就是这样

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.
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年8个月前 IP:未同步
117689
示例:

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
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
finalapple
15年8个月前 IP:未同步
117700
刚看你那第一张图,,晕乎乎,纠结,,然后,终于晓得了



PS:这有什么实用性= =
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年8个月前 IP:未同步
117813
图像识别
仅仅靠RGB值很难判断颜色,但是用色轮角度就可以指定一个范围内的颜色
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
adeng2002
15年8个月前 IP:未同步
117821
譬如,进行颜色检出的时候,RGB模式有3个分量,而hsv模式中颜色相关分量都在H变量中了

下面两张以前截的视频中对公交车进行跟踪时就使用了H分量,进行直方图变换,归一化和逆变换后进行追踪 bbb.jpg
aaa.jpg
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
finalapple
15年8个月前 IP:未同步
117834
虽然不是很明白你在说什么  但是知道用处了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年7个月前 IP:未同步
126148
刚才写验证码识别,用到了HSL。翻译成XXXXXT了

正好放上来

    Public Function Min(ByVal a As Double, ByVal b As Double) As Double
        If a < 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 > 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 < 0 Then h = h + 1
            If h > 1 Then h = h - 1

        End If
        Return h
    End Function
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

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

所属专业
上级专业
同级专业
93°
学者 笔友
文章
651
回复
6032
学术分
30
2007/04/10注册,7年0个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}