Cambiar el tamaño de imágenes grandes en Python (más grande que la RAM disponible)

Me gustaría cambiar el tamaño y dividir imágenes enormes (1 TB) en mosaicos de 256×256 píxeles (Zoomify / OSM / Google Maps / XYZ schema). Las imágenes estarán en formato BigTIFF o PSB (Formato de documento grande o Photoshop Big).

¿Cuáles son las bibliotecas disponibles que pueden hacer esto? Echaba un vistazo a GDAL pero estaba produciendo una salida bastante borrosa y no podía configurarlo para interpolar mejor. Idealmente, estaría mirando a un interpolador de Lanczos para esa tarea.

¿Hay bibliotecas nativas de Python o envoltorios para bibliotecas basadas en C que puedan hacer esto? ¿Puede la envoltura de Python para imagemgick hacer tal cosa?

Si no hay una biblioteca de Python disponible, también estoy abierto para las herramientas basadas en la línea de comandos, que puedo automatizar usando Python.

    Los libvips pueden procesar imágenes enormes (más grandes que la RAM) de manera eficiente. Es una biblioteca de procesamiento de imágenes de transmisión por secuencias, por lo que puede (en este caso) descomprimir, cambiar el tamaño, mosaico y escribir todo al mismo tiempo, y sin tener toda la imagen en la memoria o sin necesidad de archivos temporales.

    El operador dzsave escribirá una pirámide de DeepZoom / Zoomify / Google Maps. Puedes ejecutarlo desde la línea de comandos así:

     $ vipsheader y.tif y.tif: 104341x105144 uchar, 3 bands, srgb, tiffload $ ls -l y.tif -rw-r--r-- 1 john john 32912503796 Jun 13 13:31 y.tif $ time vips dzsave y.tif x real 3m4.944s user 9m21.372s sys 7m20.232s peak RES: 640mb $ ls -R x_files/ | wc 227190 227172 2784853 

    Entonces, en mi escritorio, convirtió una imagen de 32GB a 230,000 mosaicos en aproximadamente 3 minutos. Eso es con un HDD mecánico, podría ser más rápido con un SSD. Hay un capítulo en la documentación que presenta dzsave .

    Tiene un enlace de Python , por lo que también podría escribir:

     import pyvips image = pyvips.Image.new_from_file("y.tif", access="sequential") image.dzsave("x") 

    La opción de access le dice a libvips que debe transmitir la imagen. Puede leer tanto BigTIFF como PSB. Encontrarás que BigTIFF es mucho más rápido y necesita menos memoria.