PIL vs Opencv
0.前言
最近在做关于图像预处理加速的东西,在部署深度学习方案要处理一些图像方面的问题的时候,是想要能够快速的进行图像读取和转换的库的。
我产生了一个疑问 —— Pillow 和 Opencv二者哪一个更好一些呢?于是我进行了一系列的测试。
1.简要介绍
1.1 PIL
PIL(Python Imaging Library)是Python一个强大方便的图像处理库,名气也比较大。不过只支持到Python 2.7。
Pillow是PIL的一个派生分支,但如今已经发展成为比PIL本身更具活力的图像处理库。
PIL库可以完成图像归档和图像处理两方面功能需求:
(1)图像归档:对图像进行批处理、生成图像预览、图像格式转换等;
(2)图像处理:图像基本处理、像素处理、颜色处理等。
1.2 Opencv
OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。该程序库也可以使用英特尔公司的IPP进行加速处理。
OpenCV用 C++ 语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。这些语言的API接口函数可以透过在线文档获取。现在也提供对于C#, Ch,Ruby的支持。所有新的开发和算法都是用C++接口。一个使用CUDA的GPU接口也于2010年9月开始实现.
1.3 二者初始对比
从上述简要介绍来看,显然Opencv是一个更加强大和完善的库。而且,Opencv是C++语言,PIL是python,在效率方面应该是Opencv更有优势。
然而,在Pytorch中对于图像的读取变换均用的PIL——

图片来源:https://pytorch.org/docs/0.2.0/_modules/torchvision/transforms.html
是更加方便还是效率更高?
2.准备工作
由于我的预处理加速要在树莓派上进行,我的以下工作均是在树莓派4B上完成的。
2.1 平台信息
树莓派CPU信息如下:

2.2 安装PIL和Opencv
安装PIL:pip install pillow
安装Opencv:方法见树莓派(4):树莓派python3安装opencv
另外再安装一下matplotlib:sudo apt-get install python3-matplotlib(注:我用sudo pip install matplotlib没有成功)
2.3 查看版本信息
查看版本

运行代码
import PIL
import cv2
print("---PIL---")
print("PIL version is " + PIL.__version__)
print(PIL.__spec__)
print("---cv2---")
print("Opencv version is " + cv2.__version__)
print(cv2.__spec__)
输出结果为
---PIL---
PIL version is 5.4.1
ModuleSpec(name='PIL', loader=<_frozen_importlib_external.SourceFileLoader object at 0xb665bb10>, origin='/usr/lib/python3/dist-packages/PIL/__init__.py', submodule_search_locations=['/usr/lib/python3/dist-packages/PIL'])
---cv2---
Opencv version is 3.4.6
ModuleSpec(name='cv2.cv2', loader=<_frozen_importlib_external.ExtensionFileLoader object at 0xb65ff450>, origin='/home/pi/.local/lib/python3.7/site-packages/cv2/cv2.cpython-37m-arm-linux-gnueabihf.so')
2.4 验证安装成功
看一下能不能分别用PIL和Opencv查看图片——
验证代码为
import PIL
import cv2
import time
import numpy as np
from PIL import Image,ImageOps
import matplotlib.pylab as plt
def stage_1_PIL(filename):
img_pil = Image.open(filename)
img_pil = img_pil.resize((416,416))
return np.asarray(img_pil)

本文对比分析了PIL(Pillow)和Opencv在图像预处理中的性能,包括图片读取、resize及颜色空间转换。通过实验发现,两者在基本操作上的速度相近,但在复杂处理流程中,Opencv展现出更高的效率。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



