OpenCV 例程 300篇255.OpenCV 实现图像拼接

Posted YouCans

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV 例程 300篇255.OpenCV 实现图像拼接相关的知识,希望对你有一定的参考价值。

『youcans 的 OpenCV 例程300篇 - 总目录』


【youcans 的 OpenCV 例程 300篇】255.OpenCV 实现图像拼接


6.2 OpenCV 实现图像拼接

OpenCV中图像的数据结构是Numpy数组,使用切片方法可以实现图像的裁剪,使用数组堆叠方法可以实现图像的拼接。

Numpy 函数 np.hstack 可以用于水平拼接2个或多个图像,函数 np.vstack 可以用于垂直拼接2个或多个图像。

OpenCV 也提供了2个或多个图像水平拼接或垂直拼接的函数 cv.hconcat 与 cv.vconcat。

函数说明:

cv.hconcat(src[, dst=None]) → dst,列方向水平堆叠,水平拼接2个或多个图像
cv.hconcat(src1, src2[, dst=None]) → dst

cv.vconcat(src[, dst=None]) → dst,行方向竖直堆叠,垂直拼接2个或多个图像
cv.vconcat(src1, src2[, dst=None]) → dst

参数说明:

  • src:多张图像的数组,数据结构是列表或元组,数组元素是 Numpy 数组
  • src1, src2:输入图像,Numpy 数组
  • dst:输出图像,Numpy 数组

注意问题:

⑴ 函数 cv.hconcat 沿列方向水平堆叠,拼接图像的高度(数组的行数)必须相同;函数 cv.vconcat沿行方向垂直堆叠,拼接图像的宽度(数组的列数)必须相同。

⑵ 综合使用函数 cv.hconcat 和 cv.vconcat,可以实现图像的矩阵拼接。

⑶ 函数 cv.hconcat 或 cv.vconcat 的输入参数 src 可以是包括多张图像的图像数组,其数据结构是列表(list)或元组(tuple),数组元素 src[i] 是表示单张图像的 Numpy 数组。


基本例程

    # 1.18+ OpenCV 实现图像拼接
    import cv2 as cv
    imgLena = cv.imread("../images/imgLena.tif")  # 读取彩色图像(BGR)
    imgLogo = cv.imread("../images/logoCV.png")  # 读取彩色图像(BGR)

    imgH1 = cv.resize(imgLena, (400, 400))  # w=400, h=400
    imgH2 = cv.resize(imgLogo, (300, 400))  # w=300, h=400
    imgH3 = imgH2.copy()
    # imgStackH = np.hstack((imgH1, imgH2, imgH3))  # 高度相同图像可以横向水平拼接
    imgStackH = cv.hconcat((imgH1, imgH2, imgH3))  # 高度相同图像可以横向水平拼接
    print("Horizontal stack:\\nShape of imgH1, imgH2 and imgStackH: ", imgH1.shape, imgH2.shape, imgStackH.shape)

    imgV1 = cv.resize(imgLena, (400, 400))  # w=400, h=400
    imgV2 = cv.resize(imgLogo, (400, 300))  # w=400, h=300
    # imgStackV = cv.vconcat((imgV1, imgV2))  # 宽度相同图像可以纵向垂直拼接
    imgV = (imgV1, imgV2)  # 生成拼接图像的数组或元组
    imgStackV = cv.vconcat(imgV)  # 宽度相同图像可以纵向垂直拼接
    print("Vertical stack of image array: ", len(imgV), imgStackV.shape)
    imgStackV = cv.vconcat((imgV1, imgV2))  # 宽度相同图像可以纵向垂直拼接
    print("Vertical stack:\\nShape of imgV1, imgV2 and imgStackV: ", imgV1.shape, imgV2.shape, imgStackV.shape)

    cv.imshow("DemoStackH", imgStackH)  # 在窗口显示图像 imgStackH
    cv.imshow("DemoStackV", imgStackV)  # 在窗口显示图像 imgStackV
    key = cv2.waitKey(0)  # 等待按键命令

运行结果如下:

Horizontal stack:
Shape of imgH1, imgH2 and imgStackH:  (400, 400, 3) (400, 300, 3) (400, 1000, 3)
Vertical stack of image array:  2 (700, 400, 3)
Vertical stack:
Shape of imgV1, imgV2 and imgStackV:  (400, 400, 3) (300, 400, 3) (700, 400, 3)


对比:Numpy 实现图像拼接

用 Numpy 的数组堆叠方法可以进行图像的拼接,操作简单方便。

方法说明:

retval = numpy.hstack((img1, img2, …)) # 水平拼接
retval = numpy.vstack((img1, img2, …)) # 垂直拼接

  • np.hstack() 按水平方向(列顺序)拼接 2个或多个图像,图像的高度(数组的行)必须相同。
  • np.vstack() 按垂直方向(行顺序)拼接 2个或多个图像,图像的宽度(数组的列)必须相同。
  • 综合使用 np.hstack() 和 np.vstack() 函数,可以实现图像的矩阵拼接。
  • np.hstack() 和 np.vstack() 只是简单地将几张图像直接堆叠而连成一张图像,并未对图像进行特征提取和边缘处理,因而并不能实现图像的全景拼接。

参数说明:

  • img1, img2, …:拼接前的图像,nparray 多维数组
  • 返回值 retval:拼接后的图像,nparray 多维数组

基本例程:

    # 1.18 图像拼接
    img1 = cv2.imread("../images/imgLena.tif")  # 读取彩色图像(BGR)
    img2 = cv2.imread("../images/logoCV.png")  # 读取彩色图像(BGR)
    img1 = cv2.resize(img1, (400, 400))
    img2 = cv2.resize(img2, (300, 400))
    img3 = cv2.resize(img2, (400, 300))
    imgStackH = np.hstack((img1, img2))  # 高度相同图像可以横向水平拼接
    imgStackV = np.vstack((img1, img3))  # 宽度相同图像可以纵向垂直拼接

    print("Horizontal stack:\\nShape of img1, img2 and imgStackH: ", img1.shape, img2.shape, imgStackH.shape)
    print("Vertical stack:\\nShape of img1, img3 and imgStackV: ", img1.shape, img3.shape, imgStackV.shape)
    cv2.imshow("DemoStackH", imgStackH)  # 在窗口显示图像 imgStackH
    cv2.imshow("DemoStackV", imgStackV)  # 在窗口显示图像 imgStackV
    key = cv2.waitKey(0)  # 等待按键命令

本例程的运行结果如下:

Horizontal stack:
Shape of img1, img2 and imgStackH:  (400, 400, 3) (400, 300, 3) (400, 700, 3)
Vertical stack:
Shape of img1, img3 and imgStackV:  (400, 400, 3) (300, 400, 3) (700, 400, 3)

【本节完】

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/128466627)
Copyright 2022 youcans, XUPT
Crated:2023-1-2

以上是关于OpenCV 例程 300篇255.OpenCV 实现图像拼接的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 例程 300篇254.OpenCV 绘制图像标记

youcans 的 OpenCV 例程 300篇254.绘制标记

OpenCV 例程300篇238. OpenCV 中的 Harris 角点检测

OpenCV 例程300篇238. OpenCV 中的 Harris 角点检测

OpenCV 例程 300篇241. 尺度不变特征变换(SIFT)

OpenCV 例程 300篇241. 尺度不变特征变换(SIFT)