python中 OpenCV和Pillow处理图像操作及时间对比

目录
  • 引言
  • 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

测试图像 :

读取图像的通道顺序区别:

  • 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可以用来处理显示中文相关问题

到此这篇关于python中 OpenCV和Pillow处理图像操作及时间对比的文章就介绍到这了,更多相关python OpenCV处理图像 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python详细讲解图像处理的而两种库OpenCV和Pillow

    目录 一.简介 1.1 图像处理-OpenCV 1.2 图像处理- PIL和Pillow 二. 常用图像类型 2.1 二值图像 2.2 灰度图像 2.3 RGB图像 2.4 常用颜色空间简介 三.OpenCV图像读写与显示 3.1 读入图像 3.2 显示图像 3.3 写出图像 四.图像几何变换 4.1 图像平移 4.2 图像旋转 4.3 图像缩放 一.简介 实现计算机视觉任务的过程中,不可避免地需要对图像进行读写操作以及图像预处理操作,下面介绍两个常用的Python图像处理库:OpenCV和Pi

  • Python实现图片裁剪的两种方式(Pillow和OpenCV)

    在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV.两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧. 首先,我们有一张原始图片,如下图所示: 原始图片 然后,我们利用OpenCV对其进行裁剪,代码如下所示: import cv2 img = cv2.imread("./data/cut/thor.jpg") print(img.shape) cropped = img[0:128, 0:512] #

  • python中的opencv和PIL(pillow)转化操作

    opencv > pil import cv2 from PIL import Image img = cv2.imread("test.png") image = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB)) pil > opencv import cv2 from PIL import Image image = Image.open("test.png") img = cv2.cvtCol

  • python中 OpenCV和Pillow处理图像操作及时间对比

    目录 引言 OpenCV和Pillow的优缺点对比 读写图像 读图像 写图像 缩放图像 旋转图像 引言 最近再做图像处理相关的操作的时间优化,用到了OpenCV和Pillow两个库,两个库各有优缺点.各位小伙伴需要按照自己需求选用. 本篇博客做了简单整理,对常用操作做了对比整理,以及给出具体运行时间说明. OpenCV和Pillow的优缺点对比 库 优点 缺点 OpenCV 由C和C++编写,跨平台,有着多个语言的实现,部署比较方便 对显示中文支持较差.Python下常用函数不是太好看-_-!

  • python中opencv图像叠加、图像融合、按位操作的具体实现

    目录 1图像叠加 2图像融合 3按位操作 1图像叠加 可以通过OpenCV函数cv.add()或简单地通过numpy操作添加两个图像,res = img1 + img2.两个图像应该具有相同的深度和类型,或者第二个图像可以是标量值. NOTE: OpenCV添加是饱和操作,也就是有上限值,而Numpy添加是模运算. 添加两个图像时, OpenCV功能将提供更好的结果.所以总是更好地坚持OpenCV功能. 代码: import cv2 import numpy as np x = np.uint8

  • 详解Python+OpenCV进行基础的图像操作

    目录 介绍 形态变换 腐蚀 膨胀 创建边框 强度变换 对数变换 线性变换 去噪彩色图像 使用直方图分析图像 介绍 众所周知,OpenCV是一个用于计算机视觉和图像操作的免费开源库. OpenCV 是用 C++ 编写的,并且有数千种优化的算法和函数用于各种图像操作.很多现实生活中的操作都可以使用 OpenCV 来解决.例如视频和图像分析.实时计算机视觉.对象检测.镜头分析等. 许多公司.研究人员和开发人员为 OpenCV 的创建做出了贡献.使用OpenCV 很简单,而且 OpenCV 配备了许多工

  • Python中OpenCV图像特征和harris角点检测

    目录 概念 第一步:计算一个梯度 Ix,Iy 第二步:整合矩阵,计算特征值 第三步:比较特征值的大小 第四步: 非极大值抑制,把真正的角点留下来,角点周围的过滤掉 代码实现 概念 第一步:计算一个梯度 Ix,Iy 第二步:整合矩阵,计算特征值 第三步:比较特征值的大小 第四步: 非极大值抑制,把真正的角点留下来,角点周围的过滤掉 代码实现 import cv2 import numpy as np img =cv2.imread('pie.png') print('img.shape',img.

  • python中opencv实现文字分割的实践

    图片文字分割的时候,常用的方法有两种.一种是投影法,适用于排版工整,字间距行间距比较宽裕的图像:还有一种是用OpenCV的轮廓检测,适用于文字不规则排列的图像. 投影法 对文字图片作横向和纵向投影,即通过统计出每一行像素个数,和每一列像素个数,来分割文字. 分别在水平和垂直方向对预处理(二值化)的图像某一种像素进行统计,对于二值化图像非黑即白,我们通过对其中的白点或者黑点进行统计,根据统计结果就可以判断出每一行的上下边界以及每一列的左右边界,从而实现分割的目的. 算法步骤: 使用水平投影和垂直投

  • python中opencv K均值聚类的实现示例

    目录 K均值聚类 K均值聚类的基本步骤 K均值聚类模块 简单例子 K均值聚类 预测的是一个离散值时,做的工作就是“分类”. 预测的是一个连续值时,做的工作就是“回归”. 机器学习模型还可以将训练集中的数据划分为若干个组,每个组被称为一个“簇(cluster)”.这种学习方式被称为“聚类(clusting)”,它的重要特点是在学习过程中不需要用标签对训练样本进行标注.也就是说,学习过程能够根据现有训练集自动完成分类(聚类). 根据训练数据是否有标签,可以将学习划分为监督学习和无监督学习. K近邻.

  • Python中OpenCV Tutorials 20  高动态范围成像的实现步骤

    目录 高动态范围成像 一.引言 二.曝光序列 三.代码演示 四.解释 1. 加载图像和曝光时间 2. 估计相机响应 3. 形成HDR图像 4. 对 HDR 图像进行色调映射 5. 实现曝光融合 五.补充资源 高动态范围成像 一.引言 如今,大多数数字图像和成像设备每通道使用 8 位整数表示灰度,因此将设备的动态范围限制在两个数量级(实际上是 256 级),而人眼可以适应变化十个数量级的照明条件.当我们拍摄真实世界场景的照片时,明亮区域可能曝光过度,而黑暗区域可能曝光不足,因此我们无法使用单次曝光

  • 使用Python中OpenCV和深度学习进行全面嵌套边缘检测

    这篇博客将介绍如何使用OpenCV和深度学习应用全面嵌套的边缘检测.并将对图像和视频流应用全面嵌套边缘检测,然后将结果与OpenCV的标准Canny边缘检测器进行比较. 1. 效果图 愤怒的小鸟--原始图 VS Canny边缘检测图 VS HED边缘检测图 花朵--原始图 VS Canny边缘检测图 VS HED边缘检测图 视频效果图GIF 如下 2. 全面嵌套边缘检测与Canny边缘检测 2.1 Hed与Canny边缘检测对比 Holistically-Nested Edge Detectio

  • Python中OpenCV实现简单车牌字符切割

    在Jupyter Notebook上使用Python+opencv实现如下简单车牌字符切割.关于opencv库的安装可以参考:Python下opencv库的安装过程与一些问题汇总. 1.实现代码 import cv2 import numpy as np import matplotlib.pyplot as plt from PIL import Image #读取原图片 image1=cv2.imread("123456.jpg") cv2.imshow("image1&

  • python中opencv支持向量机的实现

    目录 支持向量机 理论基础 SVM使用介绍 例子介绍 完整程序 支持向量机 支持向量机(Support Vector Machine, SVM)是一种二分类模型,目标是寻找一个标准(称为超平面)对样本数据进行分割,分割的原则是确保分类最优化(类别之间的间隔最大). 当数据集较小时,使用支持向量机进行分类非常有效. 支持向量机是最好的现成分类器之一,“现成”是指分类器不加修改即可直接使用. 在对原始数据分类的过程中,可能无法使用线性方法实现分割.支持向量机在分类时,把无法线性分割的数据映射到高维空

  • python中opencv Canny边缘检测

    目录 Canny边缘检测 Canny边缘检测基础 高斯滤波去除图像噪声 计算梯度 非极大值抑制 应用双阈值确定边缘 Canny函数及使用 Canny边缘检测 Canny边缘检测是一种使用多级边缘检测算法检测边缘的方法. OpenCV提供了函数cv2.Canny()实现Canny边缘检测. Canny边缘检测基础 Canny边缘检测分为如下几个步骤: 去噪.噪声会影响边缘检测的准确性,因此首先要将噪声过滤掉. 计算梯度的幅度与方向 非极大值抑制,即适当地让边缘“变瘦” 确定边缘.使用双阈值算法确定

随机推荐