使用 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。你可以根据需要调整小图的尺寸、网格大小,以及大图的尺寸。