網(wǎng)站首頁 編程語言 正文
前言
有時候我們需要把圖片填充成某個數(shù)字的整數(shù)倍才能送進(jìn)模型。
例如,有些模型下采樣倍率是8倍,或者16倍,那么輸入的長和高就分別應(yīng)該是8或16的整數(shù)倍。如果圖片達(dá)不到,除了拉伸圖像(會造成比例改變),另一種就是先填充,后裁剪。
相信搞過NLP的同學(xué)并不陌生啦。
代碼
from math import ceil
from torchvision.transforms.functional import to_tensor, to_pil_image
from PIL import Image
import torch
# 填充到最接近base整數(shù)倍的長和寬圖像大小
def get_padding_pic_mask(origin_png, result_png, result_mask_png, rgb=[[130, 206, 255]], base=4):
# C, H, W
src = Image.open(origin_png)
src = to_tensor(src)
# print(src.shape) # torch.Size([3, 800, 600])
# channel: (R, G, B) / 255
origin_h, origin_w = src.shape[1], src.shape[2]
print('原圖像大小, height: {}, width: {}'.format(origin_h, origin_w))
h = ceil(origin_h / base) * base
w = ceil(origin_w / base) * base
img = torch.ones(3, h, w)
# 如果想要填充是黑色則注釋掉上一句,換下面這一句
# img = torch.zeros(3, h, w)
img[:, :origin_h, :origin_w] = src
# 保存填充后的圖片
to_pil_image(img).save(result_png)
# 處理一下mask
mask = torch.tensor(rgb) / 255
mask = mask.view(3, 1, 1).repeat(1, h, w)
# 保存填充后的mask
to_pil_image(mask).save(result_mask_png)
# 圖像輸出后我們需要clip一下
def clip_unpadding(input_png, output_png, origin_h, origin_w):
# C, H, W
img = Image.open(input_png)
img = to_tensor(img)
img = img[:, :origin_h, :origin_w]
# 保存裁剪后的圖片
to_pil_image(img).save(output_png)
if __name__ == '__main__':
# origin_png = 'pic/pic.jpg'
# result_png = 'pic/pic_padding.jpg'
# result_mask_png = 'pic/mask_padding.jpg'
# get_padding_pic_mask(origin_png, result_png, result_mask_png)
input_png = 'pic/pic_padding.jpg'
output_png = 'pic/pic_clip.jpg'
# 原圖像大小, height: 567, width: 390
clip_unpadding(input_png, output_png, 567, 390)
resize
有時候我們也要改變圖片的寬和高。
from PIL import Image
def resize_img(origin_png, resize_png, height, width):
img = Image.open(origin_png)
img = img.resize((width, height))
img.save(resize_png)
if __name__ == '__main__':
origin_png = 'pic/white.jpg'
resize_png = 'pic/white_resize.png'
resize_img(origin_png, resize_png, 800, 600)
原文鏈接:https://blog.csdn.net/weixin_43850253/article/details/126445783
相關(guān)推薦
- 2022-03-29 Python數(shù)據(jù)類型-序列sequence_python
- 2023-04-02 使用C#連接SQL?Server的詳細(xì)圖文教程_C#教程
- 2022-10-21 React封裝全屏彈框的方法_React
- 2022-07-04 python如何使用replace做多字符替換_python
- 2022-05-20 SpringBoot整合Mybatis演示
- 2022-10-01 sql語法中的concat()函數(shù)詳解_MsSql
- 2022-08-30 詳解Python單元測試的兩種寫法_python
- 2022-07-14 React父子組件傳值(組件通信)的實(shí)現(xiàn)方法_React
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支