使用 OpenCV 组合和缩放多张图像

在图像处理领域,我们经常需要将多张小图像组合成一张大图。例如,将多张图像按一定布局排列在一起,或者创建一个缩略图画廊。在这篇博客中,我将向你展示如何使用 Python 的 OpenCV 库来完成这一任务。

代码

下面是一段完整的 Python 代码,它读取一个目录中的多张图像,将它们裁剪、缩放,并按照 4x4 的网格排列到一张 1280x1280 的大图中,最后将这些大图保存到指定的目录中。

import cv2
import numpy as np
import os

# 假设每张小图缩放后的尺寸
small_img_w, small_img_h = 1280 // 4, 1280 // 4  # 4x4 网格,每行 4 张,每列 4 张

# 创建大图的尺寸
final_img_w, final_img_h = 1280, 1280  # 1280x1280 大图

# 读取所有小图
source = "C:\\Users\\linds\\Desktop\\fsdownload\\recycle_res\\plot_info\\2024_8_27"
save_res_path = "res_stack"
if not os.path.exists(save_res_path):
    os.makedirs(save_res_path)
img_path_list = [os.path.join(source, img_sub) for img_sub in os.listdir(source)]

# 计算总图片数并分组
num_imgs = len(img_path_list)
groups = [img_path_list[i:i + 16] for i in range(0, num_imgs, 16)]  # 4x4 网格,一张大图容纳 16 张小图

# 逐组处理图片
for group_index, group in enumerate(groups):
    final_image = np.zeros((final_img_h, final_img_w, 3), dtype=np.uint8)  # 清空大图
    for idx, img_path in enumerate(group):
        print(img_path)
        img = cv2.imread(img_path)

        # 去掉顶部500像素
        # img_cropped = img[500:, :, :]
        img_cropped = img

        # 计算缩放比例并缩放
        h, w = img_cropped.shape[:2]
        scale = min(small_img_w / w, small_img_h / h)
        resized_img = cv2.resize(img_cropped, (int(w * scale), int(h * scale)))

        # 放置在大图中的位置
        i, j = divmod(idx, 4)  # 使用 4x4 网格
        y_offset = i * small_img_h
        x_offset = j * small_img_w

        # 将缩放后的图像放到大图中
        final_image[y_offset:y_offset + resized_img.shape[0], x_offset:x_offset + resized_img.shape[1]] = resized_img

    # 保存大图
    final_img_name = os.path.join(save_res_path, f"final_image_group_{group_index}.bmp")
    print(final_img_name)
    cv2.imwrite(final_img_name, final_image)

代码详解

小图缩放和裁剪: 每张图片的顶部 500 像素会被裁剪掉,然后根据目标尺寸进行缩放,以适应 4x4 网格中的单元格。

组合到大图: 使用 NumPy 创建一张空白的大图,然后将缩放后的图片依次放入对应的位置,最终形成 1280x1280 的大图。

分组处理: 如果有超过 16 张图片,代码会将它们分成多组,每组生成一张大图,并按组编号保存。

结果展示

最终生成的图像将被保存在 res_stack 文件夹中,每张大图包含 16 张小图,且尺寸为 1280x1280。你可以根据需要调整小图的尺寸、网格大小,以及大图的尺寸。




你可能感兴趣的:(opencv,计算机视觉,人工智能)