首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

查寻接近色(HSV空间)

2013-12-20 
查找接近色(HSV空间)我有一个颜色列表,以上是一部分RGB值随机给定一个颜色查找最接近的颜色大概200多种RGB

查找接近色(HSV空间)
查寻接近色(HSV空间)
我有一个颜色列表,以上是一部分RGB值
随机给定一个颜色查找最接近的颜色
大概200多种RGB值的颜色列表
我的思路是把RGB列表转乘HSV列表
在用欧式距离法得到最接近的HSV所在的INDEX而后返回INDEX处颜色
不知道这个类应该如何写
比如我随机给个RGB(255,14,100)如何返回HSB空间最接近色
Function get接近色(ByVal col As color, ByVal col_list As color())as color
............
end Function 
分数不多,大伙帮帮老弟吧,谢谢了。
以下JAVA参考连接
http://www.iteye.com/problems/23525
以下空间转换

   'RGB TO HSB
    Function rgbTohsb(ByVal col As Color) As Single()
        Dim rgbR As Single = col.R, rgbG As Single = col.G, rgbB As Single = col.B
        Dim rgb() As Single = New Single() {rgbR, rgbG, rgbB}
        Array.Sort(rgb)
        Dim max As Single = rgb(2)
        Dim min As Single = rgb(0)
        Dim hsbH As Single = 0
        Dim hsbS As Single
        Dim hsbB As Single
        If max = min Then
            hsbH = 270
            hsbS = 0
            hsbB = 0
            GoTo ret
        End If
        hsbB = max
        Select Case max
            Case 0
                hsbS = 0
            Case Else
                hsbS = CSng((max - min) / max)
        End Select
        Dim mc As Single = (max - min)
        Dim a As Single = rgbB - rgbR
        If max = rgbR And rgbG >= rgbB Then
            hsbH = (rgbG - rgbB) * 60.0F / mc + 0
        ElseIf max = rgbR And rgbG < rgbB Then
            hsbH = (rgbG - rgbB) * 60.0F / mc + 360
        ElseIf max = rgbG Then
            hsbH = (rgbB - rgbR) * 60.0F / mc + 120
        ElseIf max = rgbB Then
            hsbH = (rgbR - rgbG) * 60.0F / mc + 240
        End If
ret:    Return New Single() {hsbH, hsbS, hsbB}
    End Function
    '颜色模型转换
    ''' <summary>
    ''' HSV转颜色,H范围0-360,S范围0-1,V范围0-255
    ''' </summary>
    ''' <param name="H"></param>
    ''' <param name="S"></param>
    ''' <param name="V"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Function hsbTOrgb(ByVal H As Single, ByVal S As Single, ByVal V As Single) As Color
        Dim r, g, b As Integer
        If S = 0 Then
            r = g = b = V
        Else
            H /= 60
            Dim i As Byte = Int(H)
            Dim f As Single = H - i
            Dim p As Single = V * (1 - S)
            Dim q As Single = V * (1 - f * S)


            Dim t As Single = V * (1 - (1 - f) * S)
            Select Case i
                Case 0
                    r = V
                    g = t
                    b = p
                Case 1
                    r = q
                    g = V
                    b = p

                Case 2
                    r = p
                    g = V
                    b = t

                Case 3
                    r = p
                    g = q
                    b = V

                Case 4
                    r = t
                    g = p
                    b = V

                Case 5
                    r = V
                    g = p
                    b = q
                Case Else
            End Select
        End If

        Return Color.FromArgb(255, Int(r), Int(g), Int(b))
    End Function


[解决办法]
既然HSB空间是一个圆柱,你可以考虑比较夹角最小的和半径最接近的。
[解决办法]
哦,,敲错了。HSV。。。多跑了一个

热点排行