2017-01-24 1 views
0

Ich habe gerade angefangen, Tensorflow und Numpy Konzepte zu lernen. Ich modelliere mit Tensorflow unterschiedlich geformte Bilder zu einer festen Form, für die ich Loop benutze. Am Ende der Schleife akkumuliere ich diese umgeformten Bilder in einem Array. Jetzt, wenn ich das Bild von diesem Array plotte, bekomme ich unscharfes Bild. Aber wenn ich die Instanz des umgeformten Bildes mit Tensorflow plotte, bekomme ich das korrekte Bild. Kann mir bitte jemand erklären, wo ich falsch liege?Bild verwischt nach Zuweisung

Code:

fixedW = 227.0 
fixedH = 227.0 
X_data = np.zeros((3, fixedW, fixedH, 3), dtype = np.float32) # Only 3 images in this example 
tf.reset_default_graph() 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    for i in range(3): 
     img = matplotlib.image.imread(image_file_name[i]) 
     preshape = img.shape 
     img = np.reshape(img, (1, preshape[0], preshape[1], preshape[2])) #Make it single batched image 
     tf_img = tf.image.resize_images(img, (fixedW, fixedH), tf.image.ResizeMethod.NEAREST_NEIGHBOR) 
     resized_img = sess.run(tf_img)[0] 
     print(resized_img.shape) # Prints correctly 
     X_data[i, :, :, :] = resized_img[:, :, :] # Something is wrong here 

# This plots correctly 
plt.imshow(resized_img) 
plt.show() 

Correct image

# This plots some blurred image 
plt.imshow(X_data[2]) 
plt.show() 

Blurred incorrect image

Bitte kann mir jemand erklären, wo ich in diesem gehe falsch und in welchem ​​Konzept bin ich hier in meinem Verständnis fehlt von dieser Aufgabe.

Antwort

0

Ich habe die Lösung. Das Problem war mit X_data Typ. Die Funktion imshow nimmt nur Werte vom Typ uint8 oder float32 und darüber hinaus müssen die Werte im Bereich von 0,0 bis 1,0 liegen.

Meine Variable X_data akzeptierte Typen von float32, aber die Werte waren größer als 1. Die Konvertierung des Typs von X_data in uint8 löste das Problem. Hier

ist die Lösung line:

X_data = np.zeros((3, fixedW, fixedH, 3), dtype = np.uint8) 
0

die Daten an uint8 löst das Problem, wenn die Umwandlung, die folgenden könnte es als gut lösen (ohne das Array als uint8 zu erklären):

plt.imshow(X_data[2], vmin=0, vmax=255) 

Von Ihrem Problem verstehe ich, dass Ihr float-Bild tatsächlich im Bereich von [0, 255] ist (was die Konvertierung in Uint endet).

Das eigentliche Problem scheint dann imshow automatisch, dass matplotlib ist, um die vmin und vmax des Bildes passt sich der X_data[2].min() und X_data[2].max() standardmäßig, wenn sie nicht vorhanden sind.

Wenn Sie vmin=0 und vmax=255 angeben, sollte das Plotten identisch (und vielleicht angemessener) sein, um Ihre Daten auf vorzeichenlose Bytes zu runden.

Es kann jedoch nicht der Fall sein, da der Code nicht repliziert werden kann und ich es daher nicht testen kann: P.

Verwandte Themen