【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    学术
来自:计算机科学 / 软件综合
 
novakon
12年2个月前
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;
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
12年2个月前
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
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
12年2个月前
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.
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
12年2个月前
4楼
示例:

var
a:string;
begin
a:=floattostr(360*RGB2H(strtoint(XXXXXXXXXX),strtoint(XXXXXXXXXX),strtoint(XXXXXXXXXX)));
showmessage(a);

RGB=0,0,255 ,蓝色

色轮角度就是240°:
delp1.PNG
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
finalapple
12年2个月前
5楼
刚看你那第一张图,,晕乎乎,纠结,,然后,终于晓得了



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

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

正好放上来

    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注册,4 年前活动
暂无简介
%7B%22isDisplay%22%3Atrue%7D

仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。

插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
等待中...
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
处理中..
处理失败
插入表情
我的表情
共享表情
Emoji
上传
注意事项
最大尺寸100px,超过会被压缩。为保证效果,建议上传前自行处理。
建议上传自己DIY的表情,严禁上传侵权内容。
点击重试等待上传{{s.progress}}%处理中...已上传
空空如也~
草稿箱
加载中...
此处只插入正文,如果要使用草稿中的其余内容,请点击继续创作。
{{fromNow(d.toc)}}
{{getDraftInfo(d)}}
标题:{{d.t}}
内容:{{d.c}}
继续创作
删除插入插入
{{forum.displayName}}
{{forum.countThreads}}
篇文章,
{{forum.countPosts}}
条回复
{{forum.description || "暂无简介"}}
ID: {{user.uid}}
学术分隐藏
{{submitted?"":"投诉或举报"}}
请选择违规类型:
{{reason.description}}
支持的图片格式:jpg, jpeg, png
插入公式
分享回复:{{shareId}}
加载中...
评论控制
加载中...
文号:{{pid}}
加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
加入关注取消关注
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
建议修改
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}
下载资料
{{fileName}}
大小:{{size}}
下载当前附件将花费 {{costMessage}}
{{description}}
你当前剩余 {{holdMessage}}
{{fileName}}
大小:{{size}}
当前附件免费。
你已购买过此附件,下载当前附件不需要花费积分。
加载中...
{{errorInfo}}
附件已丢失
当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}