将两个图像与OpenCV结合使用

Cer*_*rin 50 python opencv image-processing computer-vision

我正在尝试使用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()
Run Code Online (Sandbox Code Playgroud)

两个输入图像是:

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

生成的图像是:

在此输入图像描述

可能难以与网站的其余部分区分开,但大部分图像是白色的,对应于各个图像的位置.黑色区域是没有写入图像数据的地方.

为什么我的所有图像数据都转换为白色?

Mat*_*rty 103

对于图像大小相同的情况(这是显示图像处理结果的常见情况),您可以使用numpy的连接来简化代码.

垂直堆叠(img1 over img2):

vis = np.concatenate((img1, img2), axis=0)
Run Code Online (Sandbox Code Playgroud)

要水平堆叠(img2左侧的img1):

vis = np.concatenate((img1, img2), axis=1)
Run Code Online (Sandbox Code Playgroud)

核实:

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

  • 情况并非总是如此`ValueError:除了连接轴之外的所有输入数组维度都必须完全匹配` (4认同)
  • 我修复了复制粘贴错误.水平沿着轴1.你可以自己轻松尝试.我在响应中添加了验证码. (3认同)

Fac*_*alm 20

对于那些希望将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
Run Code Online (Sandbox Code Playgroud)


And*_*aev 15

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()
Run Code Online (Sandbox Code Playgroud)

或者如果您喜欢传统方式:

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()
Run Code Online (Sandbox Code Playgroud)

  • cv2.COLOR_GRAY2BGR在OpenCV 2.3中似乎不存在。此外,您还可以读取灰度图像,然后将其转换回RGB。所以您的结果将是灰度的,不是吗? (2认同)
  • 我们可以为彩色图像做这个吗? (2认同)

Var*_*wal 9

您还可以使用的OpenCV的内置功能cv2.hconcatcv2.vconcat它就像它们的名字被用于水平和垂直方向分别加入图像。

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()
Run Code Online (Sandbox Code Playgroud)

水平串联

水平的

垂直串联

垂直的

  • 快速提问,如何在一张图像需要占用 3/4 空间的位置水平连接? (2认同)

小智 7

为了水平堆叠:

imgHor = np.hstack((img, img))
Run Code Online (Sandbox Code Playgroud)

为了垂直堆叠:

imgVer = np.vstack((img, img))
Run Code Online (Sandbox Code Playgroud)

为了显示:

cv2.imshow("Horizontal", imgHor) # horizontal stack
cv2.imshow("Vertical", imgVer)   # vertical stack
Run Code Online (Sandbox Code Playgroud)