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

devtools/2024/10/22 6:25:22/

在图像处理领域,我们经常需要将多张小图像组合成一张大图。例如,将多张图像按一定布局排列在一起,或者创建一个缩略图画廊。在这篇博客中,我将向你展示如何使用 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。你可以根据需要调整小图的尺寸、网格大小,以及大图的尺寸。

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


http://www.ppmy.cn/devtools/104654.html

相关文章

安美数字酒店宽带运营系统-任意文件读取

漏洞描述: 安美数字酒店宽带运营系统 weather.php 接口存在任意文件读取漏洞,未经身份验证攻击者可通过该漏洞读取系统重要文件(如数据库配置文件、系统配置文件)、数据库配置文件等等,导致网站处于极度不安全状态 fo…

STM32 使用8720 通过LWIP发送数据

一、硬件IOC 1、GPIO 2、NVIC 3、SYS 4、RCC 5、ETH 6、USART 7、LWIP 二、软件函数 1、Main /* USER CODE BEGIN Includes */ #include "ytcesys.h" /* USER CODE END Includes *//* USER CODE BEGIN 2 */ ethreset(); MX_LWIP_Init(); OPEN_USART1…

SpringBoot中使用Redis-Lettuce

SpringBoot中使用Redis-Lettuce 配置pom在application.properties配置Redis参数协议参数设置序列化参数设置实现工具Redis操作工具类单条数据测试批量测试 在SpringBoot中一般直接引用spring-boot-starter-data-redis这个starter来使用Redis,其中具体实现方式有两种…

Jupyter如何使用Anaconda的虚拟环境

Anaconda的虚拟环境大家应该都知道是什么,我们可以建立多个虚拟环境并在对应的环境中安装不同的python三方库从而运行不同的python项目,那么在jupyter中如何使用Anaconda的虚拟环境呢,今天就为大家分享一个这样的操作教程。 请参考图文进行以…

【SpringBoot】实体多层嵌套如何判空字段?

前言 最近在公司了接了个需求;需要开发一个中间系统;进行三方联调;有接口开发经验的朋友都知道;参数校验是必备的一项操作;怎么优雅的校验却是个问题; 我翻找了网络上的一些校验方式;都比较参…

嵌入式全栈开发学习笔记---Linux常用库(json)

目录 入门级问题 为什么使用json? 什么是json? json-c库 json源码 安装方法 json-c API Json类型 C-API 将一个字符串转换成符合json格式的字符串(json对象) 定义一个字符串数组 定义一个json_object结构体指针 把一个字符串转换成一个json对象 将转换成json对…

基于springboot的汽车租赁管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的汽车租赁管理系统,java…

Day-01—QT项目的新建

1.选择创建的项目类型,可以看到,这里可以创建多种语言的项目,可以直接用QT来进行前期C 的学习。 2.创建的名字中不要包含中文,可以用英文就用英文,如果不会英文,就用拼音也可以,保存地址中也不要…