Red de conocimiento informático - Problemas con los teléfonos móviles - ¿En qué se diferencian las diversas funciones imread de Python en cuanto a implementación y velocidad de lectura?

¿En qué se diferencian las diversas funciones imread de Python en cuanto a implementación y velocidad de lectura?

1.PIL.Image.open

El código está aquí: Pillow/Image.py en 3.1.x - python-pillow/Pillow - GitHub

La función open() abre el imagen, pero no se leerá hasta que se produzca la operación.

La operación de lectura específica está escrita en ImageFile.py. El proceso general consiste en detectar el tipo de archivo, leer el contenido del archivo en un bloque completo y luego llamar al decodificador para que lo decodifique. Se han realizado muchas optimizaciones y la eficiencia debería ser muy alta.

2.scipy.ndimage.imread

El código está aquí: scipy/io.py en v0.17.1 - scipy/scipy - GitHub

llamadas imread scipy .misc.pilutil.imread. De hecho, todavía se llama Pillow.

Según el código de pilutil: scipy/pilutil.py en v0.17.1 - scipy/scipy - GitHub

Llama a pil.image.open() y luego regresa deimage( ).

3. scipy.misc.imread

El __init__.py de Misc está aquí: scipy/__init__.py en v0.17.1 - scipy/scipy - GitHub

La llamada aún no se ha leído en pilutil

El código relevante es el siguiente

prueba:

from .pilutil import *

from .import pilutil p>

__all__ = pilutil.__all__

del pilutil

excepto ImportError:

pass

Esto es un poco como aprender un truco, importe todas las funciones de pilutil y agréguelas al espacio actual, luego elimine pilutil para deshacerse de este efecto.

4. skimage.io.imread

El código está aquí: scikit-image/_io.py en master - scikit-image/scikit-image - GitHub

Este es un complemento que lee diferentes archivos y probará varios complementos diferentes para encontrar el correcto.

La llamada usa call_plugin, el código es el siguiente: scikit-image/manage_plugins.py en master - scikit-image/scikit-image - GitHub

Puedes entender el complemento. Ingrese mirando el siguiente código Prioridad de llamadas

# Para cada tipo de complemento, el primer complemento disponible definido por la siguiente preferencia

# se utiliza de forma predeterminada.

preferred_plugins = {

# Complementos predeterminados para todos los tipos (anulados por tipos específicos a continuación).

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

'imshow': ['matplotlib'],

'imshow_collection': ['matplotlib']

}

El código fuente del complemento está aquí: scikit-image/skimage/io/_plugins en master - imagen-scikit/ imagen-scikit - GitHub.

5.cv2.imread

Aquí está la llamada a CV::imread(), el código está aquí: opencv/loadsave.cpp en master - opencv/opencv - GitHub. General En términos generales, la implementación de C/C debería ser más rápida que Python.

5.

6.matplotlib.image.imread

La documentación de matplotlib indica que matplotlib solo puede leer archivos PNG de forma nativa cuando PIL está disponible. Se pueden leer otros tipos de archivos. Si utiliza una URL para abrir un archivo de imagen en línea, debe cumplir con el documento PIL.

El código para matplotlib.image.imread está aquí: matplotlib/image.py en master - matplotlib/matplotlib - GitHub. La lectura y escritura nativa de PNG de matplotlib se implementa en C.

matplotlib primero abrirá la imagen usando pil's open, o usará el método nativo si el formato de la imagen es png.

El código relevante es el siguiente:

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

si el formato es Ninguno:

if cbook.is_string_like( fname):

parsed = urlparse( fname)

# Si la cadena es una URL, se supone que es png

if len(parsed.scheme ) gt; 1:

text = 'png'

else:

nombre base, text = os.path.splitext(fname)

text = text. lower()[1:]

elif hasattr(fname, 'nombre'):

nombre base, text = os.path.splitext(fname.name )

text = text.lower()[1:]

más:

text = 'png'

más:

text = format

si text no está en los controladores:

im = pilread(fname)

si no soy Ninguno:

elevar ValueError ('Solo sé cómo manejar extensiones: s; '

'con Pillow instalado matplotlib puede manejar '

'más imágenes' list(six.iterkeys( controladores)))

p>

devuelve im

El único controlador declarado es png. Si es un archivo png, llame a _png.read_png. Si no es un archivo png, use pilread directamente (la misma función que pil).

Si no es un archivo png, usa pilread directamente (igual que pil).

El código fuente de matplotlib es muy complejo y una gran parte del cuerpo principal está escrito en lenguaje C.

El código fuente de matplotlib es muy complejo.