python 实现批量图片不拉伸尺寸归一化

news2024/12/24 21:54:27

在进行机器学习或深度学习之前,都要对样本图片进行预处理,其中需要将图片的尺寸统一调整。很多时候,样本的来源很多,尺寸和比例也不统一,可能来自于互联网爬虫,可能来自于不同的手机拍摄。如果将不同尺寸与宽高比的图片调整到统一尺寸,对后续模型的训练影响很大。关于图片尺寸调整这块网上的代码很多,大多都是强制更改尺寸,导致图片会变形,会影响样本的原始信息。

下面的方式1是常见的方式:

调整方式1

代码如下:

import torchvision.transforms as transforms
from PIL import Image
import os

transform = transforms.Compose([
    transforms.Resize((600, 600), interpolation=transforms.InterpolationMode.BICUBIC)
    # other transformations...
])


def translate_image(path_image, path_target, picture_name):
    im = Image.open(path_image)
    im = im.convert("RGB")
    output = transform(im)
    output.save(path_target + os.sep + picture_name)

效果:
效果图片

可以看出形变非常明显

调整方式2

为了避免形变,需要计算以宽和高像素数,进行缩放,空白处以空白像素进行填充,可以有效避免形变。

流程如下:

Created with Raphaël 2.3.0 读取原始宽高 分别根据宽高计算缩放比例 选择大的缩放比例 空白处像素填充

代码如下:

import cv2
import os

def resize(path_image, out_path):
    im = cv2.imread(path_image)
    height, width = im.shape[:2]  # 取彩色图片的长、宽。

    ratio_h = height / target_size
    ration_w = width / target_size

    ratio = max(ratio_h, ration_w)

    # 缩小图像  resize(...,size)--size(width,height)
    size = (int(width / ratio), int(height / ratio))
    shrink = cv2.resize(im, size, interpolation=cv2.INTER_AREA)  # 双线性插值
    BLACK = [0, 0, 0]

    a = (target_size - int(width / ratio)) / 2
    b = (target_size - int(height / ratio)) / 2

    constant = cv2.copyMakeBorder(shrink, int(b), int(b), int(a), int(a), cv2.BORDER_CONSTANT, value=BLACK)
    constant = cv2.resize(constant, (target_size, target_size), interpolation=cv2.INTER_AREA)
    cv2.imwrite(out_path, constant, [cv2.IMWRITE_PNG_COMPRESSION, 9])
    return constant

效果如下:

效果1

效果2
可以看出,无论是上下还是左右,都可以自动居中,周边进行填充

批量文件归一化实现

import cv2

import os

target_size = 600


def resize(path_image, out_path):
    im = cv2.imread(path_image)
    height, width = im.shape[:2]  # 取彩色图片的长、宽。

    ratio_h = height / target_size
    ration_w = width / target_size

    ratio = max(ratio_h, ration_w)

    # 缩小图像  resize(...,size)--size(width,height)
    size = (int(width / ratio), int(height / ratio))
    shrink = cv2.resize(im, size, interpolation=cv2.INTER_AREA)  # 双线性插值
    BLACK = [0, 0, 0]

    a = (target_size - int(width / ratio)) / 2
    b = (target_size - int(height / ratio)) / 2

    constant = cv2.copyMakeBorder(shrink, int(b), int(b), int(a), int(a), cv2.BORDER_CONSTANT, value=BLACK)
    constant = cv2.resize(constant, (target_size, target_size), interpolation=cv2.INTER_AREA)
    cv2.imwrite(out_path, constant, [cv2.IMWRITE_PNG_COMPRESSION, 9])
    return constant


if __name__ == '__main__':
    directory_name = "F://1"
    path_target = "F://1-resize"
    if not os.path.exists(path_target):
        os.makedirs(path_target)
    for picture_name in os.listdir(directory_name):
        file_name = directory_name + os.sep + picture_name  # 读取文件夹地址+图片名称类型
        resize(file_name, path_target+ os.sep + picture_name)
        print(file_name)

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

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

相关文章

CentOS Linux 8使用阿里源(安装jdk11、git测试)

一、备份 cd /etc/yum.repos.d/ mkdir bak mv CentOS-Linux-* bak二、下载新源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo三、安装软件测试 sudo yum -y install java-11-openjdk-devel java -versionsudo yu…

瑞亚太空活动公司RSA与英国国防与安全加速器达成量子项目合作

​ (图片来源:网络) 瑞亚太空活动公司(RSA)与英国国防与安全加速器(DASA)签署了合作协议,主要开发名为“无限交换”的可操纵量子真空的技术项目。这是RSA在英国签订的第一份合同&…

B端产品之数据分析能力

目录 学习目标:数据分析的思维框架以及工作需要的知识结构,数据分析结果外化-撰写数据分析报告 分析流程分析要点分析报告 数据分析流程 明确主题,尽量细化提出假设验证并修正假设:分析过程中对各个关联维度进行数据可视化观察…

怎么用迅捷PDF转换器在线提取PDF文件中的图片

大家在学习或者是办公中经常使用到PDF文件,我们在做一份工作文件的时候,需要一些资料来补充内容,这些资料是以PDF文件格式呈现,在使用PDF文件时,文件中有的图片做到很精细,想要单独提取保存下来备用。那么&…

【解决】IntelliJ IDEA无法识别package.json里面定义的脚本问题(npm: No scripts found)

错误提示:npm: No scripts found 在File-Settings-Editor-File Types,右边找到JSON,在File name patterns中添加了*.json,然后就识别了

全局安装vue脚手架,VSCode没有权限

一、全局安装vue脚手架 winR,输入cmd,打开命令行窗口,输入 npm install -g vue/cli ,回车 npm install -g vue/cli 二、查看是否安装成功,出现版本信息,就表示安装成功 vue --version 三、打开VSCode&…

基于matlab偏振建模和分析(附源码)

一、前言 这个例子介绍了极化的基本概念。它展示了如何使用相控阵系统工具箱分析极化场并对极化天线和目标之间的信号传输进行建模。 二、电磁场的极化 天线产生的电磁场与远场中的传播方向正交。场可以指向此平面中的任何方向,因此可以分解为两个正交分量。从理论上…

EC\AC\BC\pair-wise组合覆盖测试技术

基本概念介绍 场景说明 某个美颜相机的系统测试: 被测对象1-【系统】取值有3种可能:windows\IOS\Linux 被测对象2-【摄像头】取值有4种可能:徕卡\索尼\三星\舜宇 被测对象3-【环境】取值有2种可能:白天\黑夜 问题:如何…

使用matlab求解常微分方程(组)问题

前言 介绍了常微分方程组的基本形式,并且介绍了matlab的数值和解析解法,以及给出了相应的案例。 前言1. 常微分方程组介绍1.1 一阶常微分方程组1.2 高阶常微分方程组1.2.1 形式1:单个高阶微分方程1.2.2 形式2:多个高阶微分方程组 …

XILINX 7系列FPGA普通IO与差分IO

🏡《Xilinx FPGA开发宝典》 目录 1,概述2,IO说明3,总结 1,概述 本文介绍XILINX 7系列FPGA普通IO和差分IO的识别方法与注意事项。 2,IO说明 7系列FPGA的绝大多数IO均支持差分,但是有些IO是不支持…

C语言:求Sn=a+aa+aaa+aaaa+aaaaa+……的前n项之和

题目: 求Snaaaaaaaaaaaaaaa……的前n项之和,其中a是一个数字, 例如:222222222222222…… 思路: 总体思路: (一). 生成变量: int a 0; -- 题目中的a int n 0; -- a 的前…

个人git笔记,持续学习并补充填写

git --version //查看git版本信息 sudo yum remove git -y //卸载gitsudo yum install git -y//安装git 该文章仅仅是为了方便个人日常观看,有些地方没有做详细介绍 git init 创建本地仓库(最好先创建一个目录,在该目录下输入指令创建git仓…

DETR系列:RT-DETR 论文解析

论文:《DETRs Beat YOLOs on Real-time Object Detection》 2023.4 DETRs Beat YOLOs on Real-time Object Detection:https://arxiv.org/pdf/2304.08069.pdf 源码地址:https://github.com/PaddlePaddle/PaddleDetection/tree/develop/conf…

MybatisPlus 用法

MybatisPlus 用法--wrapper的用法 MybatisPlus 原理常见wrapper的用法eq等值查询 与 ne不等值查询gt 大于 与 ge 大于等于、lt小于与le小于等于between 在某个区间内 与 notBetween不在某个区间内in在范围内的值 与 notIn不在范围内的值inSql、notInSql(几乎用不到)orderBy、o…

Android——基本控件(下)(十五)

1. 对话框:Dialog 1.1 知识点 (1)掌握对话框的主要作用; (2)可以使用AlertDialog和AlertDialog.Builder进行对话框的建立; (3)可以通过LayoutInflater进行定制对话框…

前端JavaScript入门-day02

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 一.运算符 1.1 赋值运算符 1.2 一元运算符 自增运算符的用法: 1.3 比较运算符 比较运算符…

超越竞争,使用Framework技术赢得市场份额

Framework为什么这么重要? 在Android开发中,Framework(框架)是非常重要的,因为它提供了一套已经实现的软件组件和工具,以支持开发者构建应用程序。以下是Framework在Android开发中的重要性: 提…

云服务器到期,站点迁移,Nginx配置SSL以备后续只需!

导言 笔者小站:秋码分享 在这三年中,其实远不止这三年,可追溯到2014年前后,个人站点便逐渐走向末路。但却总有新的个人博客网站,在这片互联网海洋漂浮着,或许是为了心中的梦想,亦或是记录着工作…

Kafka 从安装到应用

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌ Java知识图谱点击链接:体系化学习Java(Java面试专题) 💕💕 感兴趣的同学可以收…

MySQL实战解析底层---幻读是什么,幻读有什么问题?

目录 前言 幻读是什么? 幻读有什么问题? 如何解决幻读? 前言 为了便于说明问题,这一篇文章,就先使用一个小一点儿的表建表和初始化语句如下: 这个表除了主键id外,还有一个索引c&#xff0c…