2011-01-30 16 views
5

He estado trabajando en mi proyecto sobre el procesamiento de imágenes de detección remota y el bucle de secuencia de imágenes. Cada imagen resultante (en formato JPEG o PNG) tiene aproximadamente 8000 * 4000 píxeles. Por lo general, nuestros usuarios desean recorrer una secuencia de imágenes (más de 50 imágenes) en función de la región de interés a la vez. Por lo tanto, tengo que extraer el área de visualización requerida de cada imagen de acuerdo con el tamaño del cliente de visualización del usuario. Por ejemplo, si la vista actual del cliente del usuario es 640 * 480, tendré que encontrar un tamaño del bloque de datos 640 * 480 de cada imagen original en función de las coordenadas x (columnas) e y (filas) actuales, y reasignar a la vista del cliente Cuando el usuario navega hacia otra área de visualización arrastrando el mouse, nuestro programa debe cargar los datos regionales de cada imagen original lo antes posible.Gran secuencia de imágenes JPEG/PNG Looping

sé ni biblioteca ni JPEG biblioteca PNG tiene algunas rutinas incorporadas en el bloque de lectura de datos, tales como largo ReadRectangle (a largo x0, y0 larga, larga x1, y1 larga, char * RectData); largo ReadInaRectangle (largo x0, largo y0, ancho corto, altura corta, char * RectData);

El descompresor de JPEG incorporado carece de este tipo de funcionalidad. Sé que el formato JPEG2000 tiene disposiciones para descomprimir un área específica de la imagen. No estoy del todo seguro acerca de JEPG.

Alguien sugiere que use CreateFileMapping, MapViewOfFile y CreateDIBSection para confirmar el número de bytes de una asignación de archivos para asignarla a la vista. A diferencia de los formatos simples de imágenes binarias planas tales como .raw, * .img y * .bmp, Blob de JPEG contendrá no solo los datos de imagen sino también el complicado encabezado JPG. Por lo tanto, no es fácil asignar un bloque de vista de datos fuera del archivo JPEG.

Alguien recomienda que use mosaico de imágenes o tecnología de pirámide de imágenes para generar subimágenes, como mnay popular, visualización de imágenes (Google Earth, etc.), y aplicaciones GIS (WebGIS, etc.).

¿Cómo puedo resolver este problema?

Gracias por su ayuda.

oro Lee

Respuesta

0

Es fácil con la gd library. LibGD es una biblioteca de código fuente abierto para la creación dinámica de imágenes sobre la marcha por programadores.

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. – Stewbob

+0

@Stewbob: la respuesta no está detrás del enlace. La respuesta es "Es fácil con la biblioteca gd" e incluye un enlace a la biblioteca gb. En mi humilde opinión, esto está bien. –

3

Si está de acuerdo con que las coordenadas de región sean múltiplos de 8, la biblioteca JPEG de ijg puede ayudarlo a cargar imágenes JPEG parciales.

Lo que quiere:

  1. Obtener todos los coeficientes DCT para toda la imagen. Aquí hay un example of how to do this. Sí, esto implicará la descodificación de entropía de toda la imagen, pero este es el paso menos costoso de la decodificación JPEG (IDCT es el más caro, y lo estamos evitando).
  2. Deseche los bloques que no necesita (cada bloque consta de 8x8) coeficientes. Tendrás que hacer esto a mano, pero dado que el diseño es bastante simple (los bloques están en orden de escaneo) no debería ser tan difícil.
  3. Aplique DCT inverso al bloque a cada uno de los cuadros. Probablemente puedas hacer que IJG haga eso por ti. Si no puede, tendrá que hacer su propia IDCT y transformar el color de nuevo a [0, 255] porque las intensidades están en [-127, 128] en el mundo de JPEG.
  4. Si todo va bien, obtendrá su imagen JPEG decodificada. Debido a chroma subsampling, los canales de luminancia y croma pueden ser de diferentes dimensiones, y tendrá que compensarlo usted mismo escalando.

Los dos primeros pasos están prácticamente cubiertos por los enlaces. El cuarto es bastante trivial (puede obtener el tipo de submuestreo de crominancia usando la interfaz IJG, y la escala, esencialmente upsampling, se logra fácilmente usando algo como OpenCV o haciendo rodar su propio código). El tercer es algo que aún no he probado, pero parece que sería posible.

+1

+1: Pero es posible que desee agregar el cambio de escala de los diferentes componentes de color y la transformación de color. –

+0

Gracias por señalar eso. Actualicé la respuesta. Por cierto, IJG hace la transformación de color como parte de su paso de IDCT, por lo que solo tiene que hacerlo usted mismo si está utilizando una biblioteca diferente para IDCT. – misha

Cuestiones relacionadas