
Usa cv2.vconcat(), cv2.hconcat() per concatenare (combinare) le immagini verticalmente e orizzontalmente con Python, OpenCV. v significato verticale eh significato orizzontale.
Passa un elenco di immagini (ndarray), viene restituita un’immagine (ndarray) in cui le immagini nell’elenco sono concatenate verticalmente o orizzontalmente. Le immagini con dimensioni diverse devono essere ridimensionate in anticipo. Viene generato un errore se la larghezza o l’altezza non sono allineate.
In questo articolo vengono descritti i seguenti contenuti con codici di esempio.
- Concatena verticalmente:
cv2.vconcat() - Concatena orizzontalmente:
cv2.hconcat() - Concatena verticalmente e orizzontalmente (come le piastrelle)
Leggi due immagini come esempio.
import cv2
import numpy as np
im1 = cv2.imread('data/src/lena.jpg')
im2 = cv2.imread('data/src/rocket.jpg')
numpy.tile() è utile quando si dispone la stessa immagine.
Per ulteriori informazioni sulla concatenazione delle immagini tramite Pillow e scikit-image, vedere gli articoli seguenti. Per immagini della stessa dimensione, scikit-image è facile da usare. Puoi anche aggiungere un bordo tra le immagini.
Concatena verticalmente:cv2.vconcat()
Concatena le immagini della stessa larghezza verticalmente
Quando si concatenano verticalmente immagini della stessa larghezza, cv2.vconcat() può essere utilizzato così com’è.
im_v = cv2.vconcat([im1, im1])
cv2.imwrite('data/dst/opencv_vconcat.jpg', im_v)

Ripeti la stessa immagine verticalmente
Puoi anche utilizzare disponi la stessa immagine np.tile()
im_v_np = np.tile(im1, (2, 1, 1))
cv2.imwrite('data/dst/opencv_vconcat_np.jpg', im_v_np)
Concatena le immagini di diverse larghezze verticalmente
È definire una funzione utile per combinare immagini di diverse larghezze. Qui, quello più grande viene ridimensionato.
forma[0] rappresenta l’altezza e forma[1] rappresenta la larghezza.
def vconcat_resize_min(im_list, interpolation=cv2.INTER_CUBIC):
w_min = min(im.shape[1] for im in im_list)
im_list_resize = [cv2.resize(im, (w_min, int(im.shape[0] * w_min / im.shape[1])), interpolation=interpolation)
for im in im_list]
return cv2.vconcat(im_list_resize)
im_v_resize = vconcat_resize_min([im1, im2, im1])
cv2.imwrite('data/dst/opencv_vconcat_resize.jpg', im_v_resize)

Le comprensioni degli elenchi vengono utilizzate per creare un elenco di immagini ridimensionate.
Concatena orizzontalmente:cv2.hconcat()
Il caso orizzontale è uguale allo stesso concetto del caso verticale.
Concatena le immagini della stessa altezza orizzontale
Quando si concatenano orizzontalmente immagini della stessa altezza, cv2.hconcat() può essere utilizzato così com’è.
im_h = cv2.hconcat([im1, im1])
cv2.imwrite('data/dst/opencv_hconcat.jpg', im_h)

Ripeti la stessa immagine in orizzontale
Puoi anche utilizzare disponi la stessa immagine np.tile()
im_h_np = np.tile(im1, (1, 2, 1))
cv2.imwrite('data/dst/opencv_hconcat_np.jpg', im_h_np)
Concatena orizzontale immagini di diverse altezze
Come per la concatenazione verticale, è utile definire una funzione per combinare immagini di dimensioni diverse. Qui, quello più grande viene ridimensionato.
def hconcat_resize_min(im_list, interpolation=cv2.INTER_CUBIC):
h_min = min(im.shape[0] for im in im_list)
im_list_resize = [cv2.resize(im, (int(im.shape[1] * h_min / im.shape[0]), h_min), interpolation=interpolation)
for im in im_list]
return cv2.hconcat(im_list_resize)
im_h_resize = hconcat_resize_min([im1, im2, im1])
cv2.imwrite('data/dst/opencv_hconcat_resize.jpg', im_h_resize)

Concatena verticalmente e orizzontalmente (come le piastrelle)
Concatena immagini della stessa dimensione verticalmente e orizzontalmente
Usando cv2.vconcat() e cv2.hconcat(), le immagini possono essere concatenate verticalmente e orizzontalmente sotto forma di tile.
Una funzione che concatena immagini della stessa dimensione con una lista 2D (array) può essere definita come segue:
def concat_tile(im_list_2d):
return cv2.vconcat([cv2.hconcat(im_list_h) for im_list_h in im_list_2d])
im1_s = cv2.resize(im1, dsize=(0, 0), fx=0.5, fy=0.5)
im_tile = concat_tile([[im1_s, im1_s, im1_s, im1_s],
[im1_s, im1_s, im1_s, im1_s],
[im1_s, im1_s, im1_s, im1_s]])
cv2.imwrite('data/dst/opencv_concat_tile.jpg', im_tile)

L’esempio utilizza la stessa immagine per semplicità, ma è utile quando si confrontano i risultati della modifica dei coefficienti di elaborazione dell’immagine.
Concatena le immagini verticalmente e orizzontalmente
Quando si dispone utilizzato la stessa immagine, np.tile() può essere come prima.
Quando si concatenano immagini a colori (3D ndarray), impostare il secondo parametro (ripetizioni) su (Numero di ripetitivo verticale、Numero di ripetitivo orizzontale、1). Per le immagini in scala di grigi (2D ndarray), impostare le ripetizioni su (n verticale, n orizzontale).
Vedere il seguente articolo per ulteriori informazioni su np.tile().
Concatena immagini di diverse dimensioni in riquadri verticali e orizzontali
Quando si concatenano immagini di dimensioni diverse in riquadri verticali e orizzontali, utilizzare la funzione di ridimensionamento e concatenazione definita sopra.
def concat_tile_resize(im_list_2d, interpolation=cv2.INTER_CUBIC):
im_list_v = [hconcat_resize_min(im_list_h, interpolation=cv2.INTER_CUBIC) for im_list_h in im_list_2d]
return vconcat_resize_min(im_list_v, interpolation=cv2.INTER_CUBIC)
im_tile_resize = concat_tile_resize([[im1],
[im1, im2, im1, im2, im1],
[im1, im2, im1]])
cv2.imwrite('data/dst/opencv_concat_tile_resize.jpg', im_tile_resize)

