當前位置:編程學習大全網 - 源碼下載 - Python的各種imread函數在實現方式和讀取速度上有何區別

Python的各種imread函數在實現方式和讀取速度上有何區別

1. PIL.Image.open

代碼在這裏:Pillow/Image.py at 3.1.x · python-pillow/Pillow · GitHub

open() 函數打開圖像,但並不讀入,直到有操作發生。

具體的讀取操作是在 ImageFile.py 寫的。大體流程是先檢測文件類型,整塊地讀入文件內容,然後調用解碼器解碼,做了很多優化,效率應該還是很高的。

2. scipy.ndimage.imread

代碼在這裏:scipy/io.py at v0.17.1 · scipy/scipy · GitHub

imread 調用 scipy.misc.pilutil.imread。從名字就能看出來其實調用的還是 Pillow。

根據 pilutil 代碼:scipy/pilutil.py at v0.17.1 · scipy/scipy · GitHub

確實是調用 pil.image.open(),然後返回壹個 fromimage()。

3. scipy.misc.imread

misc 的 __init__.py 在這裏:scipy/__init__.py at v0.17.1 · scipy/scipy · GitHub

調用的還是 pilutil 中的 imread

相關代碼如下

try:

from .pilutil import *

from . import pilutil

__all__ += pilutil.__all__

del pilutil

except ImportError:

pass

也算是學了壹招,從 pilutil 導入其所有函數添加到當前空間,然後又刪除了 pilutil 消除影響。

4. skimage.io.imread

代碼在這裏:scikit-image/_io.py at master · scikit-image/scikit-image · GitHub

是通過插件 plugin 來讀入不同的文件,而且會試用幾個不同的 plugins 來找到合適的。

使用 call_plugin 來調用,代碼在這裏:scikit-image/manage_plugins.py at master · scikit-image/scikit-image · GitHub

可以根據如下代碼查看插件調用的優先級

# For each plugin type, default to the first available plugin as defined by

# the following preferences.

preferred_plugins = {

# Default plugins for all types (overridden by specific types below).

'all': ['pil', 'matplotlib', 'qt', 'freeimage'],

'imshow': ['matplotlib'],

'imshow_collection': ['matplotlib']

}

plugins 的源代碼在這裏:scikit-image/skimage/io/_plugins at master · scikit-image/scikit-image · GitHub。可以看到 pil 的 imread,是用 open 打開圖像之後,再轉換成 ndarray。

5. cv2.imread

這裏是調用的 CV::imread(),代碼在這裏:opencv/loadsave.cpp at master · opencv/opencv · GitHub。壹般來說 C\C++ 的實現,應該比 python 速度快壹點。

6. matplotlib.image.imread

matplotlib 的文檔裏面說,matplotlib 原生只可以讀取 PNG 文件,有 PIL 的時候,可以讀取其他類型的文件。如果使用 URL 打開在線圖像文件,需要符合 PIL 的文檔要求。

matplotlib.image.imread 的代碼在這裏:matplotlib/image.py at master · matplotlib/matplotlib · GitHub。matplotlib 的原生 PNG 讀取和寫入,是用 C 實現的,代碼在這裏:matplotlib/_png.cpp at master · matplotlib/matplotlib · GitHub。

matplotlib 是先用 pil 的 open 打開圖像,如果格式是 png,就用原生方法打開。相關代碼如下:

handlers = {'png': _png.read_png, }

if format is None:

if cbook.is_string_like(fname):

parsed = urlparse(fname)

# If the string is a URL, assume png

if len(parsed.scheme) > 1:

ext = 'png'

else:

basename, ext = os.path.splitext(fname)

ext = ext.lower()[1:]

elif hasattr(fname, 'name'):

basename, ext = os.path.splitext(fname.name)

ext = ext.lower()[1:]

else:

ext = 'png'

else:

ext = format

if ext not in handlers:

im = pilread(fname)

if im is None:

raise ValueError('Only know how to handle extensions: %s; '

'with Pillow installed matplotlib can handle '

'more images' % list(six.iterkeys(handlers)))

return im

聲明的處理器只有 png。如果是 png 文件,調用 _png.read_png。如果不是 png 直接使用 pilread(就是用 pil 的 Image.open 然後 pil_to_array)。

matplotlib 的源碼確實比較復雜,壹大部分主體是用 C 寫的,改動很激進,功能更新猛烈。

  • 上一篇:潛江晃晃麻將綁定邀請碼56661返現50%?
  • 下一篇:如何選股?突破橫向平臺法選股,舍線騰空選股
  • copyright 2024編程學習大全網