
Utilisez cv2.vconcat(), cv2.hconcat() pour concaténer (combiner) des images verticalement et horizontalement avec Python, OpenCV. v signifie vertical et h signifie horizontal.
Passez une liste d’images (ndarray), une image (ndarray) dans laquelle les images de la liste sont concaténées verticalement ou horizontalement est renvoyée. Les images de tailles différentes doivent être redimensionnées au préalable. Une erreur est générée si la largeur ou la hauteur n’est pas alignée.
Cet article décrit le contenu suivant avec des exemples de codes.
- Concaténer verticalement :
cv2.vconcat()
- Concaténer horizontalement :
cv2.hconcat()
- Concaténer verticalement et horizontalement (comme des tuiles)
Lisez deux images à titre d’exemple.
import cv2
import numpy as np
im1 = cv2.imread('data/src/lena.jpg')
im2 = cv2.imread('data/src/rocket.jpg')
numpy.tile() est pratique pour organiser la même image à plusieurs reprises.
Pour plus d’informations sur la concaténation d’images à l’aide de Pillow et scikit-image, consultez les articles suivants. Pour des images de même taille, scikit-image est facile à utiliser. Vous pouvez également ajouter une bordure entre les images.
Concaténer verticalement :cv2.vconcat()
Concaténer verticalement des images de même largeur
Lors de la concaténation verticale d’images de même largeur, cv2.vconcat() peut être utilisé tel quel.
im_v = cv2.vconcat([im1, im1])
cv2.imwrite('data/dst/opencv_vconcat.jpg', im_v)
Répéter la même image verticalement
Vous pouvez également utiliser np.tile() si vous organisez la même image à plusieurs reprises.
im_v_np = np.tile(im1, (2, 1, 1))
cv2.imwrite('data/dst/opencv_vconcat_np.jpg', im_v_np)
Concaténer verticalement des images de différentes largeurs
Il est utile de définir une fonction pour combiner des images de différentes largeurs. Ici, le plus grand est redimensionné.
shape[0] représente la hauteur et shape[1] représente la largeur.
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)
Les compréhensions de liste sont utilisées pour créer une liste d’images redimensionnées.
Concaténer horizontalement :cv2.hconcat()
Le cas horizontal est fondamentalement le même concept que le cas vertical.
Concaténer horizontalement des images de même hauteur
Lors de la concaténation horizontale d’images de même hauteur, cv2.hconcat() peut être utilisé tel quel.
im_h = cv2.hconcat([im1, im1])
cv2.imwrite('data/dst/opencv_hconcat.jpg', im_h)
Répéter la même image horizontalement
Vous pouvez également utiliser np.tile() si vous organisez la même image à plusieurs reprises.
im_h_np = np.tile(im1, (1, 2, 1))
cv2.imwrite('data/dst/opencv_hconcat_np.jpg', im_h_np)
Concaténer des images de différentes hauteurs horizontalement
Comme pour la concaténation verticale, il est utile de définir une fonction pour combiner des images de tailles différentes. Ici, le plus grand est redimensionné.
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)
Concaténer verticalement et horizontalement (comme des tuiles)
Concaténer des images de même taille verticalement et horizontalement
En utilisant cv2.vconcat() et cv2.hconcat(), les images peuvent être concaténées verticalement et horizontalement sous forme de mosaïque.
Une fonction qui concatène des images de même taille avec une liste 2D (tableau) peut être définie comme suit :
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’exemple utilise la même image pour plus de simplicité, mais il est utile lors de la comparaison des résultats de la modification des coefficients de traitement d’image.
Concaténer les mêmes images verticalement et horizontalement
Lors de l’arrangement répété de la même image, np.tile() peut être utilisé comme avant.
Lors de la concaténation d’images couleur (ndarray 3D), définissez le deuxième paramètre (reps) sur (nombre de répétitions verticales、nombre de répétitions horizontales、1). Pour les images en niveaux de gris (ndarray 2D), définissez les répétitions sur (n vertical, n horizontal).
Consultez l’article suivant pour plus d’informations sur np.tile().
Concaténer des images de différentes tailles dans des tuiles verticales et horizontales
Lors de la concaténation d’images de tailles différentes dans des mosaïques verticales et horizontales, utilisez la fonction de redimensionnement et de concaténation définie ci-dessus.
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)