python中?OpenCV和Pillow處理圖像操作及時(shí)間對(duì)比
引言
- 最近再做圖像處理相關(guān)的操作的時(shí)間優(yōu)化,用到了OpenCV和Pillow兩個(gè)庫,兩個(gè)庫各有優(yōu)缺點(diǎn)。各位小伙伴需要按照自己需求選用。
- 本篇博客做了簡單整理,對(duì)常用操作做了對(duì)比整理,以及給出具體運(yùn)行時(shí)間說明。
OpenCV和Pillow的優(yōu)缺點(diǎn)對(duì)比
庫 | 優(yōu)點(diǎn) | 缺點(diǎn) |
---|---|---|
OpenCV | 由C和C++編寫,跨平臺(tái),有著多個(gè)語言的實(shí)現(xiàn),部署比較方便 | 對(duì)顯示中文支持較差、Python下常用函數(shù)不是太好看-_-! |
Pillow | 常用函數(shù)操作封裝較好,對(duì)顯示中文字體有著很好的支持 | 處理時(shí)間較慢 |
測試環(huán)境:
- 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
讀取圖像的通道順序區(qū)別:
- OpenCV讀取圖像,通道順序是:BGR
- Pillow讀取圖像,通道順序是:RGB
獲得圖像shape區(qū)別:
- 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)
小結(jié):
- 讀取圖像格式為PNG,且都轉(zhuǎn)為np.array格式,優(yōu)先選擇OpenCV。
- 讀取圖像格式為JPG,且都轉(zhuǎn)為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)
小結(jié):
- 寫圖像格式為PNG,優(yōu)先選擇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)
小結(jié): OpenCV速度完勝Pillow
旋轉(zhuǎn)圖像
示例代碼:
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))
小結(jié):OpenCV速度完勝Pillow
總結(jié):
- 如果可以選擇,優(yōu)先選擇OpenCV處理圖像
- Pillow可以用來處理顯示中文相關(guān)問題
到此這篇關(guān)于python中 OpenCV和Pillow處理圖像操作及時(shí)間對(duì)比的文章就介紹到這了,更多相關(guān)python OpenCV處理圖像 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Tensorflow 訓(xùn)練自己的數(shù)據(jù)集將數(shù)據(jù)直接導(dǎo)入到內(nèi)存
這篇文章主要介紹了Tensorflow 訓(xùn)練自己的數(shù)據(jù)集將數(shù)據(jù)直接導(dǎo)入到內(nèi)存,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06python 實(shí)現(xiàn)生成均勻分布的點(diǎn)
今天小編就為大家分享一篇python 實(shí)現(xiàn)生成均勻分布的點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12Python multiprocessing 進(jìn)程間通信方式實(shí)現(xiàn)
本文主要介紹了Python multiprocessing 進(jìn)程間通信方式實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02pytorch 如何自定義卷積核權(quán)值參數(shù)
這篇文章主要介紹了pytorch 自定義卷積核權(quán)值參數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05Python RuntimeError: thread.__init__() not called解決方法
這篇文章主要介紹了Python RuntimeError: thread.__init__() not called解決方法,需要的朋友可以參考下2015-04-04PyQt5 QThread倒計(jì)時(shí)功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了PyQt5 QThread倒計(jì)時(shí)功能的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Python word文本自動(dòng)化操作實(shí)現(xiàn)方法解析
這篇文章主要介紹了Python word文本自動(dòng)化操作實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11