2016-07-13 6 views
1

IntroMatplotlib erzeugt ein schwarzes Bild von einem Array voller Einsen

ich matplotlib.pyplot einige Tests tue. Als ich versuchte, künstliche Bilder zu speichern, begegnete ich einem seltsamen Verhalten. Hier ist die sehr einfache Funktion, die ich erstellt Bilder speichern:

import numpy as np 
import matplotlib 
import matplotlib.pyplot as plt 

def save_image(array, name): 

    array = array*255. 
    fig = plt.figure() 
    plt.imsave(name, array.astype('uint8'), cmap=matplotlib.cm.gray) 
    plt.close(fig) 

return 0 

Das Problem

Wenn ich versuche, ein Bild mit einem Array erstellen vollen Nullen, ich ein dunkles Bild zu erhalten, wie erwartet:

zeros_array = np.zeros((200,200), dtype='float') 
save_image(zeros_array, 'Dark.jpg') 

Dark.jpg

Allerdings, wenn ich versuche, ein Bild mit einer Reihe voller diejenigen zu schaffen, habe ich noch erhält ein dunkles Bild:

ones_array = np.ones((200,200), dtype='float') 
save_image(ones_array, 'White.jpg') 

White.jpg

Interessanterweise, wenn ich ein mixed_array, mit Quadraten unterschiedlicher Intensität erzeugen, werden die Regionen voller Einsen jetzt als weiß:

mixed_array = np.ones((200,200), dtype='float') 
mixed_array[:100,:100] = 0.25 
mixed_array[100:,100:] = 0.75 
save_image(mixed_array, 'Mixed.jpg') 

Mixed.jpg

Frage:

Weiß jemand, warum matplotlib weigert, ein vollständiges weißes Bild zu speichern, aber kein Problem mit weißen Bereichen in einem Bild hat?

Ich vermisse wahrscheinlich etwas sehr offensichtlich oder grundlegend, aber ich kann nicht sehen was.

Antwort

2

Ich denke, Sie möchten die vmin und vmax beim Aufruf imsave setzen. Wenn Sie dies nicht tun, wird es automatisch aus dem Array ermittelt. Von der docs:

vmin/vmax: [Keine | Skalar]

vmin und vmax legen die Farbskalierung für das Bild fest, indem Sie die Werte festlegen, die den Farbbereichsgrenzen entsprechen. Wenn entweder vmin oder vmax None ist, wird diese Grenze aus dem arr min/max-Wert bestimmt.

Also, versuchen Sie Ihre Funktion an sich ändernde:

def save_image(array, name): 

    array = array*255. 
    fig = plt.figure() 
    plt.imsave(name, array.astype('uint8'), cmap=matplotlib.cm.gray, vmin=0, vmax=255) 
    plt.close(fig) 
Verwandte Themen