Python OpenCV实现图片像素区域缩放

Python OpenCV实现图片像素区域缩放

  • 前言
  • 项目
    • 安装OpenCV和Pillow
    • 思路
    • 代码编写

前言

遇到一个要将大量图片缩放成统一规格的难题,并且这些图片周围还有很多空白像素,所以用Python实现一下。
像素区域缩放

项目

安装OpenCV和Pillow

pip install opencv-python
pip install pillow

思路

先把周围的空白像素去掉,再进行中心缩放,放到规定大小的矩形内即可。

代码编写

需要设置input_folder output_folder 还有缩放后的尺寸target_size


import cv2
from PIL import Image
import os
import numpy as npdef center_zoom(input_folder, output_folder, target_size):# 确保输出文件夹存在if not os.path.exists(output_folder):os.makedirs(output_folder)# 遍历输入文件夹中的所有文件for filename in os.listdir(input_folder):file_path = os.path.join(input_folder, filename)# 确保文件是图像if file_path.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):with Image.open(file_path) as img:img = img.convert('RGBA')  # 确保图像有透明通道img_np = np.array(img)[:,:,0:3]  # 只取RGB通道用于边缘检测edges = cv2.Canny(img_np, threshold1=30, threshold2=100)  # 边缘检测y_indices, x_indices = np.where(edges > 0)  # 找到边缘像素的坐标if len(x_indices) == 0 or len(y_indices) == 0:  # 如果没有找到边缘,直接跳过continuex_min, x_max = np.min(x_indices), np.max(x_indices)y_min, y_max = np.min(y_indices), np.max(y_indices)# 根据裁剪区域裁剪出有像素区域img_np = np.array(img)img_np = img_np[y_min:y_max, x_min:x_max, :]img = Image.fromarray(img_np)# 创建一个完全透明的背景图像background = Image.new('RGBA', (target_size[0], target_size[1]), (0, 0, 0, 0))# 获取原始图像的宽度和高度original_width, original_height = img.size# 获取目标图像的宽度和高度target_width, target_height = target_size# 计算原始图像的长宽比original_aspect_ratio = original_width / original_height# 计算目标图像的长宽比target_aspect_ratio = target_size[0] / target_size[1]# 如果原始图像的长宽比大于目标图像的长宽比if original_aspect_ratio > target_aspect_ratio:# 计算调整后的宽度new_width = target_width# 计算调整后的高度new_height = int(target_width / original_aspect_ratio)else:# 计算调整后的高度new_height = target_height# 计算调整后的宽度new_width = int(target_height * original_aspect_ratio)# 调整图像大小,保持长宽比不变img = img.resize((new_width, new_height), Image.LANCZOS)# 创建一个完全透明的背景图像background = Image.new('RGBA', target_size, (0, 0, 0, 0))# 计算将图像放入背景图像的位置x_offset = (target_width - new_width) // 2y_offset = (target_height - new_height) // 2# 将图像粘贴到背景图像的中心位置background.paste(img, (x_offset, y_offset))# 保存到输出文件夹background.save(os.path.join(output_folder, filename))# 指定输入和输出文件夹以及目标图像尺寸
input_folder = r'D:\Project\Python_Project\AutomaticCardSynthesis\TestCardImage'
output_folder = r'D:\Project\Python_Project\AutomaticCardSynthesis\OutputCardImage'
target_size = (128, 128)  # 传递一个包含宽和高的元组
center_zoom(input_folder, output_folder, target_size)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/660826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++:异常体系

异常体系 异常1.C语言传统的处理错误的方式2.C异常概念3.异常的使用3.1异常的抛出和捕获3.2 异常的重新抛出3.3异常安全3.4 异常规范 4.C标准库的异常体系5.异常的优缺点 异常 1.C语言传统的处理错误的方式 终止程序,如assert,缺陷:用户难以…

MyBatisPlus的基本使用之QueryWrapper

QueryWrapper是MyBatis-Plus中的一个查询封装类,用于构建带有条件的查询语句。 1. QueryWrapper 使用普通的方式来设置查询条件,而不是使用Lambda表达式。 一系列方法设置查询条件。手动指定数据库表的列名作为方法的参数 select 设置查询的字段 eq、…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextClock组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextClock组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、TextClock组件 TextClock组件通过文本将当前系统时间显示在设备上。支持不同…

Linux 内核版本和发布历史

版本命名 在 2.6.x 版本以前,托瓦兹将核心的发展趋势分为两股,并根据这两股核心的发展分别给予不 同的核心编号。次版本为奇数表示发展中版本(development) 如2.5.xx,这种核心版本主要用在测试与测试新功能。次版本为偶数表示稳定版本 (stab…

Pytorch从零开始实战18

Pytorch从零开始实战——人脸图像生成 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——人脸图像生成环境准备模型定义开始训练可视化总结 环境准备 本文基于Jupyter notebook,使用Python3.8,Pytorch2.0.1cu118&#…

【2024年美赛即将开赛】最后一天如何提高获奖率

美赛思路预定 01 美赛赛中时间分配美赛时间安排比赛前2~3天第一天(2号)第二天(3号)第三天(4号)第四天(5号)第五天(6号)8:00~10:00 02 …

Hadoop-生产调优(更新中)

第1章 HDFS-核心参数 1.1 NameNode内存生产配置 1)NameNode 内存计算 每个文件块大概占用 150 byte,一台服务器 128G 内存为例,能存储多少文件块呢? 128 * 1024 * 1024 * 1024 / 150byte ≈ 9.1 亿G MB KB Byte 2&#xff09…

前端构建变更:从 webpack 换 vite

现状 这里以一个 op (内部运营管理用)项目为例,从 webpack 构建改为 vite 构建,提高本地开发效率,顺便也加深对 webpack 、 vite 的了解。 vite 是前端构建工具,使用 一系列预配置进行rollup 打包&#x…

【SpringBoot】如何在 Utils 工具类中注入 Bean

一、背景 在 controller 层想使用一个静态工具,这个静态工具要使用其它组件。 我们经常要使用 Autowired 注解注入 Service 或者 Mapper 接口,在 service 层中注入其它的service 接口或者 mapper 接口都是可以的,但是如果我们要在我们自己封…

gdb 调试 - 在vscode图形化展示在远程的gdb debug过程

前言 本地机器的操作系统是windows,远程机器的操作系统是linux,开发在远程机器完成,本地只能通过ssh登录到远程。现在目的是要在本地进行图形化展示在远程的gdb debug过程。(注意这并不是gdb remote !!&am…

【论文阅读笔记】Time Series Contrastive Learning with Information-Aware Augmentations

Time Series Contrastive Learning with Information-Aware Augmentations 摘要 背景:在近年来,已经有许多对比学习方法被提出,并在实证上取得了显著的成功。 尽管对比学习在图像和语言领域非常有效和普遍,但在时间序列数据上的应…

题目 1107: 纪念品分组

题目描述: 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一…

Vue2中使用 el-dialog 对话框自行封装可拖动拖拽插件

文章目录 需求分析 需求 实现可拖拽的 el-dialog 分析 1.在utils文件创建dialogdrag.js文件,自定义指令 javascript复制代码//自定义指令:实现element-ui对话框dialog拖拽功能 import Vue from vue// v-dialogDrag: 弹窗拖拽 Vue.directive(dialogDr…

前端面试题-typeof 与instanceof区别(2024.2.1)

1、相同点以及概念 typeof 和 instanceof 都是 JavaScript 中用于检测值类型的运算符 2、typeof typeof 用于检测一个值的数据类型,返回的结果是一个字符串,表示被检测值的数据类型。常用的返回值有:"number", "string&quo…

实现vue3响应式系统核心-shallowReactive

简介 今天来实现一下 shallowReactive 这个 API。 reactive函数是一个深响应,当你取出的值为对象类型,需要再次调用 reactive进行响应式处理。很明显我们目前的代码是一个浅响应,即 只代理了对象的第一层,也就是 shallowReactiv…

36万的售价,蔚来理想卖得,小米卖不得?

文 | AUTO芯球 作者 | 雷歌 Are you OK?雷军被网友们叫“小雷”! 被网友一猜再猜的小米SU7的价格,因为一份保险上牌价格单的曝光被网友吵得热热闹闹,曝出的小米汽车顶配上牌保险价格为36.14万。 20万以下,人们愿称…

BeanUtil.copyProperties(source,target)拷贝List注意事项

一:抛出问题 import cn.hutool.core.bean.BeanUtil; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.ArrayList; import java.util.List; Data AllArgsConstructor NoArgsConstructor public class Us…

【python】OpenCV—Tracking(10.1)

学习来自《Learning OpenCV 3 Computer Vision with Python》Second Edition by Joe Minichino and Joseph Howse 文章目录 检测移动的目标涉及到的 opencv 库cv2.GaussianBlurcv2.absdiffcv2.thresholdcv2.dilatecv2.getStructuringElementcv2.findContourscv2.contourAreacv2…

对比上次MySQL的DDL

MySQL的DDL未必都是可以快速完成的,那么Oracle同等场景下如何? 这个是在Oracle19C下的实验,特别说明。因为在Oracle11G下有些结论是不成立的。 表thousand有大约4000万行记录 SQL> set timing on; SQL> desc thousand; Name T…

css多行文本擦拭效果

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>多行文本擦拭效果</title><style>* …