網站首頁 編程語言 正文
引言
- 最近再做圖像處理相關的操作的時間優化,用到了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
相關推薦
- 2022-07-25 pytest中配置文件pytest.ini使用_python
- 2023-04-11 pytest用例執行順序和跳過執行詳解_python
- 2023-01-20 Django如何實現RBAC權限管理_python
- 2022-09-14 python與xml數據的交互詳解_python
- 2022-03-14 Go使用Gin框架開發博客系統(一)之環境搭建和項目初始化
- 2023-01-01 MongoDB?Shell常用基本操作命令詳解_MongoDB
- 2022-05-13 分布式架構Redis中有哪些數據結構及底層實現原理_Redis
- 2022-08-17 React自定義hook的方法_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支