精彩文章免费看

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

公众号: 软测小生 , 获取更多精彩内容。

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

OpenCV对其进行裁剪

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

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) 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")
Pillow裁剪所得图片

另外使用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)大 ,否则就会报上面的错误.
其实可以理解为 矩形对角线截图 ,在坐标系里面,第一个点的坐标比第二个点的坐标值大。