python
主页 > 脚本 > python >

python图像填充与裁剪/resize的实现代码

2022-09-03 | 佚名 | 点击:

前言

有时候我们需要把图片填充成某个数字的整数倍才能送进模型。
例如,有些模型下采样倍率是8倍,或者16倍,那么输入的长和高就分别应该是8或16的整数倍。如果图片达不到,除了拉伸图像(会造成比例改变),另一种就是先填充,后裁剪。
相信搞过NLP的同学并不陌生啦。

代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

from math import ceil

from torchvision.transforms.functional import to_tensor, to_pil_image

from PIL import Image

import torch

# 填充到最接近base整数倍的长和宽图像大小

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

有时候我们也要改变图片的宽和高。

1

2

3

4

5

6

7

8

9

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
相关文章
最新更新