python中 OpenCV和Pillow处理图像操作及时间对比
作者:Liekkas?Kono 发布时间:2021-02-04 16:46:52
标签:python,OpenCV,Pillow,处理,图像
引言
最近再做图像处理相关的操作的时间优化,用到了OpenCV和Pillow两个库,两个库各有优缺点。各位小伙伴需要按照自己需求选用。
本篇博客做了简单整理,对常用操作做了对比整理,以及给出具体运行时间说明。
OpenCV和Pillow的优缺点对比
库 | 优点 | 缺点 |
---|---|---|
OpenCV | 由C和C++编写,跨平台,有着多个语言的实现,部署比较方便 | 对显示中文支持较差、Python下常用函数不是太好看-_-! |
Pillow | 常用函数操作封装较好,对显示中文字体有着很好的支持 | 处理时间较慢 |
测试环境:
OS: Windows10
Python: 3.7.13
OpenCV: 4.6.0.66
numpy: 1.21.6
Pillow: 9.2.0
测试图像 :
PNG图像: test_demo.png
JPG图像:test_demo.jpg
读取图像的通道顺序区别:
OpenCV读取图像,通道顺序是:BGR
Pillow读取图像,通道顺序是:RGB
获得图像shape区别:
OpenCV.shape是
(height, width, channel
Pillow.size是
(width, height)
示例代码:
import cv2
from PIL import Image
img_path = 'images/test_demo.png'
cv_img = cv2.imread(img_path)
height, width, channel = cv_img.shape
pillow_img = Image.open(img_path)
width, height = pillow_img.size
读写图像
读图像
示例代码:
import cv2
from PIL import Image
import numpy as np
png_img_path = 'images/test_demo.png'
jpg_img_path = 'images/test_demo.jpg'
# 由jupyter notebook中魔法命令:%%timeit测得
# 169 ms ± 1.68 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
cv_img = cv2.imread(png_img_path)
# 52.9 ms ± 541 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)
cv_img = cv2.imread(jpg_img_path)
# 300 ms ± 8.45 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
pillow_img = Image.open(png_img_path)
pillow_img = np.array(pillow_img)
# 47.4 ms ± 1.87 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
pillow_img = Image.open(jpg_img_path)
pillow_img = np.array(pillow_img)
小结:
读取图像格式为PNG,且都转为np.array格式,优先选择OpenCV。
读取图像格式为JPG,且都转为np.array格式,速度相差不大,按需选取即可。
写图像
示例代码:
save_png_path = 'output/result.png'
save_jpg_path = 'output/result.jpg'
cv_img = cv2.imread(png_img_path)
pillow_img = Image.open(png_img_path)
# 346 ms ± 11.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
cv2.imwrite(save_png_path, cv_img)
# 158 ms ± 4.03 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
cv2.imwrite(save_jpg_path, cv_img)
# 2.81 s ± 38.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
pillow_img.save(save_png_path)
# 51.3 ms ± 1.72 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
t = pillow_img.convert('RGB')
t.save(save_jpg_path)
小结:
写图像格式为PNG,优先选择OpenCV。
写图像格式为JPG,选择Pillow。
缩放图像
示例代码:
png_img_path = 'images/test_demo.png'
resize_shape = (2048, 2048)
cv_img = cv2.imread(png_img_path)
pillow_img = Image.open(png_img_path)
# 6.93 ms ± 173 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
cv2.resize(cv_img, resize_shape, interpolation=cv2.INTER_CUBIC)
# 151 ms ± 2.21 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
pillow_img.resize(resize_shape, resample=Image.Resampling.BICUBIC)
小结: OpenCV速度完胜Pillow
旋转图像
示例代码:
angle = 38
# 23.6 ms ± 732 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)
h, w = cv_img.shape[:2]
M = cv2.getRotationMatrix2D((w / 2, h / 2), angle, 1)
rot_img = cv2.warpAffine(cv_img, M, (w, h))
# 82.1 ms ± 2.37 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
rot_img_pillow = np.array(pillow_img.rotate(angle))
小结:OpenCV速度完胜Pillow
总结:
如果可以选择,优先选择OpenCV处理图像
Pillow可以用来处理显示中文相关问题
来源:https://blog.csdn.net/shiwanghualuo/article/details/127029583
0
投稿
猜你喜欢
- 1、说明迭代器还具有迭代用户定制类别的能力。迭代对象需要支持两种方式:_iter__()和next(),前者返回迭代本身,后者返回下一个元素
- 前言range() 和 xrange() 是两个函数,可用于在 Python的 for 循环中迭代一定次数。在 Python 3 中,没有
- 摘要Beautiful Soup 是一个可以从 HTML 或 XML 格式文件中提取数据的 Python 库,他可以将HTML 或 XML
- 正文开始:服务器端代码:# 再来简单的测试,这个是服务器端import socketimport sysBUF_SIZE = 1024ip_
- 1 scipy.spatialfrom scipy import spatial在scipy.spatial中最重要的模块应该就是距离计算模
- 一、前言Python提供两种方法进行字符串格式化1、利用百分号来格式化字符串,现在Python已停止更新这种方法2、字符串的format方法
- pytorch中的 2D 卷积层 和 2D 反卷积层 函数分别如下:class torch.nn.Conv2d(in_channels, o
- 刚刚上网搜了一下如何用python统计列表中不同元素的数量,发现很少,找了半天。我自己来写一种方法。代码如下list=[1,1,2,2,3]
- 又发一个js版幻灯片,接口比较少,但功能和外观都还不错的,可自定义切换时间:)method: adRotator.initialize(容器
- 你是否发现,在浩如烟海的应用程序堆里,具有漂亮图标和清爽名字的 App 更容易被用户喜爱。作为开发者,面对这自己的作品,能否自问一句:“从图
- 使用实例引用类的属性时,会发生动态绑定。即python会在实例每次引用类属性时,将对应的类属性绑定到实例上。动态绑定的例子:class A:
- 本文实例为大家分享了Python读写Excel表格的具体代码,供大家参考,具体内容如下python读取Excel表格:import xlrd
- 1.颜色空间转换(RGB转HSV)为了较准确的调红色和绿色的HSV,我使用cv2.createTrackbar()函数创建了六个滚动条#创建
- 前言在上一篇文中,我们介绍了关于Python正则表达式的基础,那么在这一篇文章里,我们将总结一下正则表达式关于捕获的用法。下面话不多说,来看
- 前言采集教务系统成绩单是一个非常有意义的项目。在现代教育中,教务系统已经成为了学校管理和教学工作的重要组成部分。然而,由于各种原因,教务系统
- 讲起学生成绩管理系统,从大一C语言的课程设计开始,到大二的C++课程设计都是这个题,最近在学树莓派,好像树莓派常用Python编程,于是学了
- 之前,我曾转过一个单元测试框架系列的文章,里面介绍了 unittest、nose/nose2 与 pytest 这三个最受人欢迎的 Pyth
- 我们选择一种问题的解决办法,通常需要考虑到想要达到的效果,还有最重要的是这个办法本身的优缺点有哪些,与其他的方法对比哪一个更好。之前小编之前
- 1,flask中内置的过滤器模板中常用方法:{#过滤器调用方式{{变量|过滤器名称}} #} <!-- safe过滤器,可
- 类中的七种语法说明-属性 -静态属性 -方法 -静态方法 -类常量 -构造函数 -析构函数<?php class Stud