python中?OpenCV和Pillow處理圖像操作及時間對比
引言
- 最近再做圖像處理相關的操作的時間優(yōu)化,用到了OpenCV和Pillow兩個庫,兩個庫各有優(yōu)缺點。各位小伙伴需要按照自己需求選用。
- 本篇博客做了簡單整理,對常用操作做了對比整理,以及給出具體運行時間說明。
OpenCV和Pillow的優(yōu)缺點對比
庫 | 優(yōu)點 | 缺點 |
---|---|---|
OpenCV | 由C和C++編寫,跨平臺,有著多個語言的實現(xiàn),部署比較方便 | 對顯示中文支持較差、Python下常用函數(shù)不是太好看-_-! |
Pillow | 常用函數(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可以用來處理顯示中文相關問題
到此這篇關于python中 OpenCV和Pillow處理圖像操作及時間對比的文章就介紹到這了,更多相關python OpenCV處理圖像 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Tensorflow 訓練自己的數(shù)據(jù)集將數(shù)據(jù)直接導入到內(nèi)存
這篇文章主要介紹了Tensorflow 訓練自己的數(shù)據(jù)集將數(shù)據(jù)直接導入到內(nèi)存,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06Python multiprocessing 進程間通信方式實現(xiàn)
本文主要介紹了Python multiprocessing 進程間通信方式實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-02-02Python RuntimeError: thread.__init__() not called解決方法
這篇文章主要介紹了Python RuntimeError: thread.__init__() not called解決方法,需要的朋友可以參考下2015-04-04Python word文本自動化操作實現(xiàn)方法解析
這篇文章主要介紹了Python word文本自動化操作實現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11