Подтвердить что ты не робот

Объединение двух изображений с OpenCV

Я пытаюсь использовать OpenCV 2.1 для объединения двух изображений в один, причем два изображения расположены рядом друг с другом. В Python я делаю:

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()

Два входных изображения:

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

Результирующее изображение:

enter image description here

Это может быть трудно отличить от остальной части сайта, но большая часть изображения является белой, соответствующей тому, где должны быть отдельные изображения. Черная область - это то, где не было записано никаких данных изображения.

Почему все мои данные изображения преобразуются в белый?

4b9b3361

Ответ 1

В случаях, когда ваши изображения имеют одинаковый размер (это обычный случай для отображения результатов обработки изображений), вы можете использовать numpy concatenate для упрощения кода.

Чтобы стек вертикально (img1 над img2):

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

Чтобы стек горизонтально (img1 слева от img2):

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

Чтобы проверить:

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

Ответ 2

Для тех, кто хочет объединить 2 цветные изображения в один, это небольшой мотив ответа Андрея, который работал на меня:

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

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

#create empty matrix
vis = np.zeros((max(h1, h2), w1+w2,3), np.uint8)

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

Ответ 3

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()

или если вы предпочитаете устаревший способ:

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()

Ответ 4

Я пытаюсь объединить два изображения вместе, если их размеры равны. Кто-нибудь может мне помочь?

import PIL
from PIL import Image as img
x = img.open('index.jpg)
w1, h1 = x.size
print('Image 1 =',w1,'x',h1)

y = img.open('index2.jpg')
w2, h2 = y.size
print('Image 2 =',w1,'x',h1)

if x.size == y.size :
    print('Their size is equal.')
    height = max(h1,h2)
    width = w1 + w2
    z = img.new("RGB",(width,height))
    z.paste(x)
    #z.paste(y)
    z.show()

else:
    print('Their size is not equal.')

Что я могу сделать, чтобы вставить второе изображение рядом с первым изображением?