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