Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combining Two Images with OpenCV

I'm trying to use OpenCV 2.1 to combine two images into one, with the two images placed adjacent to each other. In Python, I'm doing:

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  # Create an array big enough to hold both images next to each other. 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 )  # Copy both images into the composite image. 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() 

The two input images are:

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

The resulting image is:

enter image description here

It may be hard to distinguish from the rest of the site, but most of the image is white, corresponding to where the individual images should be. The black area is where no image data was written.

Why is all my image data being converted to white?

like image 665
Cerin Avatar asked Sep 28 '11 20:09

Cerin


People also ask

How do I combine two images in OpenCV?

We can use the concatenate() function of NumPy to concatenate the matrices of the images along different axes. For example, let's use the zeros() function of NumPy to create two images with different colors and then combine them horizontally using the concatenate() function.

How do I blend images in OpenCV?

Like before, we start by importing the cv2 module, followed by reading both images and resizing them to be 400×400. We will then display the second image in a window called “blend“. It will be the one we will use every time we update the weights to display the resulting image.


1 Answers

For cases where your images happen to be the same size (which is a common case for displaying image processing results), you can use numpy's concatenate to simplify your code.

To stack vertically (img1 over img2):

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

To stack horizontally (img1 to the left of img2):

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

To verify:

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) 

The out.png image will contain img1 on the left and img2 on the right.

like image 183
Matt Liberty Avatar answered Oct 13 '22 03:10

Matt Liberty