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 に答える