使用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打印scrapy蜘蛛抓取树结构的方法
Apr 08 Python
详解python时间模块中的datetime模块
Jan 13 Python
用Python实现KNN分类算法
Dec 22 Python
Python中常见的异常总结
Feb 20 Python
使用pandas批量处理矢量化字符串的实例讲解
Jul 10 Python
python实现多层感知器
Jan 18 Python
在Python中画图(基于Jupyter notebook的魔法函数)
Oct 28 Python
Python 实现加密过的PDF文件转WORD格式
Feb 04 Python
Python random库使用方法及异常处理方案
Mar 02 Python
学习python需要有编程基础吗
Jun 02 Python
python实现从ftp上下载文件的实例方法
Jul 19 Python
TensorFlow2.0使用keras训练模型的实现
Feb 20 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
YII Framework框架教程之缓存用法详解
2016/03/14 PHP
ThinkPHP中create()方法自动验证实例
2017/04/26 PHP
CakePHP框架Model关联对象用法分析
2017/08/04 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
Window.Open如何在同一个标签页打开
2014/06/20 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
2015/03/20 Javascript
jQuery.Form上传文件操作
2017/02/05 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
HTML中使背景图片自适应浏览器大小实例详解
2017/04/06 Javascript
ES6学习教程之Map的常用方法总结
2017/08/03 Javascript
解决vue页面DOM操作不生效的问题
2018/03/17 Javascript
详解Node.js中path模块的resolve()和join()方法的区别
2018/10/29 Javascript
Vue开发之封装上传文件组件与用法示例
2019/04/25 Javascript
JS实现秒杀倒计时特效
2020/01/02 Javascript
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
python实现从web抓取文档的方法
2014/09/26 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
2017/12/21 Python
使用Python读取大文件的方法
2018/02/11 Python
Python实现ping指定IP的示例
2018/06/04 Python
python中的turtle库函数简单使用教程
2018/07/23 Python
python实现对任意大小图片均匀切割的示例
2018/12/05 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
使用python检查yaml配置文件是否符合要求
2020/04/09 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
2020/07/23 Python
简单的命令查看安装的python版本号
2020/08/28 Python
详解pandas映射与数据转换
2021/01/22 Python
如何给HTML标签中的文本设置修饰线
2019/11/18 HTML / CSS
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
韩国最大的购物网站:Gmarket
2019/06/20 全球购物
请解释一下webService? 如何用.net实现webService
2014/06/09 面试题
请解释流与文件有什么不同
2016/07/29 面试题
大学学年自我鉴定
2013/10/28 职场文书
《鱼游到了纸上》教学反思
2014/02/20 职场文书
销售员岗位职责范本
2015/04/11 职场文书