python圖像填充與裁剪/resize的實(shí)現(xiàn)代碼
前言
有時(shí)候我們需要把圖片填充成某個(gè)數(shù)字的整數(shù)倍才能送進(jìn)模型。
例如,有些模型下采樣倍率是8倍,或者16倍,那么輸入的長(zhǎng)和高就分別應(yīng)該是8或16的整數(shù)倍。如果圖片達(dá)不到,除了拉伸圖像(會(huì)造成比例改變),另一種就是先填充,后裁剪。
相信搞過NLP的同學(xué)并不陌生啦。
代碼
from math import ceil
from torchvision.transforms.functional import to_tensor, to_pil_image
from PIL import Image
import torch
# 填充到最接近base整數(shù)倍的長(zhǎng)和寬圖像大小
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
有時(shí)候我們也要改變圖片的寬和高。
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)到此這篇關(guān)于python圖像填充與裁剪/resize的文章就介紹到這了,更多相關(guān)python圖像resize內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python opencv實(shí)現(xiàn)證件照換底功能
這篇文章主要為大家詳細(xì)介紹了python opencv實(shí)現(xiàn)證件照換底功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
pandas如何將DataFrame?轉(zhuǎn)為txt文本去除引號(hào)
這篇文章主要介紹了pandas如何將DataFrame?轉(zhuǎn)為txt文本去除引號(hào),文中補(bǔ)充介紹了DataFrame導(dǎo)CSV?txt?||?每行有雙引號(hào)的原因及解決辦法,感興趣的朋友跟隨小編一起看看吧2024-01-01
openCV入門學(xué)習(xí)基礎(chǔ)教程第三篇
pencv是用于快速處理圖像處理、計(jì)算機(jī)視覺問題的工具,支持多種語言進(jìn)行開發(fā)如c++、python、java等,下面這篇文章主要給大家介紹了關(guān)于openCV入門學(xué)習(xí)基礎(chǔ)教程的相關(guān)資料,需要的朋友可以參考下2022-11-11
一文教會(huì)你用nginx+uwsgi部署自己的django項(xiàng)目
uWSGI是一個(gè)Web服務(wù)器,它實(shí)現(xiàn)了WSGI協(xié)議、uwsgi、http等協(xié)議,下面這篇文章主要給大家介紹了關(guān)于用nginx+uwsgi部署自己的django項(xiàng)目的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
Python中time.sleep(0.001)是否真的只等待1毫秒
這篇文章主要介紹了Python中time.sleep(0.001)是否真的只等待1毫秒,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Python實(shí)現(xiàn)基于TCP UDP協(xié)議的IPv4 IPv6模式客戶端和服務(wù)端功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)基于TCP UDP協(xié)議的IPv4 IPv6模式客戶端和服務(wù)端功能,結(jié)合實(shí)例形式分析了Python基于TCP UDP協(xié)議的IPv4 IPv6模式客戶端和服務(wù)端數(shù)據(jù)發(fā)送與接收相關(guān)操作技巧,需要的朋友可以參考下2018-03-03

