1

我正在使用此代码来计算图像的平均颜色,但这并没有按预期工作。结果不准确。 如何找到图像的平均颜色

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#

4

2 回答 2

3

这应该有效:

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
于 2012-07-30T16:19:54.470 回答
3

一般来说,平均颜色没有多大意义。粉红色和海军黄色的平均值是多少?您现在计算它的方式会产生完全不同的颜色。

您需要在不同的色彩空间中工作。HSB 是一种易于使用的工具,并由 Color 类型直接支持。尽管它不处理人眼的强烈非线性颜色感知。Color.GetHue() 返回色调,一个与颜色成正比的值。您还应该创建一个直方图,以便照片的背景不会过多地干扰结果。或者至少从照片的中心向外工作。这是否足以检测肤色是相当值得怀疑的。

于 2012-07-30T16:23:50.860 回答