Skip to content

Concaténation d’images avec Python, OpenCV (hconcat, vconcat, np.tile)

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)

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

Python OpenCV concat v redimensionner

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)

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

Redimensionnement concat h Python OpenCV

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)

Tuile concat Python OpenCV

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)

Redimensionnement de la tuile concat Python OpenCV