Ich versuche, einige JPEG-Bilder in Python horizontal zu kombinieren.
Problem
Ich habe 3 Bilder - jedes ist 148 x 95 - siehe Anhang. Ich habe gerade 3 Kopien desselben Bildes gemacht - deshalb sind sie gleich.
Mein Versuch
Ich versuche, sie mit dem folgenden Code horizontal zu verbinden:
import sys
from PIL import Image
list_im = ['Test1.jpg','Test2.jpg','Test3.jpg']
new_im = Image.new('RGB', (444,95)) #creates a new empty image, RGB mode, and size 444 by 95
for elem in list_im:
for i in xrange(0,444,95):
im=Image.open(elem)
new_im.paste(im, (i,0))
new_im.save('test.jpg')
Dies erzeugt jedoch die Ausgabe, die als angehängt ist test.jpg
.
Frage
Gibt es eine Möglichkeit, diese Bilder horizontal zu verketten, sodass in den Teilbildern in test.jpg kein zusätzliches Teilbild angezeigt wird?
zusätzliche Information
Ich suche nach einer Möglichkeit, n Bilder horizontal zu verketten. Ich möchte diesen Code allgemein verwenden, daher würde ich es vorziehen:
- Wenn möglich, Bildabmessungen nicht fest codieren
- Geben Sie die Abmessungen in einer Zeile an, damit sie leicht geändert werden können
for i in xrange(...)
in Ihrem Code ein? Sollten Sie sich nichtpaste
um die drei von Ihnen angegebenen Bilddateien kümmern?Antworten:
Sie können so etwas tun:
Test1.jpg
Test2.jpg
Test3.jpg
test.jpg
Das verschachtelte
for i in xrange(0,444,95):
Bild fügt jedes Bild fünfmal ein und ist 95 Pixel voneinander entfernt. Jede Iteration der äußeren Schleife wird über die vorherige eingefügt.quelle
x_offset = 0
- Ist dies die Staffelung zwischen Bildzentren? 2. Wie ändert sich Ihr Ansatz bei einer vertikalen Verkettung?x_offset
alsleft
. Verfolgen Sie bei vertikaler Konkation dasy-offset
, odertop
. Anstelle vonsum(widths)
undmax(height)
, dosum(heights)
undmax(widths)
und verwenden Sie das zweite Argument der 2-Tupel-Box. inkrementiereny_offset
umim.size[1]
.map
in Python3.6Ich würde das versuchen:
Es sollte funktionieren, solange alle Bilder von der gleichen Art sind (alle RGB, alle RGBA oder alle Graustufen). Es sollte nicht schwierig sein, sicherzustellen, dass dies bei einigen weiteren Codezeilen der Fall ist. Hier sind meine Beispielbilder und das Ergebnis:
Test1.jpg
Test2.jpg
Test3.jpg
Trifecta.jpg:
Trifecta_vertical.jpg
quelle
min_shape =....
undimgs_comb....
ändert sich für eine vertikale Verkettung? Könnten Sie das hier als Kommentar oder in Ihrer Antwort posten?hstack
zuvstack
.Image.resize
von PIL verwendet.min_shape
ist ein Tupel von (min_width, min_height) und(np.asarray( i.resize(min_shape) ) for i in imgs )
verkleinert dann alle Bilder auf diese Größe. In der Tatmin_shape
kann jeder sein, den(width,height)
Sie wünschen, denken Sie daran, dass das Vergrößern von Bildern mit niedriger Auflösung sie verschwimmen lässt!Bearbeiten: Die Antwort von DTing ist besser auf Ihre Frage anwendbar, da PIL verwendet wird. Ich lasse dies jedoch für den Fall, dass Sie wissen möchten, wie es in Numpy geht.
Hier ist eine Numpy / Matplotlib-Lösung, die für N Bilder (nur Farbbilder) jeder Größe / Form funktionieren sollte.
Hier ist ein Beispiel:
quelle
output = concat_images(output, ...
gesucht, als ich nach einem Weg suchte, dies zu tun. Vielen Dank.Basierend auf der Antwort von DTing habe ich eine Funktion erstellt, die einfacher zu verwenden ist:
Es ermöglicht die Auswahl einer Hintergrundfarbe und Bildausrichtung. Es ist auch einfach, eine Rekursion durchzuführen:
quelle
Hier ist eine Funktion, die frühere Ansätze verallgemeinert und ein Bildraster in PIL erstellt:
Dadurch werden alle Zeilen und Spalten des Rasters auf ein Minimum verkleinert. Sie können nur eine Zeile mit pil_grid (Bilder) oder nur eine Spalte mit pil_grid (Bilder, 1) haben.
Ein Vorteil der Verwendung von PIL gegenüber auf Numpy-Arrays basierenden Lösungen besteht darin, dass Sie mit unterschiedlich strukturierten Bildern (wie Graustufen- oder Palettenbildern) umgehen können.
Beispielausgaben
pil_grid(dummy_images)
::pil_grid(dummy_images, 3)
::pil_grid(dummy_images, 1)
::quelle
h_sizes, v_sizes = [0] * n_horiz, [0] * (n_images // n_horiz)
sollte lauten:h_sizes, v_sizes = [0] * n_horiz, [0] * ((n_images // n_horiz) + (1 if n_images % n_horiz > 0 else 0))
Grund: Wenn die horizontale Breite die Anzahl der Bilder nicht in Ganzzahlen teilt, müssen Sie die zusätzliche, wenn auch unvollständige Zeile berücksichtigen.Wenn alle Bildhöhen gleich sind,
Vielleicht können Sie die Größe von Bildern vor der Verkettung wie folgt ändern:
quelle
Hier ist meine Lösung:
Für diese Bilder:
Die Ergebnisse sehen folgendermaßen aus:
quelle
quelle
Ausgabe
quelle
Fügen Sie einfach die bereits vorgeschlagenen Lösungen hinzu. Nimmt die gleiche Höhe an, keine Größenänderung.
quelle
Meine Lösung wäre:
quelle