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爬虫之抓取百度贴吧并存储到本地txt文件改进版
Nov 06 Python
使用Python判断质数(素数)的简单方法讲解
May 05 Python
python中正则的使用指南
Dec 04 Python
Python实现的概率分布运算操作示例
Aug 14 Python
win10系统下Anaconda3安装配置方法图文教程
Sep 19 Python
Python 保存矩阵为Excel的实现方法
Jan 28 Python
python 判断linux进程,并杀死进程的实现方法
Jul 01 Python
python实现ip地址的包含关系判断
Feb 07 Python
python 安装移动复制第三方库操作
Jul 13 Python
Python 合并拼接字符串的方法
Jul 28 Python
使用python爬取抖音app视频的实例代码
Dec 01 Python
python面向对象版学生信息管理系统
Jun 24 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中的extract的作用分析
2008/04/09 PHP
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
2013/06/28 PHP
php文件上传简单实现方法
2015/01/24 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
laravel 配置路由 api和web定义的路由的区别详解
2019/09/03 PHP
javascript得到XML某节点的子节点个数的脚本
2008/10/11 Javascript
javascript 写类方式之二
2009/07/05 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
js浮动图片的动态效果
2013/07/10 Javascript
js setTimeout 常见问题小结
2013/08/13 Javascript
js输入框邮箱自动提示功能代码实现
2013/12/10 Javascript
Jquery跳到页面指定位置的方法
2014/05/12 Javascript
jQuery简单几行代码实现tab切换
2015/03/10 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
使用jQuery在移动页面上添加按钮和给按钮添加图标
2015/12/04 Javascript
js中遍历Map对象的简单实例
2016/08/08 Javascript
js 弹出虚拟键盘修改密码的简单实例
2016/10/10 Javascript
JS实现动态添加DOM节点和事件的方法示例
2017/04/28 Javascript
10行原生JS实现文字无缝滚动(超简单)
2018/01/02 Javascript
vue实现记事本功能
2019/06/26 Javascript
详解Angular cli配置过程记录
2019/11/07 Javascript
[01:13:51]TNC vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python中__call__用法实例
2014/08/29 Python
Windows8下安装Python的BeautifulSoup
2015/01/22 Python
Python的Flask框架中@app.route的用法教程
2015/03/31 Python
python中set()函数简介及实例解析
2018/01/09 Python
python实现两张图片的像素融合
2019/02/23 Python
Django Auth用户认证组件实现代码
2020/10/13 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
Python-openpyxl表格读取写入的案例详解
2020/11/02 Python
css3强大的动画效果animate使用说明及浏览器兼容介绍
2013/01/09 HTML / CSS
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
发展部经理职责规定
2014/02/22 职场文书
预防煤气中毒方案
2014/06/16 职场文书
Log4j.properties配置及其使用
2021/08/02 Java/Android
Vertica集成Apache Hudi重磅使用指南
2022/03/31 Servers