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 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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu22.04@laptop OpenCV Get Started: 001_reading_displaying_write_image

ubuntu22.04laptop OpenCV Get Started: 001_reading_displaying_write_image 1. 源由2. Read/Display/Write应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 过程分析3.1 导入OpenCV库3.2 读取图像文件3.3 显示图像3.4 保存图像文件 4. 总结5. 参考资料 1. 源由 读、写、显示图像…

[python]anaconda3里面pyqt6配置到pycharm配置designer pyuic pyrcc

安装pyqt6 pip install pyqt6 pyqt6-tools pycharm 配置 配置designer pycharm -->> setting —>> External Tools 点击 Program : D:\ProgramData\Anaconda3\Lib\site-packages\qt6_applications\Qt\bin\designer.exe Working directory : $ProjectFileDir$…

私有化部署一个吃豆人小游戏

目录 效果 安装步骤 1.安装并启动httpd 2.下载代码 3.启动httpd 使用 效果 安装步骤 1.安装并启动httpd yum -y install httpd 2.下载代码 进入目录 cd /var/www/html/ 下载 git clone https://gitee.com/WangZhe168_admin/pacman-canvas.git 3.启动httpd syste…

layui-实现上下表,父子表复选框加载事件

layui-实现上下表,父子表复选框加载事件 实现效果说明代码HTML代码表格数据加载监听复选框选择事件点击表格任意单元格,选中复选框和取消复选框选中 效果图 实现效果说明 点击任意单元格,选中复选框,并加载子表数据,选…

Visual Studio 20XX控制台程序鼠标点击阻塞问题

文章目录 方法一方法二 在Visual Studio 20xx编写的控制台程序中,当鼠标点击控制台时,会阻塞控制台程序运行,不按回车无法继续运行。 方法一 右击控制台标题栏,选择属性,去掉快速编辑模式(Q)的勾选,如&…

政安晨:政安晨:机器学习快速入门(三){pandas与scikit-learn} {模型验证及欠拟合与过拟合}

这一篇中,咱们使用Pandas与Scikit-liarn工具进行一下模型验证,之后再顺势了解一些过拟合与欠拟合,这是您逐渐深入机器学习的开始! 模型验证 评估您的模型性能,以便测试和比较其他选择。 在上一篇中,您已经…

橘子学linux调优之工具包的安装

今天在公司无聊的弄服务器,想着有些常用的工具包安装一下,这里就简单记录一下。 一、sysstat的安装和使用 1、安装 我是通过源码的方式安装的,这样的好处在于可以自由选择你的版本,很直观。 直接去github上找到sysstat的地址&a…

P1131 [ZJOI2007] 时态同步

题目描述 小 Q 在电子工艺实习课上学习焊接电路板。一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字 1,2,3⋯1,2,3⋯ 进行标号。电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点,都存在且仅存…

回归预测 | Matlab实现OOA-CNN-LSTM-Attention鱼鹰算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)

回归预测 | Matlab实现OOA-CNN-LSTM-Attention鱼鹰算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制) 目录 回归预测 | Matlab实现OOA-CNN-LSTM-Attention鱼鹰算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制&…

若依整合mybatis-plus

文章目录 1.注释掉原本的MybatisConfig2. 将mybatis的配置文件改为mybatis-plus文件 ##前言 出先下列异常: 请求地址’/prod-api/user’,发生未知异常. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.ruoyi.web.mapper.Us…

PHP客服系统-vue客服聊天系统

PHP-Vue客服聊天系统是一款高效、灵活的客户服务解决方案,基于ThinkPHP6、Vue3和Workerman(Gateworker)框架开发,专为单商户场景打造。 系统亮点: 分布式部署支持,轻松应对高并发场景;本地消息存储功能,确…

js中typeof 与 instanceof 的区别

文章目录 一、typeof二、instanceof三、区别 一、typeof typeof 操作符返回一个字符串,表示未经计算的操作数的类型 使用方法如下: typeof operand typeof(operand)operand表示对象或原始值的表达式,其类型将被返回 举个例子:…

网络爬虫,使用存放在C的谷歌驱动报错

月 06, 2024 11:43:40 上午 org.openqa.selenium.os.OsProcess checkForError 严重: org.apache.commons.exec.ExecuteException: Execution failed (Exit value: -559038737. Caused by java.io.IOException: Cannot run program "C:\chromedriver121.exe" (in dir…

nvm安装node后,npm无效

类似报这种问题,是因为去github下载npm时下载失败, Please visit https://github.com/npm/cli/releases/tag/v6.14.17 to download npm. 第一种方法:需要复制这里面的地址爬梯子去下载(github有时不用梯子能直接下载,有…

远程主机可能不符合 glibc 和 libstdc++ Vs Code 服务器的先决条件

vscode连接远程主机报错,原因官方已经公布过了,需要远程主机 glibc>2.28,所以Ubuntu18及以下版本没法再远程连接了,其他Linux系统执行ldd --version查看glibc版本自行判断。 解决方案建议: 不要再想升级glibc了 问题…

完全背包理论基础 C++力扣题目518--零钱兑换II

动态规划:完全背包理论基础 本题力扣上没有原题,大家可以去卡码网第52题 (opens new window) #思路 #完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个&#xff0…

华为环网双机接入IPTV网络部署案例

环网双机接入IPTV网络部署案例 组网图形 图2 环网双机场景IPTV基本组网图 方案简介配置注意事项组网需求数据规划配置思路操作步骤配置文件 方案简介 随着IPTV业务的迅速发展,IPTV平台承载的用户也越来越多,用户对IPTV直播业务的可靠性要求越来越高。…

C++泛编程(4)

类模板高级(1) 1.类模板具体化部分具体化完全具体化 2.类模板与继承 1.类模板具体化 有了函数模板具体化的基础,学习类模板的具体化很简单。类模板具体化有两种方式,分别为部分具体化和完全具体化。假如有类模板: te…

ywtool inspect命令

一.巡检介绍 日巡检是通过定时任务每天凌晨2点30进行巡检周巡检时通过定时任务每周日的凌晨3点进行巡检日巡检内容: (1)系统信息检查(2)网络检查(3)CPU检查(4)内存检查(5)硬盘检查(6)服务检查(7)昨天登陆成功主机记录(8)JDK检查(9)NTP检查(10)syslog检查(11)SNMP检查(12)SSH检…

低代码与MES系统相结合

​低代码平台通常是指aPaaS平台,通过为开发者提供可视化的应用开发环境,降低或去除应用开发对原生代码编写的需求量,进而实现便捷构建应用程序的一种解决方案。 更加简单点的理解就是“拖拽!搭建应用”。 一、低代码开发平台概述 …