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

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【网络基础】DNS协议详解:从背景到解析过程及`dig`工具的使用
  • Java核心概念之(线程、进程、同步、互斥)
  • (十二)Flink Table API
  • 给自闭症孩子家长的建议:携手同行,共筑爱的桥梁
  • Docker常见命令和参数
  • Cmake相关概念
  • HikariCP源码分析之源码环境搭建
  • 优化MySQL性能的方法
  • C#知识|语法拾遗:分支结构、循环
  • spark-sql 写入paimon主键表报错 Cannot write nullable values to non-null column
  • MegaCLI和H750阵列卡不匹配导致的服务夯死
  • 第二证券:两融账户开通需要的条件?证券两融开户?
  • Android中几种线程交互方式
  • uniapp开发安卓app--安卓低版本(4.4)不显示echarts图表问题解决思路
  • DataX
  • [NodeJS] 关于Buffer
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • exif信息对照
  • Gradle 5.0 正式版发布
  • If…else
  • JavaScript设计模式之工厂模式
  • Java知识点总结(JavaIO-打印流)
  • Linux后台研发超实用命令总结
  • python大佬养成计划----difflib模块
  • React组件设计模式(一)
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Terraform入门 - 3. 变更基础设施
  • vue:响应原理
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 后端_MYSQL
  • 判断客户端类型,Android,iOS,PC
  • 前端之Sass/Scss实战笔记
  • 携程小程序初体验
  • 自制字幕遮挡器
  • ​补​充​经​纬​恒​润​一​面​
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (4)Elastix图像配准:3D图像
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (一)appium-desktop定位元素原理
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (轉)JSON.stringify 语法实例讲解
  • .bat批处理(一):@echo off
  • .cn根服务器被攻击之后
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .md即markdown文件的基本常用编写语法
  • .NET CF命令行调试器MDbg入门(一)