2017-12-19 2 views
1
import numpy as np 
import matplotlib.pyplot as plt 

files = ### 100 portrait photos 
imgs = [ plt.imread(f_i) for f_i in files ] # We read all file compositions into imgs 
data = np.array(imgs) # Turn everything into np.array format 
mean_imgs = np.mean(data, axis= 0) # Takes the mean of the entire data set 

plt.imshow(mean_imgs) # imgs_mean = array of floats 

Ergebnis: enter image description hereWarum bekomme ich eine Farbrauschkarte, wenn ich ein Array von Floats mit imshow() verwende, aber wenn ich uint8 verwende, bekomme ich das Bild, das ich will?

plt.imshow(mean_imgs.astype(np.uint8)) # Cast mean_imgs into type uint 

Ergebnis: enter image description here

Dies ist wohl eher eine Computer Vision Frage, sowieso versuche ich, den Unterschied zwischen imshow() ein Array mit allen Schwimmern zu verstehen und ein Array mit dem Typ uint8. Kann mir jemand freundlicherweise erklären, was im Backend zwischen diesen beiden Operationen passiert ist?

Bitte ignorieren Sie die Variablenmischung in den Bildern. Man denke nur an sie als eine gleiche Variable mit unterschiedlichem Typ.

Antwort

2

imshow documentation (Hervorhebung von mir):

Der Wert für jede Komponente des MxNx3 und MxNx4 Schwimmers Arrays sollten im Bereich 0,0 bis 1,0 sein.

Wenn der Typ ist uint8 es Werte im Bereich von 0 bis 255

Seit der Umstellung auf uint8 gibt Ihnen die richtigen Ergebnisse Ihre Werte sind offensichtlich nicht im Bereich 0,0 bis 1,0 sein erwartet.

Dies sollte funktionieren:

plt.imshow(mean_imgs/255) 
3

Die imshow Methode von Matplotlib erwartet Float-Arrays mit Werten zwischen 0,0 und 1,0. Ansonsten kommt es zu etwas Verkürzung (wie Überlauf, außer über 1), so dass in Wirklichkeit nur Bruchteile verwendet werden, was zu dem Rauschen führt, das Sie sehen.

Wenn Ihr schwimmt auf der Skala 0 ... 255 sind, können Sie das Problem vermeiden, können sie durch Skalierung: plt.imshow(X/255)

Beispiel:

X = np.add.outer(np.add.outer(np.arange(0, 50, 0.3), np.arange(0, 50, 0.1)), np.arange(0, 60, 20)) 
plt.imshow(X) 

noise

plt.imshow(X/255) # same as imshow(X.astype(np.uint8)) 

rgb

Verwandte Themen