una tamaño redimensionar que porcentaje notas imagen hacer escalar div deformar como cambie cambiar bloc ajustar algorithm image graphics image-processing image-scaling

algorithm - tamaño - escalar imagen html



¿Cuál es la idea detrás de escalar una imagen usando lanczos? (1)

Estoy interesado en algoritmos de escalado de imagen y he implementado los métodos bilineal y bicúbico. Sin embargo, he oído hablar de lanczos y otros métodos más sofisticados para escalar imágenes de mayor calidad y tengo mucha curiosidad sobre cómo funcionan.

¿Podría alguien explicar la idea básica de escalar una imagen usando lanczos (tanto la ampliación como la reducción a escala) y por qué resulta en una mayor calidad?

Tengo antecedentes en el análisis de Fourier y he hecho algunas cosas de procesamiento de señal en el pasado, pero no en relación con el procesamiento de imágenes, así que no temas usar términos como "respuesta de frecuencia" y tal en tu respuesta :)

EDITAR: Creo que lo que realmente quiero saber es el concepto y la teoría detrás del uso de un filtro de convolución para la interpolación.

(Nota: ya he leído el artículo de wikipedia sobre el remuestreo de lanczos, pero no tenía suficientes detalles para mí)

¡muchas gracias!


La selección de un filtro particular para el procesamiento de imágenes es una especie de arte negro, porque el criterio principal para juzgar el resultado es subjetivo: en gráficos por computadora, la pregunta final casi siempre es: "¿se ve bien?". Hay muchos filtros buenos, y la elección entre los mejores a menudo se reduce a un juicio crítico.

Dicho esto, voy a seguir adelante con alguna teoría ...

Dado que está familiarizado con el análisis de Fourier para el procesamiento de señales, no necesita saber mucho más para aplicarlo al procesamiento de imágenes: todos los filtros de interés inmediato son "separables", lo que básicamente significa que puede aplicarlos de forma independiente en el direcciones xey Esto reduce el problema del remuestreo de una imagen (2-D) al problema del remuestreo de una señal (1-D). En lugar de una función de tiempo (t), su señal es una función de uno de los ejes de coordenadas (por ejemplo, x); todo lo demás es exactamente lo mismo.

En última instancia, la razón por la que necesita utilizar un filtro es evitar el aliasing: si está reduciendo la resolución, debe filtrar los datos originales de alta frecuencia que la nueva resolución inferior no admite o se agregarán. a frecuencias no relacionadas en su lugar.

Asi que. Mientras filtra las frecuencias no deseadas del original, desea conservar la mayor cantidad posible de la señal original. Además, no desea distorsionar la señal que conserva. Finalmente, desea extinguir las frecuencias no deseadas de la forma más completa posible. Esto significa, en teoría, que un buen filtro debe ser una función de "caja" en el espacio de frecuencia: con respuesta cero para frecuencias superiores al límite, respuesta de unidad para frecuencias por debajo del límite, y una función de paso entre ellas. Y, en teoría, esta respuesta es alcanzable: como sabrá, un filtro de sinc directo le dará exactamente eso.

Hay dos problemas con esto. Primero, un filtro sinc directo no tiene límites, y no cae muy rápido; esto significa que hacer una convolución directa será muy lento. En lugar de convolución directa, es más rápido usar una FFT y filtrar en el espacio de frecuencia ...

Sin embargo, si realmente usa un filtro sinc recto, ¡el problema es que en realidad no se ve muy bien! Como dice la pregunta relacionada, perceptivamente hay artefactos que suenan, y prácticamente no hay una forma completamente satisfactoria de lidiar con los valores negativos que resultan de "undershoot".

Finalmente, entonces: una forma de lidiar con el problema es comenzar con un filtro sinc (por sus buenas propiedades teóricas) y modificarlo hasta que tenga algo que también resuelva sus otros problemas. Específicamente, esto te dará algo como el filtro Lanczos:

Lanczos filter: L(x) = sinc(pi x) sinc(pi x/a) box(|x|<a) frequency response: F[L(x)](f) = box(|f|<1/2) * box(|f|<1/2a) * sinc(2 pi f a) [note that "*" here is convolution, not multiplication] [also, I am ignoring normalization completely...]

  • el sinc (pi x) determina la forma general de la respuesta de frecuencia (para un mayor a, la respuesta de frecuencia se parece cada vez más a una función de caja)
  • la caja (| x | <a) le da soporte finito, por lo que puede usar convolución directa
  • el sinc (pi x / a) suaviza los bordes de la caja y (en consecuencia? ¿equivalentemente?) mejora en gran medida el rechazo de altas frecuencias indeseables
  • los dos últimos factores ("la ventana") también atenúan el sonido; hacen una gran mejora tanto en el artefacto perceptual como en la incidencia práctica de "subdesarrollo", aunque sin eliminarlos por completo

Tenga en cuenta que no hay magia sobre nada de esto. Hay una gran variedad de ventanas disponibles, que funcionan igual de bien. Además, para a = 1 y 2, la respuesta de frecuencia no se parece mucho a una función de paso. Sin embargo, espero que esto responda a su pregunta "por qué sinc", y le dé una idea sobre las respuestas de frecuencia, etc.