101 votes

Combinaison de deux images avec OpenCV

Je suis en train d'essayer d'utiliser OpenCV 2.1 pour combiner deux images en une seule, avec les deux images placées côte à côte. En Python, je fais :

import numpy as np, cv

img1 = cv.LoadImage(fn1, 0)
img2 = cv.LoadImage(fn2, 0)

h1, w1 = img1.height, img1.width
h2, w2 = img2.height, img2.width

# Créer un tableau assez grand pour contenir les deux images côte à côte.
vis = np.zeros((max(h1, h2), w1+w2), np.float32)

mat1 = cv.CreateMat(img1.height, img1.width, cv.CV_32FC1)
cv.Convert(img1, mat1)

mat2 = cv.CreateMat(img2.height, img2.width, cv.CV_32FC1)
cv.Convert(img2, mat2)

# Copier les deux images dans l'image composite.
vis[:h1, :w1] = mat1
vis[:h2, w1:w1+w2] = mat2

h, w = vis.shape
vis2 = cv.CreateMat(h, w, cv.CV_32FC3)
vis0 = cv.fromarray(vis)
cv.CvtColor(vis0, vis2, cv.CV_GRAY2BGR)
cv.ShowImage('test', vis2)
cv.WaitKey()

Les deux images d'entrée sont :

https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/c/box.png?rev=2270

https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/c/box_in_scene.png?rev=2270

L'image résultante est :

entrez la description de l'image ici

Il peut être difficile de la distinguer du reste du site, mais la plupart de l'image est blanche, correspondant à l'endroit où les images individuelles devraient être. La zone noire est là où aucune donnée d'image n'a été écrite.

Pourquoi toutes mes données d'image sont-elles converties en blanc ?

179voto

Matt Liberty Points 91

Pour les cas où vos images sont de la même taille (ce qui est un cas courant pour afficher les résultats du traitement d'images), vous pouvez utiliser la fonction concatenate de numpy pour simplifier votre code.

Pour empiler verticalement (img1 au-dessus de img2) :

vis = np.concatenate((img1, img2), axis=0)

Pour empiler horizontalement (img1 à gauche de img2) :

vis = np.concatenate((img1, img2), axis=1)

Pour vérifier :

import cv2
import numpy as np
img1 = cv2.imread('img1.png')
img2 = cv2.imread('img2.png')
vis = np.concatenate((img1, img2), axis=1)
cv2.imwrite('out.png', vis)

L'image out.png contiendra img1 à gauche et img2 à droite.

45voto

FacePalm Points 2369

Pour ceux qui cherchent à combiner 2 images en couleurs en une seule, voici une légère modification de la réponse d'Andrey qui a fonctionné pour moi :

img1 = cv2.imread(imageFile1)
img2 = cv2.imread(imageFile2)

h1, w1 = img1.shape[:2]
h2, w2 = img2.shape[:2]

# créer une matrice vide
vis = np.zeros((max(h1, h2), w1+w2,3), np.uint8)

# combiner 2 images
vis[:h1, :w1,:3] = img1
vis[:h2, w1:w1+w2,:3] = img2

24voto

Vardan Agarwal Points 1593

Vous pouvez également utiliser les fonctions intégrées d'OpenCV cv2.hconcat et cv2.vconcat qui, comme leur nom l'indique, sont utilisées pour joindre les images horizontalement et verticalement respectivement.

import cv2

img1 = cv2.imread('opencv/lena.jpg')
img2 = cv2.imread('opencv/baboon.jpg')

v_img = cv2.vconcat([img1, img2])
h_img = cv2.hconcat([img1, img2])

cv2.imshow('Horizontal', h_img)
cv2.imshow('Vertical', v_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Concaténation horizontale

Horizontal

Concaténation verticale

Vertical

22voto

Andrey Kamaev Points 14888
import numpy as np, cv2

img1 = cv2.imread(fn1, 0)
img2 = cv2.imread(fn2, 0)
h1, w1 = img1.shape[:2]
h2, w2 = img2.shape[:2]
vis = np.zeros((max(h1, h2), w1+w2), np.uint8)
vis[:h1, :w1] = img1
vis[:h2, w1:w1+w2] = img2
vis = cv2.cvtColor(vis, cv2.COLOR_GRAY2BGR)

cv2.imshow("test", vis)
cv2.waitKey()

ou si vous préférez la méthode héritée :

import numpy as np, cv

img1 = cv.LoadImage(fn1, 0)
img2 = cv.LoadImage(fn2, 0)

h1, w1 = img1.height,img1.width
h2, w2 = img2.height,img2.width
vis = np.zeros((max(h1, h2), w1+w2), np.uint8)
vis[:h1, :w1] = cv.GetMat(img1)
vis[:h2, w1:w1+w2] = cv.GetMat(img2)
vis2 = cv.CreateMat(vis.shape[0], vis.shape[1], cv.CV_8UC3)
cv.CvtColor(cv.fromarray(vis), vis2, cv.CV_GRAY2BGR)

cv.ShowImage("test", vis2)
cv.WaitKey()

7voto

Mayura Pavan Points 1

Pour empiler horizontalement :

imgHor = np.hstack((img, img))

Pour empiler verticalement :

imgVer = np.vstack((img, img))

Pour afficher :

cv2.imshow("Horizontal", imgHor) # empiler horizontalement
cv2.imshow("Vertical", imgVer)   # empiler verticalement

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X