前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python图片裁剪的两种方式——Pillow和OpenCV

Python图片裁剪的两种方式——Pillow和OpenCV

作者头像
软测小生
发布2019-08-06 17:45:42
4.3K0
发布2019-08-06 17:45:42
举报
文章被收录于专栏:软测小生软测小生

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

OpenCV对图片进行裁剪

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

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

代码语言:javascript
复制
import cv2
img = cv2.imread("./data/cut/thor.jpg")
print(img.shape) # (1080, 1920, 3)
cropped = img[0:128, 0:512]  # 裁剪坐标为[y0:y1, x0:x1]
cv2.imwrite("./data/cut/cv_cut_thor.jpg", cropped)
 
#上面是正向,即从左上角开始截图,下面的是从右下角开始反向截图
import cv2 
img = cv2.imread("./data/cut/thor.jpg")
cropped = img[-128:-1, 0:512]
cv2.imwrite("./data/cut/leftlower_cv_cut.jpg", cropped)

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

Pillow对图片进行裁剪

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

代码语言:javascript
复制
from PIL import Image
img = Image.open("./data/cut/thor.jpg")
print(img.size) #(1920, 1080)
cropped = img.crop((0, 0, 512, 128))  # (left, upper, right, lower)
cropped.save("./data/cut/pil_cut_thor.jpg")
 
#上面是正向,即从左上角开始截图,下面的是从右下角开始反向截图
from PIL import Image
img = Image.open("./data/cut/thor.jpg")
_width, _height = img.size 
cropped = img.crop((0, _height-128, 512, _height))  # (left, upper, right, lower)
cropped.save("./data/cut/leftlower_pil_cut.jpg")

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

另外使用PIL crop截取图像这里容易报错: AttributeError: '_idat' object has no attribute 'fileno'

During handling of the above exception, another exception occurred:

一般这样子的错误都是(left, upper, right, lower)-tuple 坐标值不对

要注意右边(right)和下边(lower)都要分别比左边(left)和上边(upper)大,否则就会报上面的错误.

其实可以理解为矩形对角线截图,在坐标系里面,第一个点的坐标比第二个点的坐标值大。

如下图:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软测小生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档