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