Ich möchte ein Bild aufnehmen und den Maßstab des Bildes ändern, während es sich um ein Numpy-Array handelt.
Zum Beispiel habe ich dieses Bild einer Coca-Cola-Flasche: Flasche-1
Was sich in einer Reihe von Formen niederschlägt, (528, 203, 3)
und ich möchte die Größe ändern, um die Größe dieses zweiten Bildes zu sagen:
Flasche-2
Welches hat eine Form von (140, 54, 3)
.
Wie ändere ich die Größe des Bildes in eine bestimmte Form, während das Originalbild beibehalten wird? Andere Antworten schlagen vor, jede zweite oder dritte Zeile zu entfernen, aber ich möchte das Bild im Grunde so verkleinern, wie Sie es über einen Bildeditor tun würden, jedoch in Python-Code. Gibt es Bibliotheken, um dies in numpy / SciPy zu tun?
Antworten:
Ja, Sie können installieren
opencv
(dies ist eine Bibliothek, die für die Bildverarbeitung und Computer Vision verwendet wird) und diecv2.resize
Funktion verwenden. Und zum Beispiel verwenden:Hier
img
ist also ein Numpy-Array, das das Originalbild enthält, währendres
ein Numpy-Array das verkleinerte Bild enthält. Ein wichtiger Aspekt ist derinterpolation
Parameter: Es gibt verschiedene Möglichkeiten, die Größe eines Bildes zu ändern. Zumal Sie das Bild verkleinern und die Größe des Originalbilds nicht ein Vielfaches der Größe des Bildes mit geänderter Größe beträgt . Mögliche Interpolationsschemata sind:Wie bei den meisten Optionen gibt es keine "beste" Option in dem Sinne, dass es für jedes Größenänderungsschema Szenarien gibt, in denen eine Strategie einer anderen vorgezogen werden kann.
quelle
dsize
sollte,dsize=(54, 140)
wie es x dann y braucht, wobei ein numpy Array die Form als y dann x zeigt (y ist die Anzahl der Zeilen und x ist die Anzahl der Spalten)skimage.io.imread('image.jpg')
undskimage.transform.resize(img)
. scikit-image.org/docs/dev/install.htmlMöglicherweise kann dazu nur numpy verwendet werden, der Vorgang ist jedoch nicht integriert. Das heißt, Sie können
scikit-image
diese Art der Bildmanipulation verwenden (die auf Numpy basiert).Scikit-Bild Umskalierungs Dokumentation ist hier .
Mit Ihrem Bild können Sie beispielsweise Folgendes tun:
Dies erledigt für Sie Dinge wie Interpolation, Anti-Aliasing usw.
quelle
anti_aliasing
Flagge bekomme, sieht es so aus, als ob sie aus der neuesten Version von 0.13.1 entfernt wurdeFür Leute, die von Google hierher kommen und nach einer schnellen Möglichkeit suchen, Bilder in
numpy
Arrays zur Verwendung in Anwendungen für maschinelles Lernen herunterzusampeln, ist hier eine superschnelle Methode (angepasst von hier ). Diese Methode funktioniert nur, wenn die Eingabedimensionen ein Vielfaches der Ausgabedimensionen sind.In den folgenden Beispielen wird das Beispiel von 128 x 128 auf 64 x 64 heruntergerechnet (dies kann leicht geändert werden).
Letzte Bestellung der Kanäle
Erstbestellung der Kanäle
Für Graustufenbilder nur um die Änderung
3
zu einem1
wie folgt aus :Erstbestellung der Kanäle
Diese Methode verwendet das Äquivalent von max Pooling. Es ist der schnellste Weg, den ich gefunden habe.
quelle
np.repeat(np.repeat(a, 2, axis=0), 2, axis=1)
Wenn jemand hierher gekommen ist, um nach einer einfachen Methode zum Skalieren / Ändern der Größe eines Bilds in Python zu suchen, ohne zusätzliche Bibliotheken zu verwenden, ist hier eine sehr einfache Funktion zum Ändern der Bildgröße:
Anwendungsbeispiel: Ändern der Größe eines (30 x 30) Bilds auf (100 x 200):
Ausgabe:
Dies funktioniert zum Verkleinern / Skalieren von Bildern und funktioniert gut mit numpy Arrays.
quelle
Die SciPy-
imresize()
Methode war eine andere Methode zur Größenänderung, wird jedoch ab SciPy v 1.3.0 entfernt. SciPy bezieht sich auf die PIL- Bildgrößenänderungsmethode:Image.resize(size, resample=0)
Größe - Die angeforderte Größe in Pixel als 2-Tupel: (Breite, Höhe).
Resample - Ein optionaler Resampling-Filter. Dies kann PIL.Image.NEAREST (nächster Nachbar verwenden), PIL.Image.BILINEAR (lineare Interpolation), PIL.Image.BICUBIC (kubische Spline-Interpolation) oder PIL.Image.LANCZOS (ein qualitativ hochwertiges Downsampling-Filter) sein ). Wenn es weggelassen wird oder wenn das Bild den Modus "1" oder "P" hat, wird PIL.Image.NEAREST gesetzt.
Link hier: https://pillow.readthedocs.io/en/3.1.x/reference/Image.html#PIL.Image.Image.resize
quelle
Sicher. Sie können dies ohne OpenCV, Scikit-Image oder PIL tun.
Bei der Bildgrößenänderung werden im Wesentlichen die Koordinaten jedes Pixels vom Originalbild auf seine Größenänderungsposition abgebildet.
Da die Koordinaten eines Bildes Ganzzahlen sein müssen (stellen Sie es sich als Matrix vor), sollten Sie den Pixelwert interpolieren, um ihn an die Ganzzahlposition anzunähern, wenn die zugeordnete Koordinate Dezimalwerte aufweist (z. B. ist es bekannt, das nächste Pixel zu dieser Position zu ermitteln als Interpolation des nächsten Nachbarn ).
Sie benötigen lediglich eine Funktion, die diese Interpolation für Sie ausführt. SciPy hat
interpolate.interp2d
.Sie können damit die Größe eines Bilds in einem numpy-Array
arr
wie folgt ändern :Wenn Ihr Bild RGB ist, müssen Sie natürlich die Interpolation für jeden Kanal durchführen.
Wenn Sie mehr verstehen möchten, empfehle ich Ihnen , sich Resizing Images - Computerphile anzusehen .
quelle
quelle
cv2
eine ordnungsgemäße Größenänderungsfunktion verwendet und verwendet, einen Mehrwert bietet, anstatt eine "suboptimale" Größenänderungsfunktion erneut zu implementieren, die schlechter abschneidet als die Interpolation des nächsten Nachbarn.