当前位置: 代码迷 >> VB Dotnet >> 查找接近色(HSV空间)解决思路
  详细解决方案

查找接近色(HSV空间)解决思路

热度:268   发布时间:2016-04-25 02:24:23.0
查找接近色(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)
  相关解决方案