wake-up-neo.net

Wie erhält man einen durchschnittlichen Pixelwert eines Graustufenbildes in Python mit PIL\Numpy?

Ich habe nur wenige Graustufenbilder und habe darüber nachgedacht, den durchschnittlichen Pixelwert des Gesamtbilds zu berechnen, damit ich jedes einzelne Bild mit einem einzigen Wert darstellen kann.

 enter image description here

6
Mdas

Wenn Sie solche Dinge tun möchten, sollten Sie scikit-image anstelle von PIL oder rohem Kissen verwenden. SciKit Image verwendet numpy-Arrays für Bilder, sodass alle numpy-Methoden funktionieren.

from skimage import io
import numpy as np

image = io.imread('http://i.stack.imgur.com/Y8UeF.jpg')

print(np.mean(image))

Möglicherweise möchten Sie alle Bilder in Float konvertieren, um einen Wert zwischen 0 und 1 zu erhalten:

from skimage import io, img_as_float
import numpy as np

image = io.imread('http://i.stack.imgur.com/Y8UeF.jpg')
image = img_as_float(image)
print(np.mean(image))
10
MaxNoe

Dies kann mithilfe von PIL durchgeführt werden, indem die Pixel überlaufen werden, alle Pixelwerte akkumuliert werden und durch die Anzahl der Pixel (d. H. Breite * Höhe) dividiert wird.

from PIL import Image

im = Image.open('theimagefile.jpg')
im_grey = im.convert('LA') # convert to grayscale
width, height = im.size

total = 0
for i in range(0, width):
    for j in range(0, height):
        total += im_grey.getpixel((i,j))[0]

mean = total / (width * height)
print(mean)
2
Yurrit Avonds

die Lösung ist viel einfacher als die in den Kommentaren und Antworten angebotene - dh keine Berechnung über Tupel und keine Notwendigkeit, geschachtelte Schleifen über die Zellwerte zu iterieren. 

wenn Sie ein Graustufenbild haben, haben Sie ein 2D-Array, in dem die Array-Zellen mit Skalarwerten von 0 bis 1 gefüllt sind.

im Gegensatz dazu ist ein Farbbild ein 2D-NumPy-Array, in dem ein rgb-Tuple in jeder Zelle sitzt.

anders ausgedrückt: Eine NumPy-Array-Darstellung eines Graustufenbilds ist ein 2D-Array, dessen Zellen Float-Werte zwischen 0 (Schwarz) und 1 (Weiß) haben.

in diesem Fall können Sie den Pixelmittelwert berechnen, indem Sie den Mittelwert entlang der beiden Achsen des Bildarrays wie folgt berechnen:

>>> import numpy as NP
>>> img = NP.random.Rand(100, 100)
>>> img[:5, :5]
     array([[ 0.824,  0.864,  0.731,  0.57 ,  0.127],
            [ 0.307,  0.524,  0.637,  0.134,  0.877],
            [ 0.343,  0.789,  0.758,  0.059,  0.374],
            [ 0.693,  0.991,  0.458,  0.374,  0.738],
            [ 0.237,  0.226,  0.869,  0.952,  0.948]])

diese einzelne Codezeile wird das tun, was Sie möchten: Berechnen Sie den Mittelwert zweimal für jede Achse im Array (keine Notwendigkeit, eine Achse für den zweiten Aufruf an mean anzugeben, da der Rückgabewert vom ersten Code liegt Aufruf ist nur ein 1D-Array

>>> img.mean(axis=0).mean()

  0.50000646872609511

der Wert von 0.5 scheint korrekt zu sein, da die Array-Werte durch Aufruf von NP.random.Rand generiert wurden, der Werte liefert, die aus einer gleichmäßigen Verteilung über das halboffene Intervall [0, 1) abgerufen wurden.

>>> import matplotlib.pyplot as MPL
>>> MPL.imshow(img, cmap=MPL.cm.gray, interpolation='nearest')
>>> MPL.show()

 enter image description here

1
doug

Vielleicht die kürzeste Antwort:

from PIL import Image

im = Image.open(...)
im.thumbnail((1, 1))
avg_color = im.getpixel(0, 0)
1
hrmthw