当前位置: 首页 > article >正文

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)

http://www.kler.cn/a/229333.html

相关文章:

  • 【漏洞分析】DDOS攻防分析
  • 蓝桥杯备赛:顺序表和单链表相关算法题详解(上)
  • 微信小程序集成Vant Weapp移动端开发的框架
  • mac 安装docker
  • Spring Boot 2 学习指南与资料分享
  • .net core 中使用AsyncLocal传递变量
  • 2.4-学成在线内容管理之项目实战
  • MES生产执行管理
  • 几个MySQL系统调优工具
  • 代理模式
  • springboot 整合 PowerJob实现定时任务调度
  • FY-SA-20237·8-AI‘sIQ
  • 安卓动态链接库文件体积优化探索实践
  • PHP客服系统-vue客服聊天系统
  • 【0255】揭晓pg内核中MyBackendId的分配机制(后端进程Id,BackendId)(一)
  • AIGC技术讲解以及应用的落地
  • “极简壁纸“爬虫JS逆向·实战
  • 【Spring Boot 3】【JPA】嵌入式对象
  • 回归预测 | Matlab基于POA-LSSVM鹈鹕算法算法优化最小二乘支持向量机的数据多输入单输出回归预测
  • 快速掌握Vue.js框架:从入门到实战
  • K8S之标签的介绍和使用
  • CentOS 8 安装配置 Hadoop3.3.6 伪分布式安装方式(适用于开发和调试)
  • 记一次面试题
  • 09_树莓派_树莓派外设板_GPIO_按键的中断与消抖
  • C#,奥西里斯数(Osiris Number)的算法与源代码
  • Vue中路由的使用