Skip to content

Concatenare immagini con Python, OpenCV (hconcat, vconcat, np.tile)

Python

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)

Python OpenCV concat 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)

Python OpenCV concat v ridimensiona

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)

Python OpenCV concat 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)

Python OpenCV concat h ridimensiona

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)

Riquadro concat Python OpenCV

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)

Ridimensionamento del riquadro concat Python OpenCV