使用NumPy进行图片拼接:concatenate、vstack与hstack详解

Ada
Ada
发布时间:2026-10-13 | 3人浏览过
原创

本文介绍如何利用NumPy和OpenCV实现多张图片的自动拼接。核心步骤包括统一图片尺寸以确保数组维度一致,随后通过np.concatenate、np.vstack或np.hstack函数按垂直或水平方向合并图像。文中提供完整Python脚本,演示如何遍历文件夹、调整分辨率并生成拼接结果,适用于批量图像处理场景。

图片拼接的两种基本方法

实现图片拼接主要有两种常用方法,分别对应垂直和水平方向的合并操作。

concatenate、vstack与hstack的代码对比


#img = np.vstack((img, img2))  # vstack按垂直方向,hstack按水平方向
img = np.concatenate((img, img2), axis=0)  # axis=0 按垂直方向,axis=1 按水平方向

统一图片尺寸的关键步骤

在拼接前必须统一所有图片的大小,确保生成的数组维度一致,否则拼接操作会失败。具体做法是将文件夹内所有图片的尺寸统一调整为与第一张图片相同的宽度和高度。

图片尺寸统一处理函数


def img_size(image_names,width, height):
  for i in image_names:
    img = cv2.imread(os.path.join(img_path, i))
    img_resize = cv2.resize(img, (width, height), interpolation=cv2.INTER_CUBIC)
    cv2.imwrite(os.path.join(img_path, i), img_resize)
    print(os.path.join(img_path, i))

批量图片拼接完整实现案例

以下是一个完整的Python案例,展示了如何读取指定文件夹内的所有图片,统一尺寸后将其拼接为一张大图。

完整Python代码解析


import cv2
import os
import numpy as np

def img_size(image_names,width, height):
  for i in image_names:
    img = cv2.imread(os.path.join(img_path, i))
    img_resize = cv2.resize(img, (width, height), interpolation=cv2.INTER_CUBIC)
    cv2.imwrite(os.path.join(img_path, i), img_resize)
    print(os.path.join(img_path, i))

if __name__ == '__main__':
  img_path = r'F:\studytest'
  image_names = [name for name in os.listdir(img_path) if os.path.splitext(name)[1] == ".jpg"]
  img1 = cv2.imread(os.path.join(img_path, image_names[0]))
  width, height = img1.shape[:2][::-1]
  img_size(image_names,width, height)
  img = img1

  for i in range(1,len(image_names)):
    img_page = image_names[i]
    img2 = cv2.imread(os.path.join(img_path, img_page))
    #img = np.vstack((img, img2))  # vstack按垂直方向,hstack按水平方向
    img = np.concatenate((img, img2), axis=0)  # axis=0 按垂直方向,axis=1 按水平方向
  cv2.imwrite(os.path.join(img_path,"res.jpg"), img)
  # cv2.imshow("img",img)
  # cv2.waitKey()
``

总结

以上内容涵盖了图片拼接的核心逻辑与实现代码,希望能为相关技术学习提供参考,欢迎持续关注获取更多技术分享。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表