平均图像颜色

时间:2012-07-30 15:46:17

标签: vb.net vb.net-2010

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

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#

2 个答案:

答案 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