aerials标准测试图像_Python 图像读写谁最快?不信就比一比
圖像處理,顧名思義,是對圖像進行的各種轉換、計算等處理。圖像處理必不可少地需要讀寫圖像文件。
圖像文件的讀取,就是將圖像數據從磁盤中的文件內讀入內存,之后按照圖像解碼標準解碼,最后把圖像各像素的值存儲到內存區域中,并返回存儲圖像像素值的內存起始地址。圖像數據的結構,其實就是二維數組。在 C 語言里面,就是用二維數組或者一維數組形式的手動二維數組的形式存放的。在 Python 生態里,讀入內存的圖像,一般需要以 Numpy 數組的形式存放,方便稍后處理。Numpy 數組具有 C 接口,在特定情況下,可以直接直接用 C 讀取。
圖像文件的寫入,是將圖像數據按照圖像編碼標準編碼,添加上如圖像像素數、顏色數等相關的文件信息,構造成符合標準的圖像文件數據,并寫入磁盤。
用什么方法讀寫圖像,速度最快,一直為人所爭議,但不同的平臺 windows/linux 32bit/64bit 與實現 python2/python3/c,不同的圖像格式大小批量,得到的結果總是千奇百怪的。
所以,本質上,這個速度比較,是依賴于運行環境和具體的應用場合的。運行環境包括硬件和軟件,硬件上的CPU、內存、硬盤、系統總線、緩存等等;軟件包括系統平臺、編譯器、第三方庫等等。如此多的影響變量,已經完全沒辦法控制了。還要加上具體的應用場合,比如,讀取圖像的圖像格式,分辨率大小等等。典型的,JPG 圖像和 BMP 圖像編解碼運算壓力就很不一樣;海量小圖像,和少量大分辨率圖像,差距也很大。不同的 Python 包在不同的第三方庫的支持下,針對不同圖像格式、文件尺寸的讀寫性能也是完全不同的。在后面詳細讀源碼的時候可以發現,同一個 Python 包讀寫圖像代碼,在不同的環境下,實際調用路徑和調用的第三方包也會變化。
還有一個問題,就是運行環境的具體要求。比較典型的一個問題,就是 Pillow 這種純 Python 代碼包,和 OpenCV 這種以 C/C++ 為基礎的 Python 接口轉接的包的區別。在跨平臺的時候,純 Python 包更能取得一致效果。我個人之前的工作中,就遇到過,使用 OpenCV 在 windows 和 Linux 環境下得到不同的運行結果,其中原因有可能是計算中 Windows 和 Linux 下調用的運算庫的版本不同或具體指令得到的結果不一樣。另一種常見的情況,是在云平臺上,不具有管理員權限,不能額外安裝二進制代碼包,甚至 Python 包,那就只能盡可能利用現存工具。
因此,為了在“不論如何的復雜環境”下,都能“根據現實條件”找到“適合當前應用需求”的最高效 Python 包,我這里提出一個測試驅動的方案。畢竟只要實際上手測試一下,自然就可以找到實際最高效的 Python 包。而且,利用 Python 的“引入并改名 import as”機制,把經過測試后選擇出來的函數接出來以供使用,可以在各種環境下,都提供出一個最快的解決方案。
本文的以下部分,列舉了常見的具有 Python 圖像讀寫能力的包和使用方法,分析比較其性能,并開源一個自動測試比較不同圖像處理包圖像讀取性能的包。希望能夠有助于同學、同行節省爭議時間。畢竟只有具有真正實驗數據支撐的“實證研究 Empirical Research”才是真正有價值的。
MATLAB 圖像文件讀寫
在介紹 Python 的圖像文件讀寫,先對比一下 MATLAB。
MATLAB 有 imread 和 imwrite 分別用于圖像讀取和圖像寫入。
A = imread(filename, fmt) imwrite(A,filename)filename 是需要讀入的圖像文件名,fmt是讀入圖像的格式代碼。整句代碼的意思是將文件 filename 以 fmt 格式讀入,讀入后,數據存儲在變量A中。
Python 圖像文件讀寫
在 Python 生態里,我個人認為,最為正統的圖像讀寫,應該使用 skimage 包。skimage 的全稱是 scikit-image。但實際使用的時候,例如在導入一個 Python 包的時候,不能存在連字符,所以有縮略語 skimage。skimage 是原本 SciPy(Python 科學計算包)中圖像處理相關算法獨立出來的 Python 包。skimage 包的維護一直有 Anaconda 的參與,所以使用 conda install 也是很穩妥的。
skimage 中,負責圖像讀寫的,是 io module 中的 imread 和 imsave 函數。
from skimage import io img_array = io.imread(fname, as_grey=False, plugin=None, flatten=None, **plugin_args) io.imsave(fname, arr, plugin=None, **plugin_args)MATLAB 與 Python 讀取圖像的 RGB 順序,是不一樣的,要注意調整,也可以具體指定 RGB 順序,以便確保準確。
常見圖像處理工具簡介
最常見的圖像讀取工具,是 Pillow 和 OpenCV。
Pillow 是 Python 原生圖像處理包,優點是純 Python、跨平臺、沒有其它依賴,可靠穩定。
OpenCV 是以 CC++ 為主開發的圖像處理通用軟件庫,算法全面,功能強大,具有多種接口。早期版本長期錨定 Python 2,環境配置比較繁瑣,但現在其 Python 3 接口已經比較完善了。
其他常見的圖像處理包,包括 matplotlib、imageio 和 skimage。
matplotlib 作為 Python 最早也是影響最廣泛的數據可視化包,也是常用的圖像讀取工具。
imageio 其實是 scipy 中的圖像操作功能獨立后的包,原本是 scipy.io 中的圖像操作工具。
skimage 是一套完整的圖像處理包,自然也具有圖像讀取能力。
另外幾個比較獨特的:
Qt 作為歷史悠久的跨平臺 GUI 庫,圖像讀取方式獨樹一幟,效率非常好,但格式獨特。
再就是 imread 包,專職圖像讀取,格式支持廣泛,性能也不俗。
FreeImage 是一個開源圖像格式支持庫。
其中 imageio、skimage 其實用的就是 Pillow,只是自己在上面包裝了一下。
matplotlib 除了 PNG 格式外,也都是利用一種插件機制,調用其它包實現的。依賴的,主要也還是 Pillow。而 PNG 格式,matplotlib 本身有基于 C 的支持。
具體的不同包之間的調用方法可以參見代碼和我之前的回答:
Python的各種imread函數在實現方式和讀取速度上有何區別??www.zhihu.com圖像讀取性能測試 imreadeval
Github repo 如下:
quxiaofeng/imreadeval?github.com包的名字,起得很直觀,就是評估圖像讀取性能 im(age)-read-eval(uation)。
當前,僅僅實現了
- Pillow
- OpenCV
- Matplotlib
- imageio (descendent of scipy.io.imread, which is deprecated)
- SciKit-Image (depend on SciPy)
五種圖像讀取函數的測試。
可以直接 pip install imreadeval 安裝。
而評估測試也很簡單,直接 import imreadeval 就可以。
默認會直接讀取包中自帶的兩張(PNG、JPG 各一張)十次,并給出讀取需要的時間。
這里的“讀取”,是讀入一張圖像到內存,并讀取其中一個像素的值。以防止打開圖像不實際讀取(Pillow,說的就是你這個 lazy 包)。
這個包針對 Py27/Py36/Py37 Win/Lin 都做了測試,都可以跑起來。方便在各種平臺上做測試。
而且測試后,import 進來讀取速度最快的包實現的 imread,方便在不同平臺確保使用最快的 imread。
也可以直接 from imreadeval import imread引入最快的函數。
也提供了接口,可以在自己的圖像上,測試哪個包讀得最快。方法如下
from imreadeval import imread_evaloptimum_package_name = imread_eval(filenames = ['filename1.jpg', 'filename2.png'],times = 1000)可以自行 glob 一些圖像,讀入測試千百遍啊千百遍。
希望大家在自己的平臺測試,并提供意見。歡迎 issue 和 PR,也歡迎 star 和 fork。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的aerials标准测试图像_Python 图像读写谁最快?不信就比一比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 山东移动APP怎么领取会员(山东省人民政
- 下一篇: 如何用python批量下载数据_使用Py