2009-10-30 14 views
8

Estoy trabajando con 1 gb de imágenes tiff grandes de alrededor de 20000 x 20000 píxeles. Necesito extraer varias fichas (de aproximadamente 300x300 píxeles) de las imágenes, en posiciones aleatorias.extracción eficiente de mosaicos TIFF C++

probé las siguientes soluciones:

  • libtiff (la única biblioteca de bajo nivel que pude encontrar) ofrece TIFFReadline() pero eso significa que la lectura en alrededor de 19700 píxeles innecesarios.

  • Implementé mi propio lector tiff que extrae un mosaico de la imagen sin leer en píxeles innecesarios. Esperaba que fuera más rápido, pero hacer una búsqueda para cada línea del mosaico lo hace muy lento. También intenté leer en un búfer todas las líneas del archivo que incluyen mi tesela, y luego extraer la tesela del búfer, pero los resultados son más o menos los mismos.

¡Me gustaría recibir sugerencias que mejorarían mi herramienta de extracción de mosaicos!

Todo es bienvenido, tal vez se puede proponer una biblioteca más eficiente que podría utilizar, algunos consejos acerca de C C++ I O, alguna estrategia de nivel// más alto para mis necesidades, etc.

Saludos, Juan

+0

¿Podemos suponer que no están comprimidos? –

+0

¿Y que los datos están organizados en scanlines? –

+0

sí, es sin comprimir los datos y organizado de la forma más traditinal: línea 1 línea 2 línea 3 ... – Juan

Respuesta

2
+0

Actualmente estoy probando esta opción. Gracias por su respuesta. – Juan

+0

Interesante en sistemas operativos de 64 bits. Los archivos tiff grandes pasan fácilmente más allá de los límites de 32 bits. En mi XP tengo problemas para leer bitmaps de 400MByte y superiores, porque la fragmentación de la "memoria virtual". Es decir: no puedo encontrar un fragmento de espacio de memoria consecutivo de 400 MByte, incluso con 2 GByte de RAM (!) Libre. – Adriaan

3

[editar Mayor 14 10 Ene]

que estaba un poco confundido por su mención de las baldosas, cuando el TIFF es no baldosas.

Uso imágenes en mosaico/piramidales TIFF. He creado con los VIPS

vips im_vips2tiff source_image output_image.tif:none,tile:256x256,pyramid 

Creo que se puede hacer esto con:

vips im_vips2tiff source_image output_image.tif:none,tile:256x256,flat 

Es posible que desee experimentar con el tamaño del azulejo. Luego puede leer usando TIFFReadEncodedTile.

El almacenamiento de múltiples resoluciones utilizando tiffs piramidales es mucho más rápido si necesita acercar/alejar. También es posible que desee utilizar esto para tener una imagen aproximada seguida de inmediato por una imagen detallada.

Después de cambiar a un almacenamiento en mosaico (de un tamaño adecuado) (¡lo que le proporcionará MÁSIVAS mejoras de rendimiento para acceso aleatorio!), Su cuello de botella será disco io. La lectura del archivo es mucho más rápida si se lee en secuencia. Aquí mmapping puede ser la solución.

Algunos enlaces útiles:

VIPS IIPImage LibTiff.NET stackoverflow VIPS es una biblioteca de manipulación de imágenes que puede hacer mucho más que simplemente leer/escribir. Tiene su propio formato interno muy eficiente. Tiene una buena documentación sobre los algoritmos. Por un lado, desacopla el procesamiento del sistema de archivos, lo que permite que los mosaicos se almacenen en caché.

IIPImage es un servidor web/biblioteca de navegador de zoom múltiple.Encontré la documentación como una muy buena fuente de información sobre imágenes de resolución múltiple (como google maps)

La otra solución en esta página, usando mmap, es eficiente solo para archivos 'pequeños'. He llegado a los límites de 32 bits a menudo. En general, la asignación de un trozo de memoria de 1 GByte fallará en un sistema operativo de 32 bits (con 4 GB de RAM instalados) debido al hecho de que incluso la memoria virtual se fragmenta después de una o dos ejecuciones de aplicaciones. Aún así, hay memoria suficiente para almacenar en caché las partes o la totalidad de la imagen. Más memoria = más rendimiento.

+0

Los TIFF se pueden alicatar o tener tiras de datos. Esta es la única forma de administrar la creación y lectura de imágenes de gran tamaño. – WhoCares

0

Hice algo similar a esto para manejar un archivo de formato TARGA (TGA) arbitrariamente grande. Lo que lo hizo simple para ese tipo de archivo es que la imagen no está comprimida. Puede calcular la posición de cualquier píxel arbitrario dentro de la imagen y encontrarlo con una búsqueda simple. Puede considerar el formato targa si tiene la opción de especificar la codificación de la imagen.

Si no hay muchas variedades de formatos TIFF. Es probable que desee utilizar una biblioteca si ya han sufrido la molestia de admitir todos los diferentes formatos.

2

Gracias a todos por las respuestas.

En realidad, un cambio en la forma en que se requerían las teselas, me permitió extraer las teselas de los archivos en el disco duro, de forma secuencial, en lugar de hacerlo de forma aleatoria. Esto me permitió cargar una parte del archivo en ram, y extraer las fichas de allí.

La ganancia de eficiencia fue enorme. De lo contrario, si necesita acceso aleatorio a un archivo, mmap es un buen negocio.

Saludos, Juan

-1

¿Recibió un mensaje de error específico? Dependiendo de cómo usaste esa línea de comando, podrías haber pisado tu propio archivo.

Si ese no era el problema, intente usar imagemagick en lugar de vips si se trata de una opción.

Cuestiones relacionadas