原文:https://blog.csdn.net/hfutdog/article/details/82351549

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

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

然后,我们利用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()方法将裁剪得到的图片保存到本地(第一个参数为图片名,第二参数为需要保存的图片),如图所示:

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裁剪图片的工作。

Pillow裁剪所得图片

Python:实现图片裁剪的两种方式——Pillow和OpenCV的更多相关文章

  1. python模块的导入的两种方式区别详解

    Python 有两种导入模块的方法.两种都有用,你应该知道什么时候使用哪一种方法.一种方法,import module,另一种是from module import,下面是 from module i ...

  2. Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)

    实现接口类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...

  3. Python 防止mysql 注入的两种方式

    Python防止sql注入一般有两种方法 1.escape_string   MySQLdb.escape_string(param) 注意:如果报错出现 'ascii' codec can't en ...

  4. python安装第三方包的两种方式

    最近研究QQ空间.微博的(爬虫)模拟登录,发现都涉及RSA算法.于是需要下一个RSA包(第三方包).折腾了很久,主要是感觉网上很多文章对具体要在哪里操作写得不清楚.这里做个总结,以免自己哪天又忘了. ...

  5. python数字转换为字符串的两种方式

    主要包括两种形式进行转换: 第一种是str(),将值转换为用户便于阅读的形式: 另一种是repr(),将值转换为合法的python表达式. >>> print repr(" ...

  6. ios_图片放大的两种方式transform和frame

    frame改变x值y值的方式放大图片,是从左上开始放大. frame改变控件宽高的方式放大图片,是从中心开始放大. 原头像大小 用frame改变宽高 transform方式放大图片,从中心开始放大

  7. python连接redis数据库的两种方式

    代码: # __author__ = 'STEVEN' import redis # 方式1,直接连接 # r = redis.Redis(host='192.168.43.22',port=6379 ...

  8. python list dict 去重的两种方式

    def dedupe(items, key=None): seen = set() for item in items: val = item if key is None else key(item ...

  9. python类的继承的两种方式

    class Animal(object): """docstring for Animal""" def __init__(self, na ...

随机推荐

  1. Apache Phoenix系列 | 从入门到精通(转载)

    原文地址:https://cloud.tencent.com/developer/article/1498057 来源: 云栖社区 作者: 瑾谦 By 大数据技术与架构 文章简介:Phoenix是一个 ...

  2. mage Ansible学习3 ansible role实例

    一.ansible配置文件解析 1./etc/ansible/ansible.cfg配置文件详解 [root@node3 ~]# cat /etc/ansible/ansible.cfg |grep ...

  3. js之大文件断点续传

    文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...

  4. 1-STM32物联网开发WIFI+GPRS(Wi-Fi入门篇)_简介

    这期的教程为公开教程将用这块开发板学习WIFI(SDK) 实现哪些功能呢!无非就是那写网络功能...但是涉及的挺多 最近一直在忙方案篇的内容,所以公开版的例程耽误了,现在开始补上 我准备改变一下提供资 ...

  5. codevs1580单词游戏

    题目描述中说: 单词为at,k=8则新单词为ib 推移规则是:如果k为正数则下推,否则上推,当推移超越边界时回到另一端继续推移. 但在我做题时发现: 这个描述与数据所要求的是完全相反的!!!! 样例1 ...

  6. 【一起来烧脑】一步学会CSS3体系

    [外链图片转存失败(img-yfi1VPyy-1563434266398)(https://upload-images.jianshu.io/upload_images/11158618-fc8784 ...

  7. mac Understand 安装破解

    下载:链接:https://pan.baidu.com/s/1UvxgFnjv9pRVJmZO-J2OrQ  密码:nyd4 启动后,开始激活,点击enter License code 点击“use ...

  8. Git的使用(4) —— 分支的概念和使用

    1. 概念 在SVN中,分支并不是很便于使用.但是在Git中,分支就变成了特别好用的功能呢,受到大多数使用者的青睐. 分支中有几个概念: (1) 分支:分支就是每一次提交创建的点连接成的线. (2) ...

  9. linux安装phantomjs,-bash: /usr/local/bin/phantomjs: is a directory解决方案

    首先安装依赖——fontconfig和freetypeyum install fontconfig freetype2在官网上下载对应版本的包http://phantomjs.org/download ...

  10. SET NOCOUNT 的用法

    SET NOCOUNT 使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息.   语法 SET NOCOUNT { ON | OFF }   注释 当 SET NOCOUNT  ...