2011-12-28 11 views
5

Tengo que reducir y descomprimir un conjunto de imágenes JPG de tamaño 4608 x 3456. Actualmente, ya he podido descomprimir las imágenes correctamente en formato RGB y convertirlas en un mapa de bits.Reducción de JPG durante la descompresión JPG

Ahora tengo que implementar la escala descendente, y por lo que he leído hasta ahora para reducir la escala de una imagen correctamente, se debe usar la interpolación bilineal. Luego debería reemplazar los píxeles (2x2) que se utilizaron para la interpolación por el píxel resultante de la interpolación. Necesito alrededor de 1/4 de su tamaño actual.

No estoy tan preocupado por la calidad de las imágenes reducidas, ya que estoy a la velocidad a la que está hecho. Todo el proceso debe ser tan rápido como sea posible.

Mi pregunta es cuando Debería hacer la interpolación bilineal durante la etapa de descompresión del JPG. ¿Debo hacerlo después de la IDCT (Transformada Coseno Discreta Inversa) o debo realizar la interpolación antes del IDCT?

¿Es inteligente usar los coeficientes DCT y hacer la interpolación en ellos y luego usar esos valores resultantes en el IDCT?

+0

¿Quién dijo que deberías usar bilinear? Esa es la peor manera posible, aparte del muestreo por puntos. También es importante prestar atención al manejo correcto de gamma. –

+0

@AxelGneiting Eso fue simplemente lo que encontré en mi investigación, si puede sugerir una forma mejor, hágalo. –

+0

@AxelGneiting, en esta aplicación particular bilinear será matemáticamente equivalente a tomar un promedio de los 4 píxeles. Esa debe ser una calidad muy rápida y aceptable. Es posible obtener una mayor calidad a expensas de la velocidad. Lo mismo para manejar gamma: mejores resultados, menos velocidad. –

Respuesta

3

En general, no creo que exista una forma sensata de hacerlo en términos de los coeficientes DCT.

Sin embargo, si desea específicamente una imagen de la mitad de tamaño en cada dimensión, puede obtener una imagen crudamente muestreada descartando los coeficientes de alta frecuencia y haciendo un 4CT IDCT.

+0

No es una idea tan ridícula: he trabajado con una biblioteca que usaba este enfoque para generar miniaturas. Lamentablemente, nunca supe los detalles de cómo funcionaba. –

+0

@Oli me puede dar un poco más de datos sobre cómo se haría esto? –

+1

@Tony: cada bloque de 8x8 de la imagen tiene una DCT 2D aplicada (estoy seguro de que ya lo sabe). Cada coeficiente representa la amplitud de una frecuencia espacial bidimensional particular. Desea disminuir la resolución, lo que básicamente implica filtrar las frecuencias altas primero (esto es lo que está haciendo la interpolación). Obtendrá un efecto similar al establecer los coeficientes de alta frecuencia en 0. Alternativamente, podría simplemente ignorarlos, y retener solo los coeficientes de 4x4 de baja frecuencia de cada bloque, y realizar una IDCT 4x4 en ellos (vea la página de Wikipedia en DCT para las matemáticas). –