Skip to content

Erstellen einer Bildmontage mit Python, scikit-image (skimage.util.montage)

Python

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:

Lena

Ergebnis:

skimage.util.montage()-Standard

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)

skimage.util.montage() füllen

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)

skimage.util.montage() grid_shape, padding_width