图片拼接|横向拼接|竖向拼接|正方形拼接|其他模式拼接 python

ops/2024/12/29 12:26:15/
  • 读取某文件夹下所有子文件夹的图片,进行拼接

文件夹
—文件夹1
|----图片1
|----图片2
—文件夹2
|----图片3
—文件夹3
|----图片4
|----图片5

python">import os
import cv2
import numpy as np
import random
from math import ceil, sqrt# 支持中文路径的图片读取函数
# def cv_imread(file_path):
#     cv_img = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), -1)
#     cv_img = cv2.cvtColor(cv_img, cv2.COLOR_RGB2BGR)  # 转换为 BGR 格式
#     return cv_imgdef cv_imread(file_path):"""支持中文路径的图片读取,修正反色问题"""cv_img = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), -1)return cv_img  # 不再进行颜色转换,直接返回 BGR 图像def load_images_from_folder(folder):"""加载指定文件夹及其子文件夹中的所有图片,支持中文路径"""images = []for root, _, files in os.walk(folder):for file in files:if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tiff')):img_path = os.path.join(root, file)img = cv_imread(img_path)  # 使用支持中文路径的读取方法if img is not None:images.append(img)return imagesdef vertical_stack(images):"""竖向拼接"""return np.vstack(images)def horizontal_stack(images):"""横向拼接"""return np.hstack(images)def square_stack(images):"""拼接成接近正方形的布局"""n = len(images)cols = ceil(sqrt(n))rows = ceil(n / cols)max_height = max(img.shape[0] for img in images)max_width = max(img.shape[1] for img in images)# 创建空白画布canvas = np.zeros((rows * max_height, cols * max_width, 3), dtype=np.uint8)for idx, img in enumerate(images):row = idx // colscol = idx % colsy_offset = row * max_heightx_offset = col * max_widthcanvas[y_offset:y_offset + img.shape[0], x_offset:x_offset + img.shape[1]] = imgreturn canvasdef chaotic_stack(images):"""恶搞模式:随机旋转、缩放和排列图片"""canvas_size = (1000, 1000, 3)canvas = np.zeros(canvas_size, dtype=np.uint8)h, w = canvas.shape[:2]for img in images:# 随机缩放scale = random.uniform(0.5, 1.5)resized_img = cv2.resize(img, (0, 0), fx=scale, fy=scale)# 随机旋转angle = random.randint(0, 360)center = tuple(np.array(resized_img.shape[1::-1]) // 2)rot_mat = cv2.getRotationMatrix2D(center, angle, 1.0)rotated_img = cv2.warpAffine(resized_img, rot_mat, resized_img.shape[1::-1], flags=cv2.INTER_LINEAR,borderMode=cv2.BORDER_CONSTANT, borderValue=(0, 0, 0))# 随机放置x_offset = random.randint(0, w - rotated_img.shape[1])y_offset = random.randint(0, h - rotated_img.shape[0])try:canvas[y_offset:y_offset + rotated_img.shape[0], x_offset:x_offset + rotated_img.shape[1]] = rotated_imgexcept ValueError:# 如果超出范围,跳过continuereturn canvasdef save_image(output_path, image):"""保存图片,支持中文路径"""cv2.imencode('.jpg', image)[1].tofile(output_path)def main():folder = input("请输入图片文件夹路径:")output_path = input("请输入拼接后图片保存路径(如 output.jpg):")print("选择拼接模式:")print("1: 竖向拼接")print("2: 横向拼接")print("3: 拼成接近正方形")print("4: 恶搞模式")mode = int(input("请输入模式编号(1/2/3/4):"))images = load_images_from_folder(folder)if not images:print("未找到图片,请检查文件夹路径!")returnif mode == 1:result = vertical_stack(images)elif mode == 2:result = horizontal_stack(images)elif mode == 3:result = square_stack(images)elif mode == 4:result = chaotic_stack(images)else:print("无效的模式编号!")returnsave_image(output_path, result)print(f"拼接完成,图片已保存至:{output_path}")if __name__ == "__main__":main()

http://www.ppmy.cn/ops/145583.html

相关文章

【C++基础】10、类与对象

C 在 C 语言的基础上增加了面向对象编程,C 支持面向对象程序设计。类是 C 的核心特性,通常被称为用户定义的类型。 类用于指定对象的形式,是一种用户自定义的数据类型,它是一种封装了数据和函数的组合。类中的数据称为成员变量&am…

Joget研究——Joget8商业版部署

大纲 1. 环境准备1.1 安装必要软件1.2 配置Java1.3 配置MySQL数据库1.3.1 创建用户1.3.2 创建数据库 2. 下载和部署3. 启动4. 测试5. 商业版社区版对比 1. 环境准备 1.1 安装必要软件 We recommend the use of the LTS version of 11. Java 17 (LTS) is not supported at the …

【高阶数据结构】红黑树

红黑树 1.红黑树的概念2.红黑树的规则3.红黑树的实现1.红黑树的结构2.红黑树的插入1.情况一:变色2.情况二:单旋 变色3.情况三:双旋 变色 3.红黑树的查找4.红黑树的验证5.红黑树的删除6.红黑树与AVL树的性能比较 4.总代码1.RBTree.h2.Test.c…

踏踏实实练SQLday2-3连续12345

3连续12345 连续12345 -- hive的连续开窗函数知识点:排序开窗函数--4种 (如果第2 和 3 名一样大)3种 序号排序 - rank() 12245 - 紧缩dense_rank() 12234 - row_number() 123451种百分比排序 - percent_rank() - 算百分比,超过了多少人top20排行榜 连续1…

维克日记:私密写作新选择,轻松记录生活点滴

作为一款专注于私密写作的数字日记本,维克日记以其独特的设计理念和全面的功能特性,正在重新定义现代人记录生活的方式。这款软件不仅提供了清新简约的界面设计,更重要的是它完全不需要繁琐的设置就能立即开始写作。对于热爱写作的用户来说&a…

几个支持用户名密码的代理链工具: glider, gost, proxychains+microsocks

几个支持用户名密码的代理链工具: glider, gost, proxychainsmicrosocks gost -L:7777 -Fsocks5://192.168.2.20:7575 -Fsocks5://user:passwd1.1.1.1:10086 -Dgost:(https://github.com/ginuerzh/gost) 参考 https://www.quakemachinex.com/blog/279.html

Apache Commons Pool2—Java对象池的利器

在日常开发中,为了提高系统性能,避免重复创建和销毁资源,我们经常需要使用对象池技术。Apache Commons Pool2 是 Java 生态中一个强大且易用的对象池实现,它为我们提供了灵活的对象管理功能。本文将带你深入了解 Commons Pool2 的…

linux prctl函数使用说明

prctl 是 Linux 系统调用&#xff0c;用于对进程的某些特性进行控制和操作。它的主要作用是设置或获取进程的某些特定属性&#xff0c;例如进程名、允许的系统调用行为等。 下面是 prctl 函数的常见用法及其参数说明&#xff1a; #include <sys/prctl.h> #include <…