web-dev-qa-db-fra.com

Comment obtenir une valeur moyenne en pixels d'une image en niveaux de gris en Python à l'aide de PIL\Numpy?

J'ai peu d'images en niveaux de gris et j'ai pensé calculer la valeur moyenne en pixels de l'image totale afin de pouvoir représenter chaque image à l'aide d'une seule valeur.

 enter image description here

6
Mdas

Si vous voulez faire ce genre de choses, vous devriez envisager d'utiliser scikit-image à la place de PIL ou d'oreiller brut. SciKit Image utilise des tableaux numpy pour les images, ainsi toutes les méthodes numpy fonctionnent.

from skimage import io
import numpy as np

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

print(np.mean(image))

Vous voudrez peut-être convertir toutes les images en float pour obtenir une valeur entre 0 et 1:

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

Cela peut être fait en utilisant PIL en boucle sur les pixels, en accumulant toutes les valeurs de pixel et en divisant par le nombre de pixels (c'est-à-dire largeur * hauteur).

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

la solution est beaucoup plus simple que celles proposées dans les commentaires et les réponses: aucun calcul sur les n-uplets ni besoin de boucles imbriquées pour parcourir les valeurs des cellules. 

plus précisément, si vous avez une image en niveaux de gris, vous avez un tableau 2D dans lequel les cellules du tableau sont remplies de valeurs scalaires comprises entre 0 et 1.

en revanche, une image couleur est un tableau 2D NumPy dans lequel un rgb Tuple se trouve dans chaque cellule.

en d'autres termes: une représentation matricielle d'une image en niveaux de gris dans NumPy est un tableau 2D dont les cellules ont des valeurs flottantes comprises entre 0 (noir) et 1 (blanc)

dans ce cas, vous pouvez calculer la valeur moyenne des pixels en calculant la moyenne le long des deux axes de la matrice d’images, comme suit:

>>> 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]])

cette seule ligne de code fera ce que vous voulez - calculez la moyenne deux fois, une fois pour chaque axe du tableau (inutile de spécifier un axe pour le second appel à mean car la valeur de retour du premier appel est juste un tableau 1D

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

  0.50000646872609511

la valeur de 0,5 semble correcte car les valeurs du tableau ont été générées en appelant NP.random.Rand, qui renvoie les valeurs échantillonnées à partir d'une distribution uniforme sur l'intervalle de demi-ouverture [0, 1)

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

 enter image description here

1
doug

Peut-être la réponse la plus courte:

from PIL import Image

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