Python实现keep_ratio批量缩放图片和label尺寸

本文介绍了一种图像缩放及对应标注文件调整的方法,通过Python实现,详细讲解了如何保持目标检测框的位置准确,适用于计算机视觉项目的数据预处理。
import os
import cv2
from PIL import Image

#image和label原路径和缩放后的保存路径
label_path="/home/yangguide/Downloads/training/label_2"
new_label_path="/home/yangguide/Downloads/training/label"
image_path="/home/yangguide/Downloads/training/image_2"
new_image_path="/home/yangguide/Downloads/training/image"

for root,dirs,files in os.walk(label_path):
    for name in files:
         if name.endswith(".txt"):
            filename=root+"/"+name     #原label里.txt文件全路径名
            filename2=new_label_path+"/"+name  #缩放后的label里.txt文件全路径名
            
            file_name = name.split('.')[0]  
            file_path=image_path+"/"+file_name+".jpg"
            img = Image.open(file_path)
            weight = img.size[0]
            height = img.size[1]           
            
            target_size=[320,480]   #打算缩放的尺寸
            img = cv2.imread(file_path)
            old_size= img.shape[0:2]
            ratio = min(float(target_size[i])/(old_size[i]) for i 
def update_adjusted_info(self): first_image_path = self.selected_files[0] original_pixmap = QPixmap(first_image_path) if original_pixmap.isNull(): self.ui.label_3.setText("调整后:加载失败") return orig_width = original_pixmap.width() orig_height = original_pixmap.height() orig_file_size_bytes = os.path.getsize(first_image_path) # 原始字节数 orig_pixel_count = orig_width * orig_height try: target_width = int(self.ui.comboBox.currentText()) target_height = int(self.ui.comboBox_2.currentText()) except ValueError: target_width = orig_width target_height = orig_height keep_aspect = self.ui.checkBox.isChecked() # === 步骤1:是否保持宽高比?=== final_width, final_height = target_width, target_height if keep_aspect: orig_ratio = orig_width / orig_height target_ratio = target_width / target_height if target_ratio > orig_ratio: # 目标更宽 → 以高度为准 final_width = int(target_height * orig_ratio) final_height = target_height else: # 目标更高 → 以宽度为准 final_height = int(target_width / orig_ratio) final_width = target_width # 注意:这里不再限制 final_width/height <= 原图! # ✅ 允许放大(比如双三次插值上采样) final_width = max(1, final_width) final_height = max(1, final_height) new_pixel_count = final_width * final_height # === 步骤2:估算新文件大小(假设大小 ∝ 像素数量)=== estimated_file_size_bytes = orig_file_size_bytes * (new_pixel_count / orig_pixel_count) # ⛔ 关键限制:即使放大了像素,文件大小也不能超过原文件 final_file_size_bytes = min(estimated_file_size_bytes, orig_file_size_bytes) # === 步骤3:格式化输出大小 === def format_bytes(size_in_bytes): if size_in_bytes < 1024: return f"{size_in_bytes:.0f} B" elif size_in_bytes < 1024 * 1024: return f"{size_in_bytes / 1024:.2f} KB" elif size_in_bytes < 1024 * 1024 * 1024: return f"{size_in_bytes / (1024 * 1024):.2f} MB" else: return f"{size_in_bytes / (1024 * 1024 * 1024):.2f} GB" # === 步骤4:更新 label_3 显示结果 === self.ui.label_3.setText( f"调整后:JPG | 尺寸:{final_width} × {final_height} | " f"占用:{format_bytes(final_file_size_bytes)}" ) 给我修改后的函数
最新发布
11-08
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值