当前位置: 首页 > article >正文

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/news/284535.html

相关文章:

  • 【C++】避开 C 语言的格式化输出陷阱:掌握 printf、sprintf、snprintf、fprintf、vsprintf
  • 使用 pnpm workspace 和 standalone 模式构建 Next.js 的 Docker 镜像
  • ceph rgw reshard (by quqi99)
  • Ubuntu 24.04 中安装网易邮箱大师
  • JVM下篇:性能监控与调优篇-02-JVM监控及诊断工具-命令行篇
  • mybatisplus + oracle + spring boot遇到的一些问题
  • python基础学习(最终篇)
  • Unclutter - 苹果电脑(Mac)桌面文件笔记剪贴板管理工具
  • jenkins如何生成报告并查看报告,如何安装allure插件
  • MySQL-基础篇-事务(事务简介、事务操作、事务的四大特性、并发事务引发的问题、事务的隔离级别)
  • 前波士顿咨询Platinion董事总经理陈果加入望繁信科技
  • RK3568平台(平台总线篇)SPI驱动框架分析
  • 今日算法:蓝桥杯基础题之“星系炸弹”
  • Python | Leetcode Python题解之第384题打乱数组
  • Claude 与 ChatGPT:哪个更适合学术写作,深入对比分析
  • linux批量解压tar.gz文件
  • I/0系统基本概念
  • ORACLE 统计信息的备份与恢复
  • Servlet 简介+ Cookie和session+过滤器Filter和监听器Listener
  • Vue3 ref 和 reactive 的区别
  • 命名空间using namespace std
  • Python编码系列—Python代码重构:提升代码质量
  • 编成笔记-atan2函数学习分析
  • spring 声明式事务方法自调用问题
  • C与C++的三种区分方式
  • 脚手架工具的应用(前端和后端搭建)
  • 惠中科技光伏清洁领域的专业引领者
  • Android音视频开发,需要学些什么?
  • 排序算法之希尔排序详细解读(附带Java代码解读)
  • TCP 协议详解