Skip to content

Creare un montaggio di immagini con Python, scikit-image (skimage.util.montage)

Python

Usando skimage.util.montage() di scikit-image, puoi creare un montaggio concatenando più immagini della stessa dimensione orizzontale e verticale.

In questo articolo vengono descritti i seguenti contenuti.

  • Utilizzo di base di skimage.util.montage()
  • Specificare il valore (colore) del riempimento e delle aree extra:fill
  • Specificare il layout:grid_shape
  • Specifica la larghezza dei bordi:padding_width
  • Applica alle immagini a colori (array 3D):multichannel

Per ulteriori informazioni sulla concatenazione di immagini utilizzando Pillow e OpenCV, vedere il seguente articolo. Questi articoli spiegano anche il caso di diverse dimensioni dell’immagine.

Nota che la versione di scikit-image in questo articolo è 0.16.2.

Utilizzo di base di skimage.util.montage()

I seguenti tre array bidimensionali (numpy.ndarray) della stessa forma vengono usati come esempi. Gli esempi che utilizzano immagini a colori (array 3D) sono descritti di seguito.

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]]

Passando un elenco di questi array al primo argomento di skimage.util.montage(), viene restituito un array concatenato verticalmente e orizzontalmente.

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 questo esempio, i tre array sono disposti in un layout 2 x 2, con l’area extra (in basso a destra) riempita con 129, il valore medio di tutti gli array. Il layout ei valori da compilare nell’area extra possono essere impostati con i parametri descritti di seguito.

In skimage.util.montage(), l’elenco di array viene elaborato come un numpy.ndarray di forma (K, M, N) costituito da K array con M righe e N colonne. Puoi specificarlo in quel modulo.

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]]

Se ogni array non ha la stessa forma, non può essere convertito in numpy.ndarray di (K, M, N) e viene generato un errore.

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)

Specificare il valore (colore) del riempimento e delle aree extra:fill

Per impostazione predefinita, l’area extra viene riempita con il valore medio di tutti gli array.

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

È possibile specificare un valore da compilare con il riempimento.

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]]

Specificare il layout:grid_shape

Per impostazione predefinita, si concatena in un quadrato con lo stesso numero di righe e colonne.

È possibile specificare un layout con grid_shape come tupla (numero di righe, numero di colonne).

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]]

Se il numero di righe * colonne è inferiore al numero di matrici, viene generato un errore.

# print(skimage.util.montage([a, b, c], grid_shape=(1, 2)))
# IndexError: list index out of range

Se il numero di righe * colonne è maggiore del numero di matrice, l’area extra viene riempita con il valore di riempimento. Come accennato in precedenza, per la funzione predefinita, viene riempito con il valore medio di tutti gli array.

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]]

Specifica la larghezza dei bordi:padding_width

Puoi specificare la larghezza dei bordi specificando padding_width. Il valore predefinito è padding_width=0, quindi non è presente alcun bordo.

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]]

Il bordo viene riempito anche con il valore di riempimento.

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]]

Applica alle immagini a colori (array 3D):multichannel

Le immagini a colori vengono trattate come array tridimensionali.

Per gestire array tridimensionali con skimage.util.montage(), impostare multicanale su 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)

Immagine originale:

lena

Risultato:

skimage.util.montage() predefinito

Si noti che il valore predefinito è multicanale=falso, quindi ometterlo risulterà in un errore.

# skimage.util.montage([a, b, c])
# ValueError: Input array has to be either 3- or 4-dimensional

Come puoi vedere dall’immagine del risultato sopra, per la previsione predefinita, l’area extra (in basso a destra) è riempita con il colore medio.

È possibile specificare qualsiasi colore di riempimento con una tupla di (R, G, B).

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() riempimento

L’utilizzo di grid_shape e padding_width è lo stesso degli array bidimensionali.

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() forma_griglia, larghezza_imbottitura