
Mit skimage.util.montage() von scikit-image can SIE EINE MONTAGE ERSTELLEN, INDEM SIE MEHRERE BILDER GRÖßE DERSELBEN HORIZONTALEN UND VERKANTISCHEN VERKETTEN.
Dieser Artikel hat folgenden Inhalt.
- Grundlegende Verwendung von skimage.util.montage()
- Geben Sie den Wert (Farbe) der Polsterung und der zusätzlichen Bereiche an:
fill
- Legen Sie das Layout fest:
grid_shape
- Geben Sie die Breite der Ränder an:
padding_width
- Auf Farbbilder anwenden (3D-Array):
multichannel
Weitere Informationen zur Verkettung von Bildern mit Pillow und OpenCV finden Sie im following Artikel. Diese Artikel weisen auch den Herbst unterschiedlicher Bildgrößen aus.
Beachten Sie, dass die Version von scikit-image in diesem Artikel 0.16.2 ist.
Grundlegende Verwendung von skimage.util.montage()
Als Beispiele werden die following drei zweidimensionalen Arrays (numpy.ndarray) derselben Form used. Beispiele, die Farbbilder (3D-Arrays) verwenden, werden später beschrieben.
import numpy as np
import skimage.util
a = np.arange(1, 7).reshape(2, 3)
print(a)
# [[1 2 3]
# [4 5 6]]
b = a * 10
print(b)
# [[10 20 30]
# [40 50 60]]
c = a * 100
print(c)
# [[100 200 300]
# [400 500 600]]
Indem eine Liste dieser Arrays an das erste Argument von skimage.util.montage() übergeben wird, wird ein vertikal und horizontal verkettetes Array zurückgegeben.
m = skimage.util.montage([a, b, c])
print(m)
# [[ 1 2 3 10 20 30]
# [ 4 5 6 40 50 60]
# [100 200 300 129 129 129]
# [400 500 600 129 129 129]]
print(m.shape)
# (4, 6)
In diesem Beispiel sind die drei Arrays im 2 x 2-Layout angeordnet, wobei der zusätzliche Bereich (unten rechts) mit 129 gefüllt ist, dem Durchschnittswert aller Arrays. Das Layout und die Werte zum Ausfüllen des zusätzlichen Bereichs können mit den unten beschriebenen Parametern eingestellt werden.
In skimage.util.montage() wird die Liste der Arrays als numpy.ndarray der Form (K, M, N) verarbeitet, das aus K Arrays mit M Zeilen und N Spalten besteht. Sie können es in diesem Formular angeben.
abc = np.array([a, b, c])
print(abc)
# [[[ 1 2 3]
# [ 4 5 6]]
#
# [[ 10 20 30]
# [ 40 50 60]]
#
# [[100 200 300]
# [400 500 600]]]
print(abc.shape)
# (3, 2, 3)
print(skimage.util.montage(abc))
# [[ 1 2 3 10 20 30]
# [ 4 5 6 40 50 60]
# [100 200 300 129 129 129]
# [400 500 600 129 129 129]]
Wenn nicht jedes Array dieselbe Form hat, kann es nicht in numpy.ndarray von (K, M, N) konvertiert werden, und es wird ein Fehler ausgelöst.
d = a[:, :2]
print(d)
# [[1 2]
# [4 5]]
# skimage.util.montage([a, b, c, d])
# ValueError: could not broadcast input array from shape (2,3) into shape (2)
Geben Sie den Wert (Farbe) der Polsterung und der zusätzlichen Bereiche an:fill
Standardmäßig WIRD der zusätzliche Bereich mit dem Durchschnittswert aller Arrays gefüllt.
m = skimage.util.montage([a, b, c])
print(m)
# [[ 1 2 3 10 20 30]
# [ 4 5 6 40 50 60]
# [100 200 300 129 129 129]
# [400 500 600 129 129 129]]
print(np.mean(np.array([a, b, c])))
# 129.5
Sie können einen Wert angeben, der mit Füllung gefüllt werden soll.
print(skimage.util.montage([a, b, c], fill=0))
# [[ 1 2 3 10 20 30]
# [ 4 5 6 40 50 60]
# [100 200 300 0 0 0]
# [400 500 600 0 0 0]]
Legen Sie das Layout fest:grid_shape
Standardmäßig wird es zu einem quadratischen Layout mit der gleichen Anzahl von Zeilen und Spalten verkettet.
Sie können ein Layout mit grid_shape als Tupel (Anzahl Zeilen, Anzahl Spalten) angeben.
print(skimage.util.montage([a, b, c], grid_shape=(1, 3)))
# [[ 1 2 3 10 20 30 100 200 300]
# [ 4 5 6 40 50 60 400 500 600]]
print(skimage.util.montage([a, b, c], grid_shape=(3, 1)))
# [[ 1 2 3]
# [ 4 5 6]
# [ 10 20 30]
# [ 40 50 60]
# [100 200 300]
# [400 500 600]]
Wenn die Anzahl der Zeilen * Spalten kleiner als die Anzahl der Arrays ist, WIRD ein Fehler ausgelöst.
# print(skimage.util.montage([a, b, c], grid_shape=(1, 2)))
# IndexError: list index out of range
Wenn die Anzahl der Zeilen * Spalten größer ist als die Anzahl der Arrays, WIRD der zusätzliche Bereich mit dem Wert von gefüllt. Wie oben erwähnt, wird es standardmäßig mit dem Durchschnittswert aller Arrays gefüllt.
print(skimage.util.montage([a, b, c], grid_shape=(2, 3)))
# [[ 1 2 3 10 20 30 100 200 300]
# [ 4 5 6 40 50 60 400 500 600]
# [129 129 129 129 129 129 129 129 129]
# [129 129 129 129 129 129 129 129 129]]
print(skimage.util.montage([a, b, c], grid_shape=(2, 3), fill=0))
# [[ 1 2 3 10 20 30 100 200 300]
# [ 4 5 6 40 50 60 400 500 600]
# [ 0 0 0 0 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0]]
Geben Sie die Breite der Ränder an:padding_width
Sie können die Breite der Ränder angeben, ohne dass Sie padding_width angeben. Der Standardwert ist padding_width=0, es gibt auch keinen Rand.
print(skimage.util.montage([a, b, c], padding_width=1))
# [[129 129 129 129 129 129 129 129 129]
# [129 1 2 3 129 10 20 30 129]
# [129 4 5 6 129 40 50 60 129]
# [129 129 129 129 129 129 129 129 129]
# [129 100 200 300 129 129 129 129 129]
# [129 400 500 600 129 129 129 129 129]
# [129 129 129 129 129 129 129 129 129]]
Der Rahmen wird ebenfalls mit dem Wert von fill gefüllt.
print(skimage.util.montage([a, b, c], padding_width=1, fill=0))
# [[ 0 0 0 0 0 0 0 0 0]
# [ 0 1 2 3 0 10 20 30 0]
# [ 0 4 5 6 0 40 50 60 0]
# [ 0 0 0 0 0 0 0 0 0]
# [ 0 100 200 300 0 0 0 0 0]
# [ 0 400 500 600 0 0 0 0 0]
# [ 0 0 0 0 0 0 0 0 0]]
Auf Farbbilder anwenden (3D-Array):multichannel
Farbbilder werden als dreidimensionale Arrays behandelt.
Um dreidimensionale Arrays mit skimage.util.montage() zu handhaben, setzen Sie Multichannel auf True.
import skimage.io
import skimage.util
a = skimage.io.imread('data/src/lena.jpg')
print(a.shape)
# (225, 400, 3)
b = a // 2
c = a // 3
m = skimage.util.montage([a, b, c], multichannel=True)
print(m.shape)
# (450, 800, 3)
skimage.io.imsave('data/dst/skimage_montage_default.jpg', m)
Originalbild:
Ergebnis:
Beachten Sie, dass der Standardwert multichannel=False ist, sodass ein Weglassen zu einem Fehler führt.
# skimage.util.montage([a, b, c])
# ValueError: Input array has to be either 3- or 4-dimensional
Wie SIE dem obigen Ergebnisbild entnehmen können, ist der zusätzliche Bereich (unten rechts) standardmäßig mit der durchschnittlichen Farbe gefüllt.
Sie können jede beliebige Füllfarbe mit einem Tupel von (R, G, B) angeben.
m_fill = skimage.util.montage([a, b, c], fill=(255, 128, 0), multichannel=True)
skimage.io.imsave('data/dst/skimage_montage_fill.jpg', m_fill)
Die Verwendung von grid_shape und padding_width ist dieselbe wie für zweidimensionale Arrays.
m_1_3_pad = skimage.util.montage([a, b, c],
fill=(0, 0, 0),
grid_shape=(1, 3),
padding_width=10,
multichannel=True)
print(m_1_3_pad.shape)
# (245, 1240, 3)
skimage.io.imsave('data/dst/skimage_montage_1_3_pad.jpg', m_1_3_pad)