使用Python将图片转正方形的两种方法实例代码详解


Posted in Python onApril 29, 2020

一、将原图粘贴到一张正方形的背景上

def trans_square(image):
  r"""Open the image using PIL."""
  image = image.convert('RGB')
  w, h = image.size
  background = Image.new('RGB', size=(max(w, h), max(w, h)), color=(127, 127, 127)) # 创建背景图,颜色值为127
  length = int(abs(w - h) // 2) # 一侧需要填充的长度
  box = (length, 0) if w < h else (0, length) # 粘贴的位置
  background.paste(image, box)
  return background

二、切片填充的方式使用numpy创建背景,使用切片将原图的值填充到背景中。

def trans_square(image):
  	r"""Open the image using PIL."""
    img = image.convert('RGB')
    img = np.array(img, dtype=np.uint8) # 图片转numpy
    img_h, img_w, img_c = img.shape
    if img_h != img_w:
      long_side = max(img_w, img_h)
      short_side = min(img_w, img_h)
      loc = abs(img_w - img_h) // 2
      img = img.transpose((1, 0, 2)) if img_w < img_h else img # 如果高是长边则换轴,最后再换回来
      background = np.zeros((long_side, long_side, img_c), dtype=np.uint8) # 创建正方形背景
      background[loc: loc + short_side] = img[...] # 数据填充在中间位置
      img = background.transpose((1, 0, 2)) if img_w < img_h else background
    return Image.fromarray(img, 'RGB')

使用 nn.ZeroPad2d() 或者 nn.ConstantPad2d() 进行填充

def trans_square(image):
  r"""transform square.
  :return PIL image
  """
  img = transforms.ToTensor()(image)
  C, H, W = img.shape
  pad_1 = int(abs(H - W) // 2) # 一侧填充长度
  pad_2 = int(abs(H - W) - pad_1) # 另一侧填充长度
  img = img.unsqueeze(0) # 加轴
  if H > W:
    img = nn.ZeroPad2d((pad_1, pad_2, 0, 0))(img) # 左右填充,填充值是0
    # img = nn.ConstantPad2d((pad_1, pad_2, 0, 0), 127)(img) # 左右填充,填充值是127
  elif H < W:
    img = nn.ZeroPad2d((0, 0, pad_1, pad_2))(img) # 上下填充,填充值是0
    # img = nn.ConstantPad2d((0, 0, pad_1, pad_2), 127)(img) # 上下填充,填充值是127
  img = img.squeeze(0) # 减轴
  img = transforms.ToPILImage()(img)
  return img

ps:下面看下python 将图片转换成九宫格形式

用到的模块PIL(安装:pip install pillow

完整代码:

from PIL import Image 
import sys 
#先将 input image 填充为正方形 
def fill_image(image): 
  width, height = image.size   
  #选取长和宽中较大值作为新图片的 
  new_image_length = width if width > height else height   
  #生成新图片[白底] 
  new_image = Image.new(image.mode, (new_image_length, new_image_length), color='white')  #注意这个函数! 
  #将之前的图粘贴在新图上,居中  
  if width > height:#原图宽大于高,则填充图片的竖直维度 #(x,y)二元组表示粘贴上图相对下图的起始位置,是个坐标点。 
    new_image.paste(image, (0, int((new_image_length - height) / 2))) 
  else: 
    new_image.paste(image, (int((new_image_length - width) / 2),0))   
  return new_image 
def cut_image(image):
  width, height = image.size
  item_width = int(width / 3) 
  box_list = []
  # (left, upper, right, lower)
  for i in range(0,3):
    for j in range(0,3):
      #print((i*item_width,j*item_width,(i+1)*item_width,(j+1)*item_width))
      box = (j*item_width,i*item_width,(j+1)*item_width,(i+1)*item_width)
      box_list.append(box)
  image_list = [image.crop(box) for box in box_list]
  return image_list
#保存 
def save_images(image_list): 
  index = 1  
  for image in image_list: 
    image.save(str(index) + '.png', 'PNG') 
    index += 1 
if __name__ == '__main__': 
  file_path = "***"#填入图片名 
  image = Image.open(file_path)   
  #image.show() 
  image = fill_image(image) 
  image_list = cut_image(image) 
  save_images(image_list)

原图:

使用Python将图片转正方形的两种方法实例代码详解

运行程序后效果图:

使用Python将图片转正方形的两种方法实例代码详解

到此这篇关于使用Python将图片转正方形的两种方法的文章就介绍到这了,更多相关python 图片转正方形内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python操作xml文件详细介绍
Jun 09 Python
Python使用MONGODB入门实例
May 11 Python
python3利用tcp实现文件夹远程传输
Jul 28 Python
python:接口间数据传递与调用方法
Dec 17 Python
python ChainMap 合并字典的实现步骤
Jun 11 Python
python字典的遍历3种方法详解
Aug 10 Python
Python 使用 docopt 解析json参数文件过程讲解
Aug 13 Python
为什么说python适合写爬虫
Jun 11 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
Jul 01 Python
Python根据URL地址下载文件并保存至对应目录的实现
Nov 15 Python
python实现股票历史数据可视化分析案例
Jun 10 Python
如何使用python包中的sched事件调度器
Apr 30 Python
Python通过Pillow实现图片对比
Apr 29 #Python
Python unittest单元测试框架实现参数化
Apr 29 #Python
Python ORM框架Peewee用法详解
Apr 29 #Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 #Python
Pytorch十九种损失函数的使用详解
Apr 29 #Python
Python格式化输出--%s,%d,%f的代码解析
Apr 29 #Python
Python爬虫工具requests-html使用解析
Apr 29 #Python
You might like
学习使用PHP数组
2006/10/09 PHP
PHP程序员编程注意事项
2008/04/10 PHP
PHP教程 基本语法
2009/10/23 PHP
php学习笔记 类的声明与对象实例化
2011/06/13 PHP
php字符串函数学习之substr()
2015/03/27 PHP
Laravel 5框架学习之Eloquent 关系
2015/04/09 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
PHP 裁剪图片
2021/03/09 PHP
Prototype 工具函数 学习
2009/07/23 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
JavaScript仿flash遮罩动画效果
2016/06/15 Javascript
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
2016/11/21 Javascript
详解axios在vue中的简单配置与使用
2017/05/10 Javascript
跟老齐学Python之大话题小函数(2)
2014/10/10 Python
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
python3利用venv配置虚拟环境及过程中的小问题小结
2018/08/01 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
2020/09/17 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
Python如何合并多个字典或映射
2020/07/24 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
2021/02/07 Python
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
移动通信专业自荐信范文
2013/11/12 职场文书
高二物理教学反思
2014/02/08 职场文书
个人总结与自我评价
2014/09/18 职场文书
带刀到教室的检讨书
2014/10/04 职场文书
材料员岗位职责
2015/02/10 职场文书
毕业生个人总结
2015/02/28 职场文书
指导教师推荐意见
2015/06/05 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书
Python基础之元组与文件知识总结
2021/05/19 Python
MySQL详细讲解变量variables的用法
2022/06/21 MySQL
css中:last-child不生效的解决方法
2022/08/05 HTML / CSS