2016-07-06 21 views
1

Ich habe ein 4D ndarray von Bilddaten, die als [NumberOfImages, RowsOfImage, ColumnsOfImage, ChannelsOfImage] organisiert ist.Gibt es in Python eine Größenänderungsfunktion, um ein Bild als tf.image.resize_images-Funktion von TensorFlow zu skalieren?

Jetzt möchte ich die Bilder im 4D ndarray auf die neue Größe, um die Größe, die mit der Größe ist [NumberOfImages, NewRowsOfImage, NewColumnsOfImage, ChannelsOfImage], während die anderen Dimensionen bleiben unverändert.

Ich weiß, es gibt eine Funktion tf.image.resize_images in TensorFlow, um dies zu tun. Wenn das neue Bild größer als das Originalbild ist, wird das neue Bild mit neuen Bildpunkten mit der Bilinear-Interpolation oder Nearest Neighbor-Interpolation gefüllt.

Allerdings wurde das NDarray der Bilddaten nach der Größenanpassung in ein Tensor-Objekt von TensorFlow konvertiert. Dann muss ich es wieder in ein ndarray konvertieren. Diese Verfahren werden enorme Zeit kosten.

Ich habe versucht skimage.transform.resize, aber diese Funktion scheint 2D-Bilddaten zu skalieren. Wenn ich diese Funktion verwende, muss ich eine für Schleife verwenden, die auch enorme Zeit kosten wird.

Gibt es also eine Größenänderungsfunktion in Python, die der tf.image.resize_images-Funktion von TensorFlow entspricht? Wenn nicht, könnte mir jemand einen Rat geben, um mein Problem zu lösen?

Vielen Dank.

Antwort

1

numpy.resize verwenden. Siehe folgendes Beispiel. Alle Bilder haben die gleiche Form (in diesem Fall 768 x 1024 x 3). In diesem Beispiel habe ich die Zeilennummer mit der Spaltennummer geändert. im_all ist Ihr 4d-Array. Hier

from scipy.misc import imread 
import numpy as np 
import matplotlib.pyplot as plt 
f = r"C:\Users\Public\Pictures\Sample Pictures\Lighthouse.jpg" 
im0 = imread(f) 
f = r"C:\Users\Public\Pictures\Sample Pictures\koala.jpg" 
im1 = imread(f) 
f = r"C:\Users\Public\Pictures\Sample Pictures\tulips.jpg" 
im2 = imread(f) 
f = r"C:\Users\Public\Pictures\Sample Pictures\desert.jpg" 
im3 = imread(f) 
im_all = np.array([im0, im1, im2, im3]) 
im_all_b = np.resize(im_all, [im_all.shape[0], im_all.shape[2], im_all.shape[1], im_all.shape[3]]) 
plt.figure() 
plt.imshow(im_all_b[1]) 
plt.figure() 
plt.imshow(im_all[1]) 
plt.show() 

ist ein Beispiel mit Interpolation (Standard: bilinear siehe: http://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.misc.imresize.html) mit Speichernutzung Optimierung:

from scipy.misc import imread, imresize 
import numpy as np 
import matplotlib.pyplot as plt 
f = r"C:\Users\Public\Pictures\Sample Pictures\Lighthouse.jpg" 
im0 = imread(f) 
f = r"C:\Users\Public\Pictures\Sample Pictures\koala.jpg" 
im1 = imread(f) 
f = r"C:\Users\Public\Pictures\Sample Pictures\tulips.jpg" 
im2 = imread(f) 
f = r"C:\Users\Public\Pictures\Sample Pictures\desert.jpg" 
im3 = imread(f) 
im_all = np.array([im0, im1, im2, im3]) 
for i in range(im_all.shape[0]): 
    temp = im_all[0, :, :, :].copy() 
    im_all = np.delete(im_all, 0, 0) 
    temp = imresize(temp, (temp.shape[0]+200, temp.shape[1]+200, 3)) 
    temp = np.expand_dims(temp, axis=0) 
    try: 
     im_all_b = np.vstack([im_all_b, temp]) 
    except NameError: 
     im_all_b = temp 

plt.figure() 
plt.imshow(im_all_b[1]) 
plt.show() 

Im obigen Beispiel füge I 200 Pixel zu jedem der x- und y-Achse.

+0

Vielen Dank. Aber die Operation in Ihrem Beispiel ist nur die Umformung eines Bildes. Dann scheint es, dass die Funktion np.resize das Bild zu einem größeren Bild skalieren kann. Es wird jedoch nicht mit der üblichen Interpolationsmethode skaliert, z. B. mit der Interpolationsmethode Nächster Nachbar wie die Funktion tf.image.resize_images von TensorFlow. Es füllt nur das Originalbild mit wiederholten Kopien davon. Es tut mir leid, das ist nicht was ich will. Wie auch immer, danke trotzdem. – Kongsea

+0

sehe meine bearbeitete Antwort. –

+0

Ja, es funktioniert diesmal. Aber Ihr Programm hat eine ** for-Schleife ** verwendet, die sehr viel Zeit in Anspruch genommen hat, da unsere Bilddaten Hunderttausende von Bildern enthalten. Wenn die Bilddaten im Format float zwischen 0 und 1 skaliert wurden, wird ein Fehler angezeigt, der zeigt, dass das Format nicht unterstützt wurde. Wie auch immer, vielen Dank für Ihre freundliche Hilfe. – Kongsea

Verwandte Themen