如何遍历不同尺寸图片并通过OpenCV将其水平拼接为单张图片?
OpenCV 水平拼接不同尺寸图片实现
核心思路对应实现步骤
按照你提出的思路,我们可以把每一步转化为具体的OpenCV操作,这里以Python为例:
遍历图片并统计尺寸
- 先批量读取目标图片,循环获取每张图的高度、宽度与通道数;
- 统计所有图片中的最大高度(水平拼接时需统一高度,不足部分补黑),以及总宽度(所有图片宽度之和,作为最终拼接图的总宽度)。
注:你原思路里的“最大宽度”应为笔误,水平拼接的最终图宽度是各图宽度总和,高度取所有图的最大值,这样才能让图片左右排列时高度对齐。
创建黑色蒙版
- 根据统计出的总宽度和最大高度,创建一个全黑画布(蒙版),通道数与图片保持一致。
逐张图片拼接
- 计算每张图片在蒙版上的起始x坐标(累加前面所有图片的宽度),y坐标默认设为0(顶部对齐,如需垂直居中可调整为
(max_height - 图片高度) // 2); - 将图片复制到蒙版的对应区域,高度不足的部分保留黑色。
- 计算每张图片在蒙版上的起始x坐标(累加前面所有图片的宽度),y坐标默认设为0(顶部对齐,如需垂直居中可调整为
完整代码实现
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
相关产品推荐
相关产品推荐

