Python图片裁剪的两种方式——Pillow和OpenCV
在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV。两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧。
OpenCV对其进行裁剪
首先,我们有一张原始图片,如下图所示:
然后,我们利用OpenCV对其进行裁剪,代码如下所示:
[code]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如何对图片进行裁剪,代码如下所示:
[code]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)大,否则就会报上面的错误.
其实可以理解为矩形对角线截图,在坐标系里面,第一个点的坐标比第二个点的坐标值大。
如下图:
---------------------
参考博客:https://blog.csdn.net/hfutdog/article/details/82351549
感谢作者:hfutdog
- python opencv对图像进行旋转且不裁剪图片的实现方法
- 源码推荐(12.23B):圆形方形两种方式的图片裁剪,滑动视图
- Python OpenCV学习笔记之:通过图像金字塔方式缩小放大图片
- 两种方式实现图片按比例响应式缩放、并自动裁剪的css技巧
- python-网络图片下载(两种方式)
- python读取图片的两种方式matplot和PIL
- python tornado 图片base64、流的 两种方式上传到前端界面。
- Android平台下使用OpenCV灰度化图片的两种方式
- python利用mongodb上传图片数据 : GridFS 与 bson两种方式
- caffe的python接口以opencv的方式读取视频,图片做分类时出错的解决
- opencv 遍历图片像素并生成新图片(两种方式对比)
- 详解Python下载图片并保存本地的两种方式
- python opencv对图像进行旋转且不裁剪图片的方法
- webapi上传图片的两种方式
- 通过OpenCV将随机数转换成图片 Python实现
- 关于Python+Opencv实现人脸检测的实验笔记(调用图片文件篇)
- python 读取并显示图片的两种方法
- Python调用OpenCV对图片人脸进行检测识别
- python3-opencv库(4)--图片像素运算,利用加权叠加调节图像对比度和亮度
- 用 Python 和 OpenCV 检测图片上的条形码