Python实现图片裁剪的两种方式(Pillow和OpenCV)


Posted in Python onOctober 30, 2019

在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV。两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧。

首先,我们有一张原始图片,如下图所示:

Python实现图片裁剪的两种方式(Pillow和OpenCV)

原始图片

然后,我们利用OpenCV对其进行裁剪,代码如下所示:

import cv2
 
img = cv2.imread("./data/cut/thor.jpg")
print(img.shape)
cropped = img[0:128, 0:512] # 裁剪坐标为[y0:y1, x0:x1]
cv2.imwrite("./data/cut/cv_cut_thor.jpg", cropped)

这里,我们先用imread方法读取待裁剪的图片,然后查看它的shape,shape的输出是(1080, 1920, 3),输出的顺序的是高度、宽度、通道数。之后我们利用数组切片的方式获取需要裁剪的图片范围。这里需要注意的是切片给出的坐标为需要裁剪的图片在原图片上的坐标,顺序为[y0:y1, x0:x1],其中原图的左上角是坐标原点。最后我们用cv2.imwrite()方法将裁剪得到的图片保存到本地(第一个参数为图片名,第二参数为需要保存的图片),如图所示:

Python实现图片裁剪的两种方式(Pillow和OpenCV)

OpenCV裁剪所得图片

接下来,我们看一下使用Pillow如何对图片进行裁剪,代码如下所示:

from PIL import Image
 
img = Image.open("./data/cut/thor.jpg")
print(img.size)
cropped = img.crop((0, 0, 512, 128)) # (left, upper, right, lower)
cropped.save("./data/cut/pil_cut_thor.jpg")

首先我们使用open方法读取图片,然后查看它的size(这里的size和OpenCV中的shape是类似的),size的输出是(1920, 1080),也就是图片的宽度和高度。之后我们调用crop方法来对图片进行裁剪,crop需要给定一个box参数,box是一个四元组,元组中元素的顺序是需要裁剪得到的图片在原图中的左、上、右、下坐标,即(left, upper, right, lower)。然后,我们使用save方法保存裁剪得到的图片。如下图所示,Pillow可以同样完成OpenCV裁剪图片的工作。

Python实现图片裁剪的两种方式(Pillow和OpenCV)

Pillow裁剪所得图片

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python网络编程之文件下载实例分析
May 20 Python
详解Python中的日志模块logging
Jun 19 Python
Python的迭代器和生成器
Jul 29 Python
Python for Informatics 第11章 正则表达式(一)
Apr 21 Python
Python连接数据库学习之DB-API详解
Feb 07 Python
Python导入模块时遇到的错误分析
Aug 30 Python
Python实现判断一个字符串是否包含子串的方法总结
Nov 21 Python
python实现诗歌游戏(类继承)
Feb 26 Python
opencv与numpy的图像基本操作
Mar 08 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
Apr 27 Python
Python socket模块ftp传输文件过程解析
Nov 05 Python
Keras模型转成tensorflow的.pb操作
Jul 06 Python
Python使用Opencv实现图像特征检测与匹配的方法
Oct 30 #Python
Python OpenCV图像指定区域裁剪的实现
Oct 30 #Python
使用Python刷淘宝喵币(低阶入门版)
Oct 30 #Python
Python自动化完成tb喵币任务的操作方法
Oct 30 #Python
Flask框架 CSRF 保护实现方法详解
Oct 30 #Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
Oct 30 #Python
python基于K-means聚类算法的图像分割
Oct 30 #Python
You might like
php $_ENV为空的原因分析
2009/06/01 PHP
PHP语言中global和$GLOBALS[]的分析 之二
2012/02/02 PHP
解析php中的fopen()函数用打开文件模式说明
2013/06/20 PHP
php实现转换html格式为文本格式的方法
2016/05/16 PHP
php post json参数的传递和接收处理方法
2018/05/31 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
2019/04/10 PHP
关于javascript中this关键字(翻译+自我理解)
2010/10/20 Javascript
浅谈Javascript面向对象编程
2011/11/15 Javascript
正则表达式搭配js轻松处理json文本方便而老古
2013/02/17 Javascript
JS的千分位算法实现思路
2013/07/31 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
Sort()函数的多种用法
2016/03/20 Javascript
jQuery实现点击水纹波动动画
2016/04/10 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
AngularJs Understanding the Controller Component
2016/09/02 Javascript
基于Vue 2.0的模块化前端 UI 组件库小结
2017/12/21 Javascript
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
微信小程序自定义tabBar组件开发详解
2020/09/24 Javascript
js实现电灯开关效果
2021/01/19 Javascript
[15:56]Heroes18_暗影萨满(完美)
2014/10/31 DOTA
[01:14:35]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第一局
2016/02/26 DOTA
[04:09]2018年度DOTA2社区贡献奖-完美盛典
2018/12/16 DOTA
[00:05]ChinaJoy现场 DOTA2玩家高呼“CN DOTA BEST DOTA”
2019/08/04 DOTA
python正则分组的应用
2013/11/10 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
Html5大文件断点续传实现方法
2015/12/05 HTML / CSS
澳大利亚男士西服品牌:M.J.Bale
2018/02/06 全球购物
高二学生评语大全
2014/04/25 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
班主任自我评价范文
2015/03/11 职场文书
公司行政管理制度范本
2015/08/05 职场文书
如何使JavaScript休眠或等待
2021/04/27 Javascript
阿里云服务器Ubuntu 20.04上安装Odoo 15
2022/05/20 Servers
全网非常详细的pytest配置文件
2022/07/15 Python