请教,比较两个RGB颜色的相似度

a2522556 2015-04-12 12:46:28
相似度用0-100表示

有两个颜色
c1 = 0x00ffff
c2 = 0x10ffff
我现在用r1 - r2 < r2 * ((100-相似度)/100) 来判断
但是这样写一准不对,255的还好说, 10这类的值就错误了

我百度搜索到了一个

r3 = r1 - r2
g3 = g1 - g2
b3 = b1 - b2
diff = sqrt(r3 * r3 + g3 * g3 + b3 * b3)
但是我不知道如何把diff按照百分比的相似度来计算

请教如何写
...全文
4236 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-04-13
  • 打赏
  • 举报
回复
仅供参考,尽管是VB6:
Private Function Minimum(ParamArray Vals())
Dim n As Integer, MinVal
On Error Resume Next
    MinVal = Vals(0)
    For n = 1 To UBound(Vals)
        If Vals(n) < MinVal Then MinVal = Vals(n)
    Next n
    Minimum = MinVal
End Function
Private Function Maximum(ParamArray Vals())
Dim n As Integer, MaxVal
On Error Resume Next
    MaxVal = Vals(0)
    For n = 1 To UBound(Vals)
        If Vals(n) > MaxVal Then MaxVal = Vals(n)
    Next n
    Maximum = MaxVal
End Function

Private Sub c2hsb(ByVal clr As Long)
Dim MyR As Single, MyG As Single, MyB As Single
Dim Max As Single, Min As Single
Dim MyS As Single
Dim Delta As Single, MyVal As Single
Dim cc As String * 6
Dim r1, g1, b1 As Byte
On Error Resume Next
    cc = Right("000000" + Hex$(clr), 6)
    b1 = Val("&H" + Left(cc, 2))
    g1 = Val("&H" + Mid(cc, 3, 2))
    r1 = Val("&H" + Right(cc, 2))
    MyR = r1 / 255: MyG = g1 / 255: MyB = b1 / 255
    Max = Maximum(MyR, MyG, MyB)
    Min = Minimum(MyR, MyG, MyB)
    hsbB = Int(Max * 100)
    If Max <> 0 Then
        MyS = (Max - Min) / Max * 100
    Else
        MyS = 0
    End If
    hsbS = MyS
    If hsbS = 0 Then
        hsbH = 0
    Else
        Delta = Max - Min
        Select Case Max
        Case MyR
            MyVal = (MyG - MyB) / Delta
        Case MyG
            MyVal = 2 + (MyB - MyR) / Delta
        Case MyB
            MyVal = 4 + (MyR - MyG) / Delta
        End Select
        MyVal = MyVal * 60
        If MyVal < 0 Then MyVal = MyVal + 360
        hsbH = MyVal
    End If
'   Debug.Print "hsb="; hsbH; " "; hsbS; " "; hsbB
End Sub
Private Function ColorDistance(ByVal c1 As Long, ByVal c2 As Long) As Long
Dim cd As Long
Dim h1, s1, b1, h2, s2, b2 As Single
On Error Resume Next
    If c1 = -1 Or c2 = -1 Then
        ColorDistance = 1000000
        Exit Function
    End If
    c2hsb (c1)
    h1 = hsbH / 360
    s1 = hsbS
    b1 = hsbB
    c2hsb (c2)
    h2 = hsbH / 360
    s2 = hsbS
    b2 = hsbB
    cd = Abs(h1 - h2)
    cd = cd + Abs(s1 - s2)
    cd = cd + Abs(b1 - b2)
    ColorDistance = cd
End Function
超级能量泡泡 2015-04-13
  • 打赏
  • 举报
回复
引用 5 楼 a2522556 的回复:
[quote=引用 3 楼 daiweifeng 的回复:] 其实用RGB比较相似度是不合理的。 应该用HSV这样的。
RGB可以转成HSV吧,但是HSV怎么计算百分比的相似度来对比呢[/quote] HSV是个锥形,只要计算一下两点距离就行了。
relaxisland 2015-04-13
  • 打赏
  • 举报
回复
引用 7 楼 kite289 的回复:
百分比就是上面得到的值除以那个值的极限最大值。sqrt(r3 * r3 + g3 * g3 + b3 * b3)/sqrt(255*255+255*255+255*255)
不知道,所谓rgb的相似度是什么意思 , 从数学来说,这个公式比较靠谱
  • 打赏
  • 举报
回复
引用 6 楼 a2522556 的回复:
[quote=引用 4 楼 DelphiGuy 的回复:] (255 - abs(r1 - r2) * 0.297 - abs(g1 - g2) * 0.593 - abs(b1 - b2) * 0.11) / 255 也可以使用不同的彩色空间系数,象adobe sRGB就使用0.2126、0.7152、0.0722。
这种写法 如何计算相似度呢 主要是需要计算百分比的相似度来判断啊 [/quote] 结果就是相似度了,0~1之间的一个数。
kite289 2015-04-12
  • 打赏
  • 举报
回复
百分比就是上面得到的值除以那个值的极限最大值。sqrt(r3 * r3 + g3 * g3 + b3 * b3)/sqrt(255*255+255*255+255*255)
a2522556 2015-04-12
  • 打赏
  • 举报
回复
引用 4 楼 DelphiGuy 的回复:
(255 - abs(r1 - r2) * 0.297 - abs(g1 - g2) * 0.593 - abs(b1 - b2) * 0.11) / 255 也可以使用不同的彩色空间系数,象adobe sRGB就使用0.2126、0.7152、0.0722。
这种写法 如何计算相似度呢 主要是需要计算百分比的相似度来判断啊
a2522556 2015-04-12
  • 打赏
  • 举报
回复
引用 3 楼 daiweifeng 的回复:
其实用RGB比较相似度是不合理的。 应该用HSV这样的。
RGB可以转成HSV吧,但是HSV怎么计算百分比的相似度来对比呢
  • 打赏
  • 举报
回复
(255 - abs(r1 - r2) * 0.297 - abs(g1 - g2) * 0.593 - abs(b1 - b2) * 0.11) / 255 也可以使用不同的彩色空间系数,象adobe sRGB就使用0.2126、0.7152、0.0722。
超级能量泡泡 2015-04-12
  • 打赏
  • 举报
回复
其实用RGB比较相似度是不合理的。 应该用HSV这样的。
一根烂笔头 2015-04-12
  • 打赏
  • 举报
回复
上面你提到的公式就是两个三维坐标的距离!距离的概念没有百分比!可以自己定义一个度量 r3 =( r1 - r2) / 256 g3 = (g1 - g2) / 256 b3 = (b1 - b2) / 256 diff = sqrt(r3 * r3 + g3 * g3 + b3 * b3) 值越大,相似度越小;值越小,相似度越大!也可以把上面用1减去,保持值和相似度一致。 试试可行不
a2522556 2015-04-12
  • 打赏
  • 举报
回复
有没有人给指点下啊

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧