¿En qué se diferencian las diversas funciones imread de Python en cuanto a implementación y velocidad de lectura?
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> 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.