You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历不同尺寸图片并通过OpenCV将其水平拼接为单张图片?

OpenCV 水平拼接不同尺寸图片实现

核心思路对应实现步骤

按照你提出的思路,我们可以把每一步转化为具体的OpenCV操作,这里以Python为例:

  1. 遍历图片并统计尺寸

    • 先批量读取目标图片,循环获取每张图的高度、宽度与通道数;
    • 统计所有图片中的最大高度(水平拼接时需统一高度,不足部分补黑),以及总宽度(所有图片宽度之和,作为最终拼接图的总宽度)。

    注:你原思路里的“最大宽度”应为笔误,水平拼接的最终图宽度是各图宽度总和,高度取所有图的最大值,这样才能让图片左右排列时高度对齐。

  2. 创建黑色蒙版

    • 根据统计出的总宽度和最大高度,创建一个全黑画布(蒙版),通道数与图片保持一致。
  3. 逐张图片拼接

    • 计算每张图片在蒙版上的起始x坐标(累加前面所有图片的宽度),y坐标默认设为0(顶部对齐,如需垂直居中可调整为(max_height - 图片高度) // 2);
    • 将图片复制到蒙版的对应区域,高度不足的部分保留黑色。

完整代码实现

import cv2
import numpy as np

def horizontal_concat_images(image_paths):
    # 1. 读取所有图片并统计尺寸
    images = []
    max_height = 0
    total_width = 0
    for path in image_paths:
        img = cv2.imread(path)
        if img is None:
            print(f"警告:无法读取图片 {path},已跳过")
            continue
        images.append(img)
        h, w = img.shape[:2]
        if h > max_height:
            max_height = h
        total_width += w

    if not images:
        print("错误:没有有效图片可拼接")
        return None

    # 2. 创建黑色蒙版
    channels = images[0].shape[2] if len(images[0].shape) == 3 else 1
    concat_img = np.zeros((max_height, total_width, channels), dtype=np.uint8)

    # 3. 逐张拼接图片到蒙版
    current_x = 0
    for img in images:
        h, w = img.shape[:2]
        concat_img[:h, current_x:current_x+w] = img
        current_x += w

    return concat_img

# 示例用法
if __name__ == "__main__":
    # 替换成你的图片路径列表
    img_paths = ["img1.jpg", "img2.png", "img3.jpeg"]
    result = horizontal_concat_images(img_paths)
    if result is not None:
        cv2.imwrite("horizontal_concat_result.jpg", result)
        cv2.imshow("拼接结果", result)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

关键细节说明

  • 容错处理:加入无法读取图片的判断,避免程序崩溃;
  • 通道兼容:自动适配灰度图与彩色图的通道数;
  • 对齐灵活:默认顶部对齐,可通过修改y坐标实现垂直居中;
  • 尺寸适配:确保最终画布能完整容纳所有图片,无裁剪问题。

内容的提问来源于stack exchange,提问作者Jacob Issac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:20:42