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

news/2024/10/29 2:28:14/

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

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

调整方式1

代码如下:

import torchvision.transforms as transforms
from PIL import Image
import ostransform = 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 osdef resize(path_image, out_path):im = cv2.imread(path_image)height, width = im.shape[:2]  # 取彩色图片的长、宽。ratio_h = height / target_sizeration_w = width / target_sizeratio = 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)) / 2b = (target_size - int(height / ratio)) / 2constant = 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 cv2import ostarget_size = 600def resize(path_image, out_path):im = cv2.imread(path_image)height, width = im.shape[:2]  # 取彩色图片的长、宽。ratio_h = height / target_sizeration_w = width / target_sizeratio = 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)) / 2b = (target_size - int(height / ratio)) / 2constant = 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 constantif __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.ppmy.cn/news/597881.html

相关文章

【Redis】JVM进程缓存之Caffeine

目录 一、什么是JVM进程缓存 二、分布式缓存与JVM进程缓存 三、Caffeine相关API 一、什么是JVM进程缓存 缓存在日常开发中启着至关重要的作用,由于是存储在内存中的,数据的读取速度是非常快的,能大量的减少对数据库的访问次数,…

react+antd 封装图片上传组件。

问题描述:因antd本身缺陷,我们上传成功后,再次删除后,系统会默认为已经上传,导致不为空验证失效。 import { Form, Upload, message } from antd; import { PlusOutlined } from ant-design/icons;import { BASE_URL }…

前端设计模式-策略模式

什么是策略模式 策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响使用算法的客户。 要解决的问题 假设我们需要写一个计算年终奖的函数…

东北方言集锦T

Ttā[他爹] tā diē 旧时妇女结婚生子后,对人称自己的丈夫。[例]张大嫂一边喂孩子,一边对张铁匠说:“~,天都啥时辰了,你还不出去,还磨蹭啥?”tāi[胎歪] tāiwai 可叠成“胎胎歪歪”…

喻世明言 第三十一卷 闹阴司司马貌断狱(讲三国是如何开始的)

扰扰劳生,待足何时是足?据见定、随家丰俭,便堪龟缩。得意浓时休进步,须防 世事多番覆。枉教人、白了少年头,空碌碌。 谁不愿,黄金屋?谁不愿,千锺粟?算五行、不是这般题目…

千里走单骑·故事简介

建安五年(公元二百年)曹操作了丞相,更不把皇帝放在眼里,国舅董承自从看了皇帝写在衣带上的诏书,又苦无对策除掉曹操,心里愤慨、忧虑,便病倒了。献帝让太医吉平来给他治病。吉平看了皇帝密诏,决心要除掉曹操。两人便合议设下了计谋。不料隔墙有耳,董承的家奴秦庆童因与…

庞德致曹操:关于战胜关羽的可行性报告

敬爱的魏王千岁: 您好! 我是庞德——就是您一直记不住名字,老是称呼我“那个谁……那个绿脸的谁”那个。首先,我对自己今天上午的表现向您道歉:在您询问谁敢协助于禁将军去战关羽的时候,我从最后面…

一)关羽和赵云在敌人心目中的对比

一)关羽和赵云在敌人心目中的对比 1,关羽有一次被敌人称做英雄,庞德。赵云有五次被敌人称做英雄,曹操、李典、夏侯懋、郭淮、万政。 2,《关云长单刀赴会》中,“吕蒙、甘宁见云长手提大刀,亲握鲁…