我做了一个检测图像颜色的应用程序。 它输出颜色为RGB代码,用于实例R = 23,G = 44,B = 109
现在应将这些RGB代码转换为粗糙的颜色名称(“蓝色”,“白色”,“黄色”)等等,每个“看起来像”蓝色的颜色应简洁地定义为“蓝色”。
谢谢:)
答案 0 :(得分:1)
以下是两个可能产生所需结果的类。没花太多时间,因为你没有提供太多的东西。
Public Class LooksLikeColor
Private _color As Color
Public Sub New(colorToTest As Color) 'i.e.colorToTest = Color.FromArgb(23, 44, 109)
Me._color = colorToTest
End Sub
Public distList As New List(Of ColorDistance)
Public minDist As Double
Public maxDist As Double
Public avgDist As Double
Private Sub DistanceFromList(ColorList As IEnumerable(Of Color))
Me.distList.Clear()
For Each c As Color In ColorList
Dim foo As New ColorDistance(c, Me._color)
Me.distList.Add(foo)
Next
Me.distList = Me.distList.OrderBy(Function(d) d._distance).ToList
Me.minDist = Me.distList.Min(Function(d) d._distance)
Me.maxDist = Me.distList.Max(Function(d) d._distance)
Me.avgDist = Me.distList.Average(Function(d) d._distance)
End Sub
Public Sub ComputeDistanceKnownColors()
Me.DistanceFromList(From kc In [Enum].GetValues(GetType(System.Drawing.KnownColor)) Select Color.FromName(kc.ToString))
End Sub
Public Sub ComputeDistanceFromList(Optional ColorList As List(Of Color) = Nothing)
If ColorList Is Nothing Then
Dim clrs() As Color = {Color.Red, Color.Green, Color.Blue, Color.Yellow, Color.Cyan, Color.Magenta}
Me.DistanceFromList(clrs)
Else
Me.DistanceFromList(ColorList)
End If
End Sub
Public Function SelDist(dist As Double) As List(Of ColorDistance)
Dim rv As New List(Of ColorDistance)
rv = (From d In Me.distList Where d._distance <= dist Select d).ToList
Return rv
End Function
End Class
Public Class ColorDistance
''' <summary>
''' known color
''' </summary>
''' <remarks></remarks>
Public _r1 As Color
Public _r2 As Color
Public _distance As Double = 0.0R
Public Sub New(knwn As Color, tstColor As Color)
Me._r1 = knwn
Me._r2 = tstColor
Me._distance = ((CInt(Me._r2.R) - CInt(Me._r1.R)) ^ 2)
Me._distance += ((CInt(Me._r2.G) - CInt(Me._r1.G)) ^ 2)
Me._distance += ((CInt(Me._r2.B) - CInt(Me._r1.B)) ^ 2)
Me._distance = Math.Sqrt(Me._distance)
End Sub
End Class
和一些用
进行测试的代码 Dim c As Color = Color.FromArgb(23, 44, 109)
Dim foo As New LooksLikeColor(c)
foo.ComputeDistanceFromList()
Dim cdl As List(Of ColorDistance) = foo.SelDist(foo.avgDist)
Debug.WriteLine("")
For Each d As ColorDistance In cdl
Debug.WriteLine(d._r1.Name)
Next
使用调试器来遵循代码。根据需要进行调整。
答案 1 :(得分:0)
最简单的方法是定义颜色的地图(蓝色,白色,黄色),将标签与特定的RGB值相关联,然后您可以使用color distances
之一的mertics您可以采用欧氏距离,然后计算最接近的颜色,使该指标最小化。显然,这不会有完美的结果,但可以为你所接受。