Python拼接长图:如何使用OpenCV连接图像?

2021年11月7日19:48:45 发表评论 1,421 次浏览

介绍

在本教程中,我们将学习如何使用 Python 和 OpenCV 水平和垂直连接图像。

重要提示:Python如何拼接长图?为简单起见,我们将在下面的Python拼接长图代码示例中将图像与其自身连接起来。尽管如此,只要我们尊重以下几点,就可以连接不同的图像:

  • 图像尺寸只能沿串联轴(水平或垂直,取决于我们使用的串联函数)不同。在本教程中,我们不会介绍调整图像大小以符合此限制;
  • 通道数必须相同。因此,我们不能在不进行一些额外操作的情况下将 BGR 图像与灰度图像连接起来(如下所述)。

本教程使用OpenCV 4.0.0版和 Python 3.7.2版进行了测试。

如何使用OpenCV连接图像?附加图像

我们将首先导入numpycv2模块。我们将需要numpy来执行图像的附加和cv2来读取原始图像,然后显示最终结果。

import numpy
import cv2 

在此之后,我们将负责读取我们将用于进行连接的原始图像。对于这个初始示例,我们将把图像与其自身连接起来。

Python拼接长图:要读取图像,我们只需要调用cv2模块的imread函数,将带有文件系统中图像路径的字符串作为输入传递。

img = cv2.imread('C:/Users/N/Desktop/Test.jpg') 

请注意,正如我们在之前的教程中所见,imread函数返回的图像表示为ndarray。这意味着我们可以使用许多numpy函数来操作它。

考虑到这一点,我们将使用numpy模块中的vstack函数将图像与其自身垂直附加。

作为输入,此函数接收一个元组,其中包含我们要连接的ndarray。因此,我们将在第一个和第二个位置传递一个包含我们的图像的元组。作为输出,我们将收到一个带有结果的新ndarray,它对应于垂直连接的两个图像。

verticalAppendedImg = numpy.vstack((img,img))

我们也可以通过调用hstack函数来水平执行这种连接。参数是相同的:一个包含我们想要连接的 ndarray 的元组。为了说明,我们的元组将包含图像三次,以确认我们每次可以连接多个图像。

horizontalAppendedImg = numpy.hstack((img,img,img))

最后,我们将在两个不同的窗口中显示两个图像。

cv2.imshow('Vertical Appended', verticalAppendedImg)
cv2.imshow('Horizontal Appended', horizontalAppendedImg)
 
cv2.waitKey(0)
cv2.destroyAllWindows(

如何使用OpenCV连接图像?完整的代码可以在下面看到。

import numpy
import cv2 
 
img = cv2.imread('C:/Users/N/Desktop/Test.jpg') 
 
verticalAppendedImg = numpy.vstack((img,img))
horizontalAppendedImg = numpy.hstack((img,img,img))
 
 
cv2.imshow('Vertical Appended', verticalAppendedImg)
cv2.imshow('Horizontal Appended', horizontalAppendedImg)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

Python如何拼接长图?测试代码

要测试代码,只需使用你选择的工具运行它。我正在使用 IDLE,一个 Python IDE。

图 1 说明了水平附加图像的预期结果。

Python拼接长图:如何使用OpenCV连接图像?
图 1 – 水平附加的图像。

图 2 显示了垂直附加的图像。

Python拼接长图:如何使用OpenCV连接图像?
图 2 – 垂直附加的图像。

Python拼接长图:附加 BGR 和灰度图像

附加的一种可能应用可能是将原始图像与经过某种处理的图像并排显示,并且很多时候我们以灰度处理图像。

如果我们尝试在 RBG 中附加一张灰度图像,那么hstackvstack函数都会抛出错误。发生这种情况是因为两个 ndarray 具有不同的维度(BGR 图像有 3 个维度,灰度图像有 2 个维度)。

为了能够执行这种连接,我们需要将灰度图像转换回 BGR 颜色空间。我们将在下面检查如何做到这一点。

所以,和以前一样,我们从导入numpycv2 开始。然后,我们将读取图像并将其转换为灰度。有关如何将图像转换为灰度的详细教程,请查看本教程。

import numpy
import cv2 
 
img = cv2.imread('C:/Users/N/Desktop/Test.jpg') 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

如何使用OpenCV连接图像?现在我们有了灰度图像,要将其转换回 BGR 颜色空间,我们可以再次调用cvtColor函数,将灰度图像作为第一个输入传递,并将颜色空间转换代码作为第二个输入传递:COLOR_GRAY2BGR

Python如何拼接长图?请注意,在 BGR 中,图像将保持灰色,不会转换回彩色图像。这就是我们的意图:保留灰度图像但将其置于 BGR 颜色空间中,因此表示它的ndarray也具有 3 个维度,就像原始图像一样。

grayImageBGRspace = cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)

之后,我们就可以在 BGR 空间中将原始图像和灰度图像连接起来,并在窗口中显示出来。

horizontalAppendedIGrayImg = numpy.hstack((img, grayImageBGRspace))
 
cv2.imshow('Horizontal Appended Gray Img', horizontalAppendedIGrayImg)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

完整的Python拼接长图代码可以在下面看到。

import numpy
import cv2 
 
img = cv2.imread('C:/Users/N/Desktop/Test.jpg') 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
## won't work
##horizontalAppendedIGrayImg = numpy.hstack((img,gray))
 
grayImageBGRspace = cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)
 
horizontalAppendedIGrayImg = numpy.hstack((img, grayImageBGRspace))
 
cv2.imshow('Horizontal Appended Gray Img', horizontalAppendedIGrayImg)
 
 
cv2.waitKey(0)
cv2.destroyAllWindows()

运行代码后,你应该获得类似于图 3 所示的结果。

Python拼接长图:如何使用OpenCV连接图像?
图 3 – 水平附加到彩色图像的灰色图像。
木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: