经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
python图像填充与裁剪/resize的实现代码
来源:jb51  时间:2022/8/31 17:26:47  对本文有异议

前言

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

代码

  1. from math import ceil
  2. from torchvision.transforms.functional import to_tensor, to_pil_image
  3. from PIL import Image
  4. import torch
  5. # 填充到最接近base整数倍的长和宽图像大小
  6. def get_padding_pic_mask(origin_png, result_png, result_mask_png, rgb=[[130, 206, 255]], base=4):
  7. # C, H, W
  8. src = Image.open(origin_png)
  9. src = to_tensor(src)
  10. # print(src.shape) # torch.Size([3, 800, 600])
  11. # channel: (R, G, B) / 255
  12. origin_h, origin_w = src.shape[1], src.shape[2]
  13. print('原图像大小, height: {}, width: {}'.format(origin_h, origin_w))
  14.  
  15. h = ceil(origin_h / base) * base
  16. w = ceil(origin_w / base) * base
  17.  
  18. img = torch.ones(3, h, w)
  19. # 如果想要填充是黑色则注释掉上一句,换下面这一句
  20. # img = torch.zeros(3, h, w)
  21.  
  22. img[:, :origin_h, :origin_w] = src
  23. # 保存填充后的图片
  24. to_pil_image(img).save(result_png)
  25.  
  26. # 处理一下mask
  27. mask = torch.tensor(rgb) / 255
  28.  
  29. mask = mask.view(3, 1, 1).repeat(1, h, w)
  30. # 保存填充后的mask
  31. to_pil_image(mask).save(result_mask_png)
  32.  
  33. # 图像输出后我们需要clip一下
  34. def clip_unpadding(input_png, output_png, origin_h, origin_w):
  35. # C, H, W
  36. img = Image.open(input_png)
  37. img = to_tensor(img)
  38. img = img[:, :origin_h, :origin_w]
  39. # 保存裁剪后的图片
  40. to_pil_image(img).save(output_png)
  41.  
  42. if __name__ == '__main__':
  43. # origin_png = 'pic/pic.jpg'
  44. # result_png = 'pic/pic_padding.jpg'
  45. # result_mask_png = 'pic/mask_padding.jpg'
  46. # get_padding_pic_mask(origin_png, result_png, result_mask_png)
  47.  
  48. input_png = 'pic/pic_padding.jpg'
  49. output_png = 'pic/pic_clip.jpg'
  50. # 原图像大小, height: 567, width: 390
  51. clip_unpadding(input_png, output_png, 567, 390)

resize

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

  1. from PIL import Image
  2. def resize_img(origin_png, resize_png, height, width):
  3. img = Image.open(origin_png)
  4. img = img.resize((width, height))
  5. img.save(resize_png)
  6. if __name__ == '__main__':
  7. origin_png = 'pic/white.jpg'
  8. resize_png = 'pic/white_resize.png'
  9. resize_img(origin_png, resize_png, 800, 600)

到此这篇关于python图像填充与裁剪/resize的文章就介绍到这了,更多相关python图像resize内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号