OpenCV 合并图像
本教程将讨论在 Python 中使用 Python 的 NumPy 的 concatenate()
函数组合两个图像。
在 Python 中使用 NumPy 的 concatenate()
函数组合图像
我们可以使用 OpenCV 的 imread()
函数读取图像并将它们存储在矩阵中。我们可以使用 NumPy 的 concatenate()
函数来连接沿不同轴的图像矩阵。
例如,让我们使用 NumPy 的 zeros()
函数创建两个不同颜色的图像,然后使用 concatenate()
函数将它们水平组合。请参阅下面的代码。
import cv2
import numpy as np
img_1 = np.zeros((312,312,3), dtype=np.uint8)
img_1[:,:] = (255,0,0)
img_2 = np.zeros((312,312,3), dtype=np.uint8)
img_2[:,:] = (0,255,0)
img_3 = np.concatenate((img_1,img_2), axis=1)
cv2.imshow('Img_1',img_1)
cv2.imshow('Img_2',img_2)
cv2.imshow('Img_3',img_3)
cv2.waitKey(0)
输出:
请注意,concatenate()
函数仅在两个图像具有相同大小时才有效。concatenate()
函数的第一个参数包含我们想要组合的图像。
我们只使用了两个图像,但我们可以使用尽可能多的图像,concatenate()
函数会将它们组合起来。axis
参数指定图像组合的方向。
我们水平组合了上面的图像,但我们也可以使用 axis=0
参数垂直组合它们。上面的代码只会合并大小相同的图片,如果我们尝试合并不同大小的图片会报错。
在 Python 中组合不同大小的图像
我们还可以组合两个不同大小的图像。
例如,要水平组合两个不同大小的图像,我们必须创建一个空白图像,其高度将等于两个给定图像的最大高度,宽度等于给定图像的组合宽度。
我们可以使用 shape
属性来获取给定图像的高度和宽度,我们将使用它们来创建空白图像。创建空白图像后,我们可以给它一个我们自己选择的颜色。
之后,我们必须用给定图像的像素替换空白图像像素。例如,我们先添加第一张图片,然后再添加第二张图片。
如果其中一个图像与另一个图像相比较小,则空白图像的其余部分将具有我们定义的相同颜色。例如,让我们将水果图像与猫图像结合起来。
请参阅下面的代码。
import cv2
import numpy as np
img_1 = cv2.imread('fruit.jpg')
img_2 = cv2.imread('cat.jpg')
h1, w1 = img_1.shape[:2]
h2, w2 = img_2.shape[:2]
img_3 = np.zeros((max(h1, h2), w1+w2,3), dtype=np.uint8)
img_3[:,:] = (255,255,255)
img_3[:h1, :w1,:3] = img_1
img_3[:h2, w1:w1+w2,:3] = img_2
cv2.imshow('Img_1',img_1)
cv2.imshow('Img_2',img_2)
cv2.imshow('Img_3',img_3)
cv2.waitKey(0)
输出:
上面的代码会横向添加两张不同大小的图片,但我们也可以更改代码为纵向添加两张图片。我们必须先改变空白图像的形状。
在 Python 中垂直组合图像
在上面的代码中,我们将高度指定为两个图像的最大高度,宽度等于两个图像的组合宽度。
如果我们想垂直组合图像,我们必须创建一个空白图像,其高度等于两个图像的组合高度,宽度等于两个图像的最大宽度。之后,我们还必须更改第二张图像在空白图像上的位置。
在上面的代码中,我们添加了从第一张图像的宽度开始水平位置的第二张图像,但是在这种情况下,我们将从第一张图像的高度开始添加图像。例如,让我们将上面的两个图像垂直组合。
请参阅下面的代码。
import cv2
import numpy as np
img_1 = cv2.imread('fruit.jpg')
img_2 = cv2.imread('cat.jpg')
h1, w1 = img_1.shape[:2]
h2, w2 = img_2.shape[:2]
img_3 = np.zeros((h1+h2, max(w1,w2),3), dtype=np.uint8)
img_3[:,:] = (255,255,255)
img_3[:h1, :w1,:3] = img_1
img_3[h1:h1+h2, :w2,:3] = img_2
cv2.imshow('Img_1',img_1)
cv2.imshow('Img_2',img_2)
cv2.imshow('Img_3',img_3)
cv2.waitKey(0)
输出:
我们可以在上面的输出中看到两个图像是垂直组合的。