Scipy drehen und Zoomen eines Bildes ohne änderung der Abmessungen
Für mein neuronales Netz ich möchte ergänzen meine Ausbildung Daten, indem Sie kleine zufällige Rotationen und zooms zu meinen Bildern. Das Problem, das ich habe ist, dass scipy ist die änderung der Größe meiner Bilder, wenn es gilt, die Drehungen und zooms. Ich muss, um einfach befestigen Sie die Kanten aus, wenn ein Teil des Bildes geht out of bounds. Alle meine Bilder müssen die gleiche Größe haben.
def loadImageData(img, distort = False):
c, fn = img
img = scipy.ndimage.imread(fn, True)
if distort:
img = scipy.ndimage.zoom(img, 1 + 0.05 * rnd(), mode = 'constant')
img = scipy.ndimage.rotate(img, 10 * rnd(), mode = 'constant')
print(img.shape)
img = img - np.min(img)
img = img / np.max(img)
img = np.reshape(img, (1, *img.shape))
y = np.zeros(ncats)
y[c] = 1
return (img, y)
InformationsquelleAutor chasep255 | 2016-05-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
scipy.ndimage.drehen
akzeptiert einereshape=
parameter:Also auf "clip" die Ränder können Sie einfach anrufen
scipy.ndimage.rotate(img, ..., reshape=False)
.Dinge sind komplizierter,
scipy.ndimage.zoom
.Eine naive Methode wäre, um
zoom
die gesamte Eingabe-array, dann verwenden Sie die slice-Indizierung und/oder zero-padding, um die Ausgabe die gleiche Größe wie Ihre Eingabe. In Fällen, in denen Sie die Erhöhung der Größe des Bildes, es ist verschwenderisch zu interpolieren die Pixel, die sind nur noch abgeschnitten an den Rändern sowieso.Stattdessen können Sie index nur den Teil der Eingabe, die fallen innerhalb der Grenzen des Ausgabe-array, bevor Sie sich bewerben
zoom
:Beispiel:
scipy.ndimage.zoom
ist zu langsam (keine Ahnung warum), sodass Ihre Funktion braucht ~500ms für einen (480,640) BildVielleicht spline-interpolation verursacht die Verlangsamung. Auch das zoom-center ist rechts unten für zoom-in und zentrieren für zoom-out, das ist verwirrend. Ich würde verwenden cv2.Größe statt
das zoom-center ist rechts unten für zoom-in und zentrieren für zoom-out, das ist verwirrend." - Zoomen sollte etwa in der Mitte des Bildes, aber es war ein bug in der Art, wie ich war, das berechnen der bounding box des vergrößerten Bereich, wenn
zoom_factor > 1
, die habe ich jetzt behoben.clipped_zoom
propagiert keyword-Argumente zuscipy.ndimage.zoom
, so können Sie gebenorder=0
wenn kubische spline-interpolation ist zu langsam. Ich bezweifle nicht, dasscv2.resize
ist schneller, aber OpenCV ist eine schwere Abhängigkeit und OP war die bitte für einen scipy-basierte Lösung.vielen Dank für die Klarstellung. Re: Laufzeit, in meiner Antwort unten habe ich schnell ein Benchmark order=3 order=0 und es ist noch viel langsamer. Vereinbart, dass die Frage in Erster Linie auf Scipy, aber es denke, es ist nicht eine Einschränkung, nicht zu verwenden, besser cv2.
InformationsquelleAutor ali_m
Empfehle ich
cv2.resize
da es weit schneller alsscipy.ndimage.zoom
, wahrscheinlich wegen der Unterstützung für einfacheren Interpolationsmethoden.Für ein 480x640 Bild :
cv2.resize
dauert ~2 msscipy.ndimage.zoom
braucht ~500 msscipy.ndimage.zoom(...,order=0)
braucht ~175msWenn Sie die data augmentation "on the fly" wird dieser Betrag von speedup ist von unschätzbarem Wert, weil es bedeutet, mehr Experimente in kürzerer Zeit.
Hier ist eine version von
clipped_zoom
mitcv2.resize
InformationsquelleAutor MohamedEzz