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

news2024/10/6 0:35:23

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 np

def 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:  # 如果没有找到边缘,直接跳过
                    continue
                x_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) // 2
                y_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.coloradmin.cn/o/1426780.html

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

相关文章

基于YOLOv8的水下生物检测,多种优化方法---DCNv4结合SPPF,效果秒杀DCNv3,涨点两个点(四)

💡💡💡本文主要内容:详细介绍了水下生物检测整个过程,从数据集到训练模型到结果可视化分析,以及如何优化提升检测性能。 💡💡💡加入DCNv4_SPPF mAP0.5由原始的0.522提升至0.543 1.水…

7.3、向量空间的简要回顾

7.3、向量空间的简要回顾 ​ 在开始讨论格之前,我们先提醒读者注意线性代数中的一些重要定义和思想。向量空间的定义可以非常宽泛,但就本章而言,我们只需考虑对于某个正整数 m,包含在 R m R^{m} Rm中的向量空间即可。 ​ 我们从…

[职场] 阐述演员这个职业 #微信#学习方法#媒体

阐述演员这个职业 演员这个职业是一种极具挑战性和魅力的职业,它让人们有机会通过表演来展现自己,将自身的才华和潜力发挥到极致。 1. 演员需要具备扎实的专业素养,包括表演技巧、语言技巧、心理技巧等。演员需要深入理解角色,从…

大数据 - Spark系列《一》- 分区 partition数目设置详解

目录 🐶3.2.1 分区过程 🐶3.2.2 SplitSize计算和分区个数计算 🐶3.2.3 Partition的数目设置 1. 🥙对于数据读入阶段,输入文件被划分为多少个InputSplit就会需要多少初始task. 2. 🥙对于转换算子产生的…

【Bugs】Jmeter报错:NoSuchMethodError: org.apache.jmeter.samplers.

报错情况 Jmeter版本:5.4.3 报错场景:在线程组中添加了jpgc - PerfMon Metrics Collector性能监控组件后出现报错。 Jmeter中无法运行测试,cmd命令行中出现以下报错。 cmd报错详细内容: Uncaught Exception java.lang.NoSuchMe…

如何系统的自学Python?通义千问、讯飞星火、文心一言及ChatGPT的回答

如何系统的自学Python?来看看通义千问、讯飞星火、文心一言及ChatGPT的回答. 第一个是马老师的通义千问 系统地自学Python是一个循序渐进的过程,从基础语法到实践项目,再到专业领域的深入学习。下面是一个详细的步骤指南: 了解Py…

Qt5 基于OpenGL实现六轴机械臂三维仿真

需求 在Qt中通过OPenGL方式加载三维模型STL文件,然后将多个结构的STL文件类型的模型进行组装,形成6轴机械臂三维模型的显示,并且可以对每个关节进行关节角度的控制。 新建一个C类STLFileLoader,用于加载STL文件,并进…

电口模块的应用:实现高速网络通信

随着互联网的普及和信息时代的到来,网络通信已经成为了现代社会中不可或缺的一部分。电口模块作为网络通信中的重要组成部分,其应用也越来越广泛。在本文中,我们将详细介绍电口模块的优势以及应用领域。 首先,电口模块具有高速传…

JavaScript 与Java什么关系?为什么名字中带有Java?

JavaScript与Java关系 JavaScript和Java是两种不同的编程语言,它们之间没有直接关系。尽管它们都以“Java”命名,但是它们的语法、用途和应用场景都不同。 Java是一种面向对象的、静态类型的编程语言,主要用于开发独立应用程序、网络应用、…

unity 拖入文件 窗口大小

目录 unity 拖入文件插件 设置窗口大小 unity 拖入文件插件 GitHub - Bunny83/UnityWindowsFileDrag-Drop: Adds file drag and drop support for Unity standalong builds on windows. 设置窗口大小 file build

golang Cannot assign a value to the unexported field ‘xxxxx‘

最近学习golang,结果发现参考github的代码报错了 查了一下资料,这里记录加吐槽一下,这个设定真的让我感觉痛苦 go 实例化结构体报错 Cannot assign a value to the unexported field xxxxx 或者是报错implicit assignment of unexported fiel…

计算机系统体系结构

文章目录 计算机系统体系结构1. 什么是计算机体系结构术语解释计算机系统体系结构所涉及的内容简单通用计算机结构计算机指令程序执行过程时钟 2. 计算机的发展机械计算机机电式计算机早期电子计算机微机和PC革命移动计算和云计算摩尔定律乱序执行 3. 存储程序计算机寄存器传输…

qt学习:停车场管理系统+摄像头+http识别车牌+sqlite3数据库

目录 参考前面发的几篇文章http识别车牌,sqlite3数据库、摄像头的文章 步骤 部分代码 新建一个项目,加入前面用到的http和image两个文件,和加入用到的模块和头函数和成员,加入前面用到的全局变量 配置ui界面 在构造函数中初…

sql指南之null值用法

注明:参考文章: SQL避坑指南之NULL值知多少?_select null as-CSDN博客文章浏览阅读2.9k次,点赞7次,收藏21次。0 引言 SQL NULL(UNKNOW)是用来代表缺失值的术语,在表中的NULL值是显示…

微服务入门篇:Ribbon负载均衡(原理,均衡策略,饥饿加载)

目录 1.负载均衡原理2.负载均衡策略3.饥饿加载 1.负载均衡原理 在使用 LoadBalanced 注解后,Spring Cloud Ribbon 将会为 RestTemplate 添加负载均衡的能力。 负载均衡的流程如下: 当使用 RestTemplate 发送请求时,会先判断请求的 URL 是否包…

03、全文检索 -- Solr -- Solr 身份验证配置(给 Solr 启动身份验证、添加用户、删除用户)

目录 全文检索 -- Solr -- Solr 身份验证配置启用身份验证&#xff1a;添加用户&#xff1a;删除用户&#xff1a; 全文检索 – Solr – Solr 身份验证配置 学习之前需要先启动 Solr 执行如下命令即可启动Solr&#xff1a; solr start -p <端口>如果不指定端口&#xf…

保姆级的指针详解(超详细)

目录 一.内存和地址  1.初识指针 2.如何理解编址 二. 指针变量 三.指针的解引用操作符 1.指针变量的大小 四.指针变量类型的意义 五.指针的运算 1.指针加减整数 2.指针减指针 3.野指针 3.1指针未初始化 3.2指针越界访问 3.3指针指向的空间被提前释放 3.4如何规…

05:容器镜像技术揭秘|发布容器服务器|私有镜像仓库

容器镜像技术揭秘&#xff5c;发布容器服务器&#xff5c;私有镜像仓库 创建镜像使用commit方法创建自定义镜像。Dockerfile打包镜像创建apache服务镜像制作 php 镜像 微服务架构创建nginx镜像 发布服务通过映射端口发布服务容器共享卷 docker私有仓库 创建镜像 使用commit方法…

Mac用Crossover玩《幻兽帕鲁》手柄不能用怎么办? Mac电脑玩《幻兽帕鲁》怎么连接手柄? 幻兽帕鲁玩家超1900万

2024年首款爆火Steam平台的游戏《幻兽帕鲁》&#xff0c;在使用Crossover后可以用Mac系统玩了&#xff0c;很多玩家喜欢通过手柄玩游戏&#xff0c;它拥有很好的握持体验&#xff0c;长时间玩也不会很累&#xff0c;所以很多《幻兽帕鲁》玩家都喜欢用手柄来操作&#xff0c;很多…

idea 中 tomcat 乱码问题修复

之前是修改 Tomcat 目录下 conf/logging.properties 的配置&#xff0c;将 UTF-8 修改为 GBK&#xff0c;现在发现不用这样修改了。只需要修改 IDEA 中 Tomcat 的配置就可以了。 修改IDEA中Tomcat的配置&#xff1a;添加-Dfile.encodingUTF-8 本文结束