我正在使用此代码计算图像的平均颜色,但这并不能按预期工作。结果不准确。 如何查找图片的平均颜色?
Private Sub btnAvg_Click() Handles btnAvg.Click
Dim x, y As Integer
bmp = New Bitmap(picBox.Tag.ToString)
For y = picBox.Top To picBox.Bottom
For x = picBox.Left To picBox.Right
With bmp.GetPixel(x, y)
totalR = totalR + .R : totalG = totalG + .G : totalB = totalB + .B
End With
Next x
Next y
avgR = totalR / ((picBox.Bottom - picBox.Top) * (picBox.Right - picBox.Left))
avgG = totalG / ((picBox.Bottom - picBox.Top) * (picBox.Right - picBox.Left))
avgB = totalB / ((picBox.Bottom - picBox.Top) * (picBox.Right - picBox.Left))
End Sub
我正在寻找一种高速,超过80%的准确结果。这不是一个重复的问题,因为其他问题仅涉及C#
答案 0 :(得分:3)
平均颜色通常没有多大意义。粉红色和深蓝色的平均值是多少?现在计算它的方式会产生完全不同的颜色。
您需要在不同的色彩空间中工作。 HSB很容易使用并直接支持Color类型。虽然它不涉及人眼的强烈非线性色彩感知。 Color.GetHue()返回色调,这是一个与颜色成正比的值。您还应该创建一个直方图,以便照片的背景不会过多地干扰结果。或至少从照片中心向外工作。这是否足以检测肤色是值得怀疑的。
答案 1 :(得分:2)
这应该有效:
Private Function getAverageColor(ByVal imageFilePath As String) As Color
Dim bmp As New Bitmap(imageFilePath)
Dim totalR As Integer = 0
Dim totalG As Integer = 0
Dim totalB As Integer = 0
For x As Integer = 0 To bmp.Width - 1
For y As Integer = 0 To bmp.Height - 1
Dim pixel As Color = bmp.GetPixel(x, y)
totalR += pixel.R
totalG += pixel.G
totalB += pixel.B
Next
Next
Dim totalPixels As Integer = bmp.Height * bmp.Width
Dim averageR As Integer = totalR \ totalPixels
Dim averageg As Integer = totalG \ totalPixels
Dim averageb As Integer = totalB \ totalPixels
Return Color.FromArgb(averageR, averageg, averageb)
End Function