Ejemplos de ImageMagick -- Filtros de remuestreo
Aquí entramos en los aspectos de más bajo nivel del redimensionado y la distorsión de imágenes, examinando los filtros de remuestreo que se usan para determinar el color final de cada píxel individual en la imagen resultante. Es un tema amplio, largamente estudiado y, con frecuencia, lleno de opiniones y puntos de vista personales más que de hechos cualitativos firmes, ya que es imposible determinar qué constituye una imagen redimensionada perfecta. Esto es un hecho comprobado, y conforma un área de estudio muy extensa que nunca estará terminada. Se recomienda leer y comprender los Operadores de redimensionado y escalado.
Artefactos de remuestreo - ¿Qué tan bueno es el redimensionado de IM?
El redimensionado de imágenes debe enfrentarse a un problema muy difícil. ¿Cómo reducir un arreglo de valores a un arreglo más pequeño, o más grande, de modo que luzca bien a nuestros ojos? Muchas cosas pueden salir mal al intentarlo, pero se agrupan en cuatro categorías básicas.
Bloques
En esencia, si amplías una imagen simplemente replicando píxeles, crearás bloques rectangulares de píxeles más grandes. De hecho, ampliar imágenes usando "[-scale](https://imagemagick.org/command-line-options/#scale)" o "[-sample](https://imagemagick.org/command-line-options/#sample)" hace exactamente eso, produciendo una imagen pixelada ampliada. Por ejemplo, aquí escalo una imagen pequeña, generando grandes bloques de color en lugar de una imagen suave y agradable. Junto a ella hay una versión 'redimensionada' y, por último, una que usa un filtro Gaussian para desenfocarla más de lo normal y reemplazar los píxeles aislados por puntos redondos, a fin de eliminar parte del efecto de bloques.
magick storm.gif -scale 300% storm_scaled.gif
magick storm.gif -resize 300% storm_resized.gif
magick storm.gif -filter Gaussian -resize 300% storm_resized_gas.gif
![[IM Output]](../static/img/images/storm.gif)
Original | | ![[IM Output]](../static/img/filter/storm_scaled.gif)
Escalada | ![[IM Output]](../static/img/filter/storm_resized.gif)
Redimensionada | ![[IM Output]](../static/img/filter/storm_resized_gas.gif)
Redimensionada con Gaussian
---|---|---|---|---
La causa principal del 'efecto de bloques' es, o bien una imagen de origen mal suavizada (sin antialiasing), o un suavizado insuficiente (mezcla de colores o desenfoque) entre píxeles para mejorar el aspecto general de una imagen. También suele verse cuando una imagen de muy baja resolución se redimensiona a una escala mucho mayor o para usarse en un dispositivo de alta resolución. El lugar más común donde se observa es en el uso de una imagen de mapa de bits en boletines y revistas creados por usuarios que luego se imprimían en impresoras láser de muy alta resolución. El boletín se ve estupendo en pantalla, pero sale 'cuadriculado' en la página impresa. Esta situación es muy difícil de corregir y, en general, lo mejor es evitarla usando una imagen prediseñada de resolución mucho mayor, o una imagen vectorial escalable (como las imágenes en formato SVG y WMF). Por supuesto, en algunas situaciones los artefactos de bloques son en realidad deseables y se realzan en el resultado. Por ejemplo, cuando intentas recrear viejos videojuegos de baja resolución en pantallas modernas de alta resolución, conservar el viejo 'efecto de bloques' de la imagen realza el aspecto 'retro'. O quizás cuando intentas rotar imágenes sin generar colores nuevos o mezclados. Las técnicas que de hecho preservan el 'efecto de bloques', pero rellenan los cuadros con líneas diagonales, se conocen como Algoritmos de escalado de pixel art, y se han desarrollado muchos de esos métodos. Uno de ellos se ha integrado en ImageMagick, con el operador Magnify.
Ringing
El ringing es un efecto que a menudo se ve en imágenes JPEG de muy baja calidad cerca de bordes nítidos. Por lo general, lo causa un borde sobrecompensado por el algoritmo de redimensionado o de compresión de imagen, o el uso de un filtro de alta calidad con un tamaño de soporte inadecuado. Aquí, por ejemplo, uso una opción especial para seleccionar un filtro Sinc en bruto, sobre un cambio de color muy brusco. También repetí la operación usando el operador de redimensionado por defecto de IM, con su selección de filtro por defecto para ampliaciones de imagen.
magick -size 8x16 xc:'#444' xc:'#AAA' +append gray_edge.gif
magick gray_edge.gif -filter Sinc \
-resize 100x100\! gray_edge_ringing.gif
magick gray_edge.gif -resize 100x100\! gray_edge_resize.gif
Lo anterior muestra con bastante claridad la sobrecompensación producida por el uso de un filtro de redimensionado en bruto, sin ninguna de las optimizaciones que ofrece IM. La segunda imagen, producida por el filtro de ampliación por defecto de IM, también muestra un efecto de ringing muy leve, pero apenas perceptible y, de hecho, deseable, ya que agudiza perceptualmente el borde. Aquí hay otro ejemplo del efecto de ringing, esta vez ampliando un solo píxel sobre un fondo gris. |
magick -size 1x1 xc: -bordercolor '#444' -border 4x4 \
-define filter:lobes=5 -filter Sinc \
-resize 100x100\! dot_sinc.gif
![[IM Output]](../static/img/filter/dot_sinc.gif)
Esta imagen también muestra con claridad los efectos secundarios generados por el uso de un filtro unidimensional. Es decir, el efecto de ringing es más intenso en las direcciones horizontal y vertical (ortogonales), con un ringing secundario a 45 grados. Y esta vez con un filtro cilíndrico (mediante la operación Distort Resize), mostrando en qué se diferencia del filtro más habitual de 2 pasadas alineado ortogonalmente (tensorial) que usa el operador Resize. |
magick -size 1x1 xc: -bordercolor '#444' -border 4x4 \
-define filter:lobes=5 -filter Jinc \
-distort resize 100x100\! +repage dot_jinc.gif
![[IM Output]](../static/img/filter/dot_jinc.gif)
Estos efectos no suelen ser visibles, y aquí solo se aprecian por el uso de un filtro 'Sinc' o 'Jinc' en bruto (consulta Filtros con ventana más abajo) para algunas ampliaciones extremas. Por lo general, un filtro 'en bruto' como este no se utiliza.
Aliasing y efectos de muaré
Los efectos de aliasing se manifiestan normalmente como efectos de 'escalera' a lo largo de los bordes de las imágenes. A menudo esto se debe al muestreo en bruto de la imagen, como al usar "[-sample](https://imagemagick.org/command-line-options/#sample)", o a un afilado excesivo de la imagen durante el redimensionado. El efecto de escalera es más notorio en reducciones fuertes de imágenes, aunque rara vez se ve en IM. Sin embargo, el aliasing también tiene otros efectos, en particular los patrones de muaré a gran escala que aparecen en imágenes que contienen algún tipo de patrón a nivel de píxel. Estos patrones de bajo nivel suelen producir patrones de muaré a gran escala, entre ellos: patrones de líneas paralelas, tejidos de tela (¡la seda muestra este efecto en la vida real!), así como patrones de ladrillo y baldosa en fotos de edificios de ladrillo, vallas y pavimentos.
Para ver algunos ejemplos de imágenes redimensionadas que producen fuertes efectos de muaré, consulta la página Wikipedia, Moiré Pattern. La forma clásica de comprobar si un redimensionado producirá problemas de aliasing es reduciendo una imagen de anillos (mira a la derecha). Esta imagen a menudo muestra efectos de muaré cuando se aplica cualquier forma de redimensionado a cualquier escala. Los navegadores web, en particular, muestran tales efectos de muaré al mostrar una imagen así, debido al uso de una técnica de redimensionado ultrarrápida (pero a menudo deficiente).
Aquí muestro la imagen de 'anillos' redimensionada usando el operador "[-sample](https://imagemagick.org/command-line-options/#sample)" que produce fuerte aliasing, el operador "[-scale](https://imagemagick.org/command-line-options/#scale)" que promedia por bloques, y el "[-resize](https://imagemagick.org/command-line-options/#resize)" normal por defecto.
magick rings_sm_orig.gif -sample 100x100 rings_sample.png
magick rings_sm_orig.gif -scale 100x100 rings_scale.png
magick rings_sm_orig.gif -resize 100x100 rings_resize.png
![[IM Output]](../static/img/filter/rings_sample.png)
sample | ![[IM Output]](../static/img/filter/rings_scale.png)
scale | ![[IM Output]](../static/img/filter/rings_resize.png)
resize
---|---|---
Como puedes ver, todos los métodos de redimensionado produjeron algunos efectos de muaré, aunque el operador de redimensionado por defecto de IM produce la menor cantidad de estos patrones secundarios indeseables en la imagen final. Para mostrar los efectos de un redimensionado mínimo, recorté la esquina de la imagen de anillos grande, cuyo resultado se muestra primero, y luego reduje su tamaño solo un 5%.
magick rings_lg_orig.png -crop 105x105+0+0 rings_crop.png
magick rings_crop.png -sample 100x100 rings_crop_sample.png
magick rings_crop.png -scale 100x100 rings_crop_scale.png
magick rings_crop.png -resize 100x100 rings_crop_resize.png
![[IM Output]](../static/img/filter/rings_crop.png)
original recortado | | ![[IM Output]](../static/img/filter/rings_crop_sample.png)
sample | ![[IM Output]](../static/img/filter/rings_crop_scale.png)
scale | ![[IM Output]](../static/img/filter/rings_crop_resize.png)
resize
---|---|---|---|---
Como puedes ver, incluso un redimensionado mínimo revelará cualquier aliasing que pueda tener un operador de redimensionado. De hecho, si te fijas bien, quizá veas un efecto de muaré muy leve en el recorte original sin escalar de la imagen de partida, que se produce por las limitaciones de usar únicamente una imagen ráster con una densidad adecuada para mostrarse en la pantalla de un ordenador. Es decir, lo sensible que es esta imagen de prueba para mostrar los efectos de aliasing causados por la reducción de imágenes.
Desenfoque
La mayoría de la gente está familiarizada con el desenfoque que puede generar el uso de "[-resize](https://imagemagick.org/command-line-options/#resize)". De hecho, esta es probablemente la queja número uno sobre cualquier imagen redimensionada, y con razón. Normalmente, un redimensionado muy pequeño tiende a producir una imagen desenfocada, y redimensionarla de nuevo solo lo empeora. El problema es que, al redimensionar una imagen, cambias la imagen almacenada como una 'rejilla' o arreglo de píxeles (conocida como 'ráster') para ajustarla a una 'rejilla' de píxeles completamente distinta. Las dos 'rejillas' no coincidirán salvo en casos muy especiales y, como resultado, los datos de la imagen deben modificarse para encajar en este nuevo patrón de puntos. Básicamente, es imposible redimensionar directamente una imagen y esperar que quede bien, aunque puede lograrse un resultado razonable. El resultado suele ser un ligero desenfoque de los datos de píxel. Cuanto mejor sea el algoritmo de redimensionado, menor será el desenfoque de los bordes nítidos. Sin embargo, algunos filtros de redimensionado, en especial los diseñados específicamente para ampliar imágenes, suelen añadir mucho más desenfoque del necesario. Esto sirve para combatir los artefactos de 'bloques' demostrados arriba. Para la reducción de imágenes, a menudo se usa un borde desenfocado para evitar los artefactos de 'ringing' en los bordes nítidos y reducir posibles efectos de aliasing. Sin embargo, esto es un compromiso de medio pelo, y uno que IM se esfuerza en evitar. Aun así, puede usarse el ajuste experto especial Filter Blur para ajustar el desenfoque que aporta un filtro. Pero ten en cuenta que, aunque se supone que un número menor que 1.0 reduce el desenfoque, también puede empeorarlo, según el filtro exacto y las proporciones de redimensionado que se usen. No se puede dar ninguna garantía. |
Antes de IM v6.3.6-3, el ajuste Filter Blur se llamaba "[-support](https://imagemagick.org/command-line-options/#support)", lo cual era muy engañoso respecto a lo que hacía exactamente. Esta opción quedó obsoleta y ya no está disponible. |
|---|---|
| El mejor método para corregir los efectos de desenfoque causados por el redimensionado es volver a filtrar la imagen con un operador de afilado. Consulta Afilar imágenes redimensionadas para más detalles. |
El redimensionado de IM frente a otros programas
Bart van der Wolf ha publicado una comparación práctica del operador de redimensionado por defecto de IM con varios otros programas al redimensionar una imagen del mundo real, en...
En concreto, en resumen para el redimensionado de IM...
Aunque la cantidad de afilado es cuestión de gustos, la ausencia de artefactos de aliasing produce la imagen más limpia y de aspecto más natural de todas.
También pasa a examinar una prueba de 'anillos', para comparar directamente varios métodos de redimensionado de Photoshop frente a ImageMagick...
Estos artículos muestran lo importante que es hacer el redimensionado correctamente (y usar los métodos de filtrado adecuados) para el procesamiento de imágenes. Veremos esto más de cerca en la siguiente sección.
Filtros de remuestreo
El ajuste "[-filter](https://imagemagick.org/command-line-options/#filter)" es el control clave de cómo funcionan el "[Redimensionado de imágenes](resize.html#resize)" y el "[Operador Distort general](distorts.html#distort)" para producir un resultado limpio con el mínimo de Artefactos de remuestreo. Este fue un tema de intenso estudio a finales de la década de 1980, del cual Paul Heckbert, un investigador destacado en este campo, produjo y publicó libremente su programa de redimensionado de imágenes "**[zoom](http://www.xmission.com/~legalize/zoom.html)**". Este programa se convirtió en el padre de la mayoría de los programas de redimensionado de imágenes usados hoy, aunque muchos programas posteriores lo implementan deficientemente, ya que es fácil equivocarse. Por ejemplo, echa un vistazo a los resultados de probar cómo redimensionan imágenes los navegadores web. En muchos sentidos, estos filtros están estrechamente relacionados con la Convolución de imágenes, e incluso con el Núcleo de desenfoque. Incluso padecen problemas similares. Sin embargo, los filtros están diseñados para mejorar el aspecto del resultado final al redimensionar o, de otro modo, distorsionar una imagen. Los nombres de los filtros son un auténtico 'quién es quién' de los expertos en procesamiento de imágenes y matemáticos del último siglo (o más). Por lo general no describen el filtro, sino que son simplemente la etiqueta de la persona que publicó primero el filtro (o la familia de filtros), o que más investigó sobre él. Esto, sin embargo, hace mucho más difícil saber si un filtro 'Lagrange' (llamado así por Joseph-Louis Lagrange) es mejor que, digamos, un filtro 'Catrom' (llamado así por Edwin Catmull y Raphael Rom). Aquí explicaré los aspectos principales de los filtros. No es vital que aprendas estas cosas, pero decidí documentar un resumen de lo que aprendí, tras completar una investigación en esta área, como parte de una gran revisión y ampliación del sistema de filtros de redimensionado de IM (IM 6.3.7-1). Un agradecimiento especial a Fred Weinhaus por su ayuda en la investigación durante el rediseño de los filtros de redimensionado. Estaba especialmente interesado en la incorporación de la familia de filtros '[Lagrange](#lagrange)', que no existía en el redimensionado de IM antes de esta revisión. También un agradecimiento a Nicolas Robidoux, cuyas matemáticas ayudaron a resolver un fallo importante en el Operador Distort general, y a desarrollar luego los Filtros cilíndricos, que producen mejores resultados que los que se obtienen con el Operador Resize.
Cómo funcionan los filtros
Al redimensionar una imagen básicamente intentas determinar el valor correcto de cada píxel de la nueva imagen, a partir de los píxeles de la imagen de origen original. Sin embargo, estos nuevos píxeles no coinciden exactamente con las posiciones de los píxeles antiguos, así que debe determinarse de algún modo un valor correcto para ellos. Lo que se hace es intentar usar algún tipo de promedio ponderado de los valores de los píxeles de origen originales para determinar un buen valor para el nuevo píxel. Los píxeles reales que rodean la ubicación del nuevo píxel forman un 'vecindario' de valores que contribuyen. Cuanto mayor sea este vecindario, más lento será el redimensionado. Esta es una técnica llamada Convolución. La cantidad con la que cada píxel vecino real (conocido como 'muestra') contribuye a producir el píxel final la determina una función de ponderación. Este es el 'filtro' que puedes seleccionar usando el ajuste "[-filter](https://imagemagick.org/command-line-options/#filter)". Ese filtro, a su vez, suele tener un tamaño de vecindario ideal, conocido como el 'soporte' del filtro, aunque también se le conoce como su 'ventana'. Un 'filtro' bidimensional predefinido también se conoce como un 'núcleo de convolución'.
_FUTURE: some diagrams may be helpful here_
El diseño de estas funciones de ponderación, o 'filtros', es un asunto muy complejo que implica matemáticas avanzadas, análisis de frecuencias e incluso transformadas de Fourier. Un buen punto de partida si te interesa esto es Wikipedia: teorema de muestreo de Nyquist–Shannon. Sin embargo, en realidad no necesitas llegar tan lejos para entender los filtros existentes y sus efectos sobre las imágenes.
Los filtros
Filtros interpolados
Los tipos más simples de funciones de filtro de redimensionado son los métodos interpolativos. Estos toman una posición de píxel específica en la imagen de origen e intentan simplemente determinar un valor de color lógico para la imagen en esa posición a partir de los colores de los píxeles circundantes. Como solo interviene siempre un número fijo y mínimo de píxeles, este tipo de filtro es un método muy rápido para redimensionar o distorsionar imágenes. Sin embargo, esta es también la perdición del filtro, ya que no fusionará un número mayor de píxeles para formar una imagen mucho más pequeña que la original. Eso, a su vez, puede dar lugar a fuertes efectos de aliasing y muaré. La interpolación se usa normalmente solo para el muestreo 'puntual' de imágenes, cuando el escalado de la imagen no se conoce o no se necesita. Por ejemplo, al rotar una imagen o aplicar distorsiones menores, el escalado o tamaño de la imagen no cambia y, como tal, una interpolación puede producir un resultado razonable, aunque no muy preciso. Para más información, consulta el Ajuste de interpolación de IM. Sin embargo, no es adecuada para el redimensionado general de imágenes.
Point
Usar un ajuste "[-filter](https://imagemagick.org/command-line-options/#filter)" de '**Point**' significa básicamente usar un filtro de interpolación sin escalar. Para el Operador Resize, simplemente seleccionará el píxel más cercano a la posición del nuevo píxel, y eso es todo. Esto significa que el Operador Resize usará sin más el color de un píxel real de la imagen de origen. No se hará ningún intento de fusionar colores ni de generar un color mejor para la imagen resultante. En consecuencia, usar "-filter point -resize ..." producirá el mismo resultado que "[-sample](https://imagemagick.org/command-line-options/#sample)" (consulta el Operador de muestreo), aunque este último es más rápido, ya que su código está diseñado específicamente para redimensionar imágenes mediante muestreo puntual, con controles para ajustar el punto de muestreo exacto. | _Para el Operador Distort, seleccionar "[-filter](https://imagemagick.org/command-line-options/#filter) Point" forzará el uso del Muestreo puntual interpolado en lugar de un Filtro cilíndrico. Consulta Filtros de imagen en el Operador Distort para más detalles.
Si deseas el mismo Muestreo puntual interpolado para un redimensionado de imagen normal, puedes usar en su lugar el operador Redimensionado interpolativo. O usar un Distort Resize con filtro point para el mismo resultado.
_
---|---
Aquí parto de un patrón de cuadrícula de 10x10 píxeles y lo reduzco de tamaño, antes de escalarlo para que puedas ver el resultado.
magick -size 10x10 pattern:gray50 checks_10.gif
magick checks_10.gif -filter point -resize 9x9 checks_point-1.gif
magick checks_10.gif -filter point -resize 8x8 checks_point-2.gif
magick checks_10.gif -filter point -resize 7x7 checks_point-3.gif
magick checks_10.gif -filter point -resize 6x6 checks_point-4.gif
magick checks_10.gif -filter point -resize 5x5 checks_point-5.gif
![[IM Output]](../static/img/filter/checks_10_mag.gif)
| | ![[IM Output]](../static/img/filter/checks_point-1_mag.gif)
Point-1 | ![[IM Output]](../static/img/filter/checks_point-2_mag.gif)
Point-2 | ![[IM Output]](../static/img/filter/checks_point-3_mag.gif)
Point-3 | ![[IM Output]](../static/img/filter/checks_point-4_mag.gif)
Point-4 | ![[IM Output]](../static/img/filter/checks_point-5_mag.gif)
Point 50%
---|---|---|---|---|---|---
Lo único que ocurre realmente es que se eliminan filas y columnas individuales de píxeles a lo largo de la imagen. Incluso a este nivel, obtendrás bloques y aliasing extremos en la imagen resultante, y en casos concretos como el anterior puede producir un resultado completamente irreal. Por eso, un filtro 'Point', o el más rápido Operador de muestreo equivalente, no se recomienda para el redimensionado normal de imágenes.
Box
El ajuste de filtro '**Box**' es exactamente igual que 'point' con una pequeña variación. Al reducir imágenes, promediará y fusionará los píxeles. Cuanto más pequeña sea la imagen resultante, más píxeles se promediarán juntos.
Aquí hay una gráfica de la función de ponderación del filtro, a partir de la cual puedes ver por qué se llama filtro 'Box' (caja). Básicamente, cualquier píxel que caiga dentro de la 'caja' se usará directamente para calcular el color del nuevo píxel. Ahora bien, como el filtro solo tiene 1/2 píxel de ancho, eso significa que, para una imagen que en realidad no se está redimensionando, solo se usará un píxel, el más cercano. En otras palabras, cuando no hay escalado (o solo ampliación), el píxel más cercano a la nueva ubicación formará el color del nuevo píxel. Sin embargo, si una imagen se está haciendo más pequeña, una mayor parte de la imagen de origen se comprimirá dentro de los límites de esa 'caja'. El resultado es que se promediarán más píxeles para producir el color del píxel en la imagen más pequeña. Por ejemplo, aquí hay una vista ampliada de un patrón de píxeles en tablero de ajedrez mientras se comprime lentamente con un filtro 'Box'.
magick checks_10.gif -filter box -resize 9x9 checks_box-1.gif
magick checks_10.gif -filter box -resize 8x8 checks_box-2.gif
magick checks_10.gif -filter box -resize 7x7 checks_box-3.gif
magick checks_10.gif -filter box -resize 6x6 checks_box-4.gif
magick checks_10.gif -filter box -resize 5x5 checks_box-5.gif
![[IM Output]](../static/img/filter/checks_10_mag.gif)
| | ![[IM Output]](../static/img/filter/checks_box-1_mag.gif)
Box-1 | ![[IM Output]](../static/img/filter/checks_box-2_mag.gif)
Box-2 | ![[IM Output]](../static/img/filter/checks_box-3_mag.gif)
Box-3 | ![[IM Output]](../static/img/filter/checks_box-4_mag.gif)
Box-4 | ![[IM Output]](../static/img/filter/checks_box-5_mag.gif)
Box 50%
---|---|---|---|---|---|---
Como puedes ver, cada vez se fusionan más píxeles a medida que la imagen se redimensiona a un tamaño menor usando un filtro 'Box', pero la fusión ocurre en filas y columnas específicas e igualmente espaciadas. Esto causa todo tipo de artefactos y efectos de muaré o aliasing tanto al reducir como al ampliar imágenes. Se recomienda usar el filtrado 'Box' para el 'binning' de imágenes. Es decir, para reducir imágenes en múltiplos enteros, de modo que cada píxel del resultado sea un promedio del mismo número de píxeles vecinos (el 'bin'). Así, la imagen resultante se mantendrá de aspecto limpio, igual que en la imagen final de arriba. También se recomienda usar en su lugar el mucho más rápido Operador Scale. Producirá resultados casi idénticos, salvo en el caso especial de reducir imágenes solo unos pocos píxeles. Al hacer 'binning' producirá resultados idénticos. |
El Operador Scale no es exactamente igual que un 'filtro Box', ya que se implementa mediante un algoritmo especial de 'mezcla de píxeles'. Para detalles exactos, consulta Detalles internos de Scale. |
|---|---|
Al ampliar, tanto los filtros 'Point' como 'Box' producirán la misma 'replicación de píxeles' de filas y columnas, ya que todos acaban usando una simple selección del 'vecino más cercano'. |
magick -size 5x5 pattern:gray50 checks_5.gif
magick checks_5.gif -filter box -resize 6x6 checks_box+1.gif
magick checks_5.gif -filter box -resize 7x7 checks_box+2.gif
magick checks_5.gif -filter box -resize 8x8 checks_box+3.gif
magick checks_5.gif -filter box -resize 9x9 checks_box+4.gif
magick checks_5.gif -filter box -resize 10x10 checks_box+5.gif
![[IM Output]](../static/img/filter/checks_5_mag.gif)
| | ![[IM Output]](../static/img/filter/checks_box+1_mag.gif)
Box+1 | ![[IM Output]](../static/img/filter/checks_box+2_mag.gif)
Box+2 | ![[IM Output]](../static/img/filter/checks_box+3_mag.gif)
Box+3 | ![[IM Output]](../static/img/filter/checks_box+4_mag.gif)
Box+4 | ![[IM Output]](../static/img/filter/checks_box+5_mag.gif)
Box+5
---|---|---|---|---|---|---
| El Operador Scale también produce resultados similares, pero con algo de mezcla de color de los píxeles, al ampliar, salvo que se amplíe por un factor de escala entero.
---|---
Triangle
El filtro de interpolación 'Triangle' o '[Bilinear](misc.html#bilinear)' simplemente lleva la interpolación del vecindario más cercano un paso más allá. En lugar de solo promediar directamente los píxeles cercanos, como hace 'Box', los pondera según lo cerca que esté la posición del nuevo píxel de los píxeles originales dentro del vecindario (o región de 'soporte'). Cuanto más cerca esté el nuevo píxel de un píxel de la imagen de origen, más color aporta ese píxel. Esto produce un promediado de colores más global cuando las imágenes se reducen de tamaño.
magick checks_10.gif -filter triangle -resize 9x9 checks_tri-1.gif
magick checks_10.gif -filter triangle -resize 8x8 checks_tri-2.gif
magick checks_10.gif -filter triangle -resize 7x7 checks_tri-3.gif
magick checks_10.gif -filter triangle -resize 6x6 checks_tri-4.gif
magick checks_10.gif -filter triangle -resize 5x5 checks_tri-5.gif
![[IM Output]](../static/img/filter/checks_10_mag.gif)
| | ![[IM Output]](../static/img/filter/checks_tri-1_mag.gif)
Tri-1 | ![[IM Output]](../static/img/filter/checks_tri-2_mag.gif)
Tri-2 | ![[IM Output]](../static/img/filter/checks_tri-3_mag.gif)
Tri-3 | ![[IM Output]](../static/img/filter/checks_tri-4_mag.gif)
Tri-4 | ![[IM Output]](../static/img/filter/checks_tri-5_mag.gif)
Tri
---|---|---|---|---|---|---
Como puedes ver, como los píxeles de las esquinas eran coincidencias casi perfectas con las esquinas de la imagen original, son más visibles; pero hacia el centro, donde ninguno de los píxeles cercanos coincide exactamente con el nuevo píxel que se está generando, obtienes un color más promediado de todo el vecindario. El resultado para el patrón de píxeles en tablero de ajedrez es una tendencia a fundirse hacia dentro y hacia fuera de un color gris promedio. Sin embargo, como el vecindario de 'soporte' es mayor, intervendrán más píxeles cuando amplíes la imagen. Así se produce un promediado de colores al generar los píxeles que se añaden a la imagen.
magick checks_5.gif -filter triangle -resize 6x6 checks_tri+1.gif
magick checks_5.gif -filter triangle -resize 7x7 checks_tri+2.gif
magick checks_5.gif -filter triangle -resize 8x8 checks_tri+3.gif
magick checks_5.gif -filter triangle -resize 9x9 checks_tri+4.gif
magick checks_5.gif -filter triangle -resize 10x10 checks_tri+5.gif
![[IM Output]](../static/img/filter/checks_5_mag.gif)
| | ![[IM Output]](../static/img/filter/checks_tri+1_mag.gif)
Tri+1 | ![[IM Output]](../static/img/filter/checks_tri+2_mag.gif)
Tri+2 | ![[IM Output]](../static/img/filter/checks_tri+3_mag.gif)
Tri+3 | ![[IM Output]](../static/img/filter/checks_tri+4_mag.gif)
Tri+4 | ![[IM Output]](../static/img/filter/checks_tri+5_mag.gif)
Tri+5
---|---|---|---|---|---|---
Para ampliaciones a gran escala, el resultado actúa como si se añadiera un degradado de colores entre todos y cada uno de los píxeles. Por ejemplo, aquí genero una imagen muy pequeña con un único píxel blanco (la visualización es una vista ampliada). Luego amplío enormemente esa imagen.
magick xc: -bordercolor black -border 2x0 pixel_5.gif
magick pixel_5.gif -filter triangle -resize 300x pixel_triangle.gif
![]()
Imagen de un solo píxel
(ampliado) | | ![]()
Filtro Triangle ampliado
---|---|---
Si graficaras los colores de la imagen anterior (usando el script "[im_profile](../static/img/scripts/im_profile)"), verías una réplica de la gráfica del filtro triangular.
![[IM Profile]](../static/img/filter/plot_triangle.gif)
Perfil de la imagen
Como puedes ver, el píxel central se fusionó con los píxeles vecinos para producir un degradado lineal de colores entre esos puntos. Todos los filtros de interpolación producen patrones de degradado similares entre píxeles vecinos, y es también la razón por la que son tan adecuados para las ampliaciones de imagen.
Otros filtros de interpolación
A la derecha he graficado los distintos filtros de interpolación, excepto 'Point', que en realidad es un caso muy especial de un filtro 'Box' sin escalar (una interpolación '[NearestNeighbor](misc.html#nearest)' pura). Otros filtros de interpolación incluyen '**Hermite**', que en resultados es muy similar a triangle, pero produce un redondeo más suave para las ampliaciones, suavizando las transiciones de degradado. Haz clic en la gráfica de la derecha para ver una gráfica de estas tres funciones de filtro.
Al filtro '**Lagrange**' se le ha llamado un filtro de interpolación 'universal'. Variando el tamaño del 'soporte' (consulta el Ajuste experto de soporte más abajo), puede generar todos los filtros de interpolación vistos anteriormente (excepto 'Hermite'). Los ajustes por defecto (un filtro Lagrange de orden 3 (support=2.0), mostrado como la línea morada en la gráfica de la derecha) proporcionan un filtro 'cúbico' razonable. Funciona muy bien, aunque el cambio de degradado puede producir algunos efectos de bloques perceptibles en la ampliación, si bien con imágenes de mapa de bits y dibujos lineales esto puede ser algo bueno. Más sobre los otros órdenes del Filtro Lagrange más adelante.
El filtro '**Catrom**' (Catmull-Rom) es un conocido Filtro cúbico estándar, a menudo usado como función de interpolación, y está disponible con el mismo nombre. Este filtro produce un borde razonablemente nítido, pero sin el pronunciado cambio de degradado en las ampliaciones de imagen a gran escala que puede producir un filtro 'Lagrange'. Es básicamente equivalente a un 'unsharp resize' incorporado (consulta Afilar imágenes redimensionadas), aunque algunos lo consideran demasiado nítido y no ofrece ningún control del afilado. Lo que hace más interesante a un filtro 'Catrom' es que es casi un equivalente cúbico idéntico de un filtro '[Lanczos](#lanczos)' de 2 lóbulos, que es probablemente el Filtro Sinc con ventana más usado (ver abajo). También veremos este filtro más de cerca más adelante, en Filtros cúbicos.
La interpolación y el ajuste Interpolate de IM
El ajuste Interpolate de IM, que se usa para producir una búsqueda 'puntual' sin escalar de imágenes en operadores como el Operador FX DIY ("[-fx](https://imagemagick.org/command-line-options/#fx)") y el Operador de reemplazo por tabla de colores ("[-clut](https://imagemagick.org/command-line-options/#clut)"), y algunas funciones antiguas de Distorsión circular, se basa en estos sencillos filtros de redimensionado por interpolación. Sin embargo, actualmente se implementan con código aparte y también tienen nombres de ajuste distintos. Estos Ajustes de interpolación incluyen: '[NearestNeighbor](misc.html#nearestneighbor)', que implementa el filtro 'Point' (o 'Box' sin escalar), y '[BiLinear](misc.html#bilinear)' para obtener un filtro 'Triangle' sin escalar. NOTA: Por ahora, el filtro triangular suavizado 'Hermite' no se ha implementado directamente como un Ajuste de interpolación, lo cual es una lástima, ya que es un filtro de interpolación bastante bueno.
Filtros de desenfoque Gaussian
En las complejas matemáticas de las transformadas de Fourier al dominio de la frecuencia, se supone que los filtros de redimensionado eliminan cualquier ruido de alta frecuencia que pueda estar presente. Este ruido lo causa el muestreo de una imagen del mundo real en píxeles y, cuando redimensionas una imagen, ese ruido aparece como efectos de aliasing y muaré. Por ello, la campana de Gauss se convirtió en un candidato temprano y natural como filtro de redimensionado o remuestreo, ya que es el modelo ideal para los efectos del mundo real.
Gaussian
El filtro Gaussian es un filtro muy especial que genera esa misma forma de 'campana' en el dominio de la frecuencia. Esto lo hace muy útil como filtro de imagen, ya que garantiza una buena eliminación de ese ruido de alta frecuencia de una manera muy controlable. Sin embargo, si examinas la gráfica del filtro, verás que a una distancia de un píxel del punto de muestreo tienes un valor distinto de cero. De hecho, es un valor bastante alto. Esto produce una enorme cantidad de desenfoque de los píxeles individuales, incluso cuando no se realiza ningún redimensionado. Por ejemplo, aquí he redimensionado el logo estándar de IM usando un filtro Gaussian y de nuevo usando el filtro normal de IM ('Lanczos' en este caso, que veremos más adelante)
magick logo: -filter Gaussian -resize 150x logo_gaussian.png
magick logo: -resize 150x logo_normal.png
| ![[IM Output]](../static/img/filter/logo_gaussian.png)
Gaussian | ![[IM Output]](../static/img/filter/logo_normal.png)
Redimensionado normal
---|---|---
Si te fijas bien, verás que la imagen filtrada con 'Gaussian' de la izquierda está más borrosa que el redimensionado normal. Especialmente en lo que respecta al detalle de las estrellas más pequeñas alrededor de la varita y en el sombrero del mago. Este desenfoque de la imagen es el precio que pagas por eliminar todos los efectos de aliasing en la reducción de imágenes, así como todos los efectos de bloques en la ampliación. Tampoco producirá nunca efectos de ringing (cuando se aplica a la perfección). Pero todo eso es a costa de un desenfoque extremo en la imagen resultante. De hecho, durante las ampliaciones a gran escala, este filtro generará puntos redondos, en lugar de puntos de aspecto cuadrado. Por ejemplo, aquí amplío enormemente una imagen de 3x3 píxeles con un único punto en el centro. |
magick xc:red -bordercolor yellow -border 1 \
-filter Gaussian -resize 99x99 -normalize dot_gaussian.jpg
![[IM Output]](../static/img/filter/dot_gaussian.jpg)
Como puedes ver, un solo píxel se amplía hasta convertirse en un punto perfectamente circular. Solo los filtros Gaussian y de tipo Gaussian harán esto.
Control experto Sigma de Gaussian
Puedes controlar el filtro Gaussian directamente usando una opción experta especial "[-define](https://imagemagick.org/command-line-options/#define) filter:sigma=_{valor}_" para especificar el valor real de 'sigma' de la curva de Gauss. Por defecto, este valor es '0.5', que es también el mismo tamaño que el Filtro Box. En muchos sentidos, puedes considerar un filtro Gaussian como, en esencia, una 'caja desenfocada'. Esta opción experta se añadió para permitir la creación de desenfoques Gaussian muy pequeños, sin reducir el rango de soporte del filtro (ver abajo). Sin embargo, aumentar 'sigma' podría hacer que el filtro quedara recortado. Por eso, al aumentar el valor de 'sigma', el 'soporte' por defecto (2.0) también se incrementa en una cantidad similar. Esto solo ocurre con los aumentos del valor 'sigma' por defecto. El Ajuste experto de soporte puede usarse para anular este efecto automático, pero normalmente no es necesario. | _La opción experta 'filter:sigma' solo funciona para el Filtro Gaussian. Ningún otro filtro se ve afectado por este control experto.
Un control más generalizado, para otros filtros, puede lograrse mediante el Control experto Blur del filtro, que veremos más adelante.
Otros filtros de tipo Gaussian
Si estudias las gráficas comparativas de la derecha, verás que el filtro 'Quadratic', así como el algo más complejo 'Spline', siguen bastante bien la curva de ponderación del filtro 'Gaussian'. Y, al ser funciones polinómicas, también son mucho más rápidos de calcular, que es la razón por la que se inventaron originalmente. Mientras que 'Quadratic' es muy ligeramente más borroso que el Filtro Gaussian, el filtro 'Spline' lo es aún más, con un ajuste de Sigma equivalente de aproximadamente '0.65'. Esto hace del filtro 'Spline' el filtro más borroso que se ofrece sin modificaciones. Examinando las gráficas verás que, al igual que el Filtro Gaussian y a diferencia de los Filtros de interpolación, tienen un valor distinto de cero a una distancia de 1.0 del punto de muestreo. Esto hace que los píxeles cercanos fusionen sus colores, y es la causa del desenfoque que ves. El filtro 'Spline', al tener el valor más alto a la distancia de 1.0, produce la mayor cantidad de desenfoque en cualquier imagen redimensionada (o distorsionada). Este desenfoque extra elimina los últimos restos de cualquier efecto de 'bloques' que pueda estar presente en las ampliaciones a gran escala. Y podría usarse con una técnica de Afilar imágenes redimensionadas para ampliar dibujos lineales con muy pocos 'efectos de escalera' en el resultado. El filtro '[Mitchell](#mitchell)' también se muestra en la gráfica de comparación. Este filtro también tiene algo de desenfoque a la distancia de 1.0 del punto de muestreo, lo que también lo hace ligeramente borroso, muy parecido a los otros filtros que hemos visto. Sin embargo, también tiene algo de ponderación negativa en su curva, lo cual, aunque produce efectos de ringing (consulta Filtros Sinc con ventana más adelante), compensa esa borrosidad cerca de los bordes nítidos.
Control experto de soporte del filtro
El filtro Gaussian se conoce como un filtro IIR (respuesta al impulso infinita), lo que simplemente significa que la 'curva' de respuesta que usa nunca llega a cero. Es decir, por muy lejos que te alejes del punto de muestreo, seguirás teniendo alguna contribución distinta de cero al resultado proveniente de píxeles muy lejanos. En términos matemáticos esto es en realidad algo bueno, ya que significa que el resultado es mucho más perfecto matemáticamente. En la aplicación práctica es muy malo, ya que un filtro infinito te obliga a usar un promedio ponderado de cada píxel de la imagen original para generar todos y cada uno de los nuevos píxeles de la imagen de destino. Eso significa que las imágenes grandes tardarían muchísimo en redimensionarse a la perfección con este filtro. Sin embargo, para el filtro 'Gaussian', cualquier cosa más allá de un rango de unos 2 píxeles (4 veces su ajuste 'sigma' por defecto) desde el punto de muestreo producirá, en general, muy poco efecto en el resultado final y, por tanto, suele poder ignorarse. Incluso 3 veces sigma se considera por lo general razonable. Este rango se conoce como la 'ventana de soporte' del filtro y es el límite práctico del programa para el filtro. Si realmente quieres, puedes cambiar el 'soporte' de un filtro usando el ajuste experto especial "[-define](https://imagemagick.org/command-line-options/#define) filter:support=_{valor}_". Por ejemplo, aquí redimensiono una imagen con un solo píxel usando el valor de soporte más pequeño de 1.25, o 2 veces y media el valor de sigma (consulta la gráfica resultante de la derecha). Esto es, por supuesto, menor que el mínimo normalmente aceptado de 3 veces el valor de sigma. |
magick pattern:gray5 -crop 5x1+0+3 +repage pixel_5.gif
magick pixel_5.gif -filter gaussian -define filter:support=1.25 \
-resize 300x pixel_gaussian.png
![]()
Imagen de un solo píxel | | ![]()
Filtrado con Gaussian
---|---|---
![[IM Profile]](../static/img/filter/plot_gaussian.gif)
Perfil de la imagen
Al usar el ajuste de 'soporte' más pequeño, el 'escalón' (donde la ventana de soporte corta la función) se desplazó a la posición 1.25. Eso, a su vez, produce una 'parada' mayor en el perfil del filtro, y da lugar a un efecto de 'aliasing' que puedes ver en la ampliación. Es decir, el ondulado cerca del 'pico' de la gráfica, así como una 'caída' repentina en los bordes de los límites de 'soporte' del filtro. Puedes pensar en el 'soporte' como una 'ventana' deslizante a través de los píxeles que se promedian para producir el resultado de la imagen ampliada. Como el tamaño del soporte es 1.25, el área de soporte total del filtro tiene 2.5 píxeles de ancho (sin escalar durante las ampliaciones de imagen); por tanto, puedes tener 2 o 3 píxeles involucrados en la fase de redimensionado horizontal. A medida que esta 'ventana' de soporte se desliza por la imagen, cada píxel que entra o sale generará el 'cambio' repentino en la 'curva' del filtro. Esa es la causa de los ligeros bamboleos en los resultados. Es decir, en esos puntos se añade o se quita un píxel del número total de píxeles que se promedian según la curva de ponderación del filtro. Esto, a su vez, produce cuatro de esos 'bamboleos' o 'zigzags' en la imagen redimensionada: un par inicial en los bordes exteriores cuando el único píxel blanco entra o sale del rango de soporte, y un segundo par de bamboleos cuando un segundo píxel negro (que hace un promedio ponderado de tres píxeles) entra o sale del rango de soporte. Si no hubiera una 'parada' tan repentina en el filtro, es decir, si el filtro llegara a cero en el ajuste del límite de soporte, no verías los 'bamboleos' y no tendrías el efecto visible. Usar un tamaño de soporte fijado en un entero o medio entero (como el ajuste de 'soporte' por defecto de '2.0' para un filtro 'Gaussian') aseguraría siempre que, cada vez que un nuevo píxel entra en el rango de soporte, otro píxel está saliendo, de modo que el mismo número de píxeles forma siempre parte de ese promedio. Eso eliminaría los dos bamboleos 'centrales', pero no eliminará los bamboleos iniciales del exterior, que marcan los límites de soporte. Incluso los cambios bruscos de pendiente (discontinuidades) en el filtro, como los que obtienes de un filtro Triangle o Lagrange, pueden generar artefactos visibles en la imagen resultante. | _Antes de IM v6.3.6-3, el 'soporte' del filtro Gaussian estaba fijado en este valor de '1.25', produciendo efectos de ringing en las ampliaciones (como se muestra arriba). Por esta razón, el 'soporte' de Gaussian se cambió a '1.5' para asegurar que siempre se promediara el mismo número de píxeles, y para reducir el escalón más pequeño.
A partir de IM v6.6.5-0, el ajuste de 'soporte' por defecto para Gaussian se aumentó a un valor de '2.0'. Esto tiene poco efecto sobre la velocidad general del filtro, pero hace que la 'parada' sea prácticamente inexistente. También simplificó la codificación del filtro para otros usos especiales del mismo, en concreto para las distorsiones EWA y el Mapeo de desenfoque variable.
_
---|---
Ten en cuenta, no obstante, que si usas un ajuste de soporte muy grande, por supuesto será necesario promediar más píxeles, lo que hace la operación de redimensionado más lenta, sin ninguna mejora real en los resultados. Solo los filtros Sinc/Jinc con ventana y Lagrange pueden generar en general un mejor resultado usando una ventana de soporte mayor que 2.0. Recuerda que estas son opciones 'expertas' y, como tales, es más probable que con ellas empeores las cosas en lugar de mejorarlas. Por eso no son una simple opción de línea de comandos, sino que se proporcionan mediante la opción especial "[-define](https://imagemagick.org/command-line-options/#define)". Por supuesto, eres libre de experimentar, igual que he hecho yo arriba, para intentar entender mejor las cosas, e IM ofrece estas opciones precisamente para que puedas hacerlo.
Control experto Blur del filtro
Una opción experta especial, "[-define](https://imagemagick.org/command-line-options/#define) filter:blur=_{valor}_", puede usarse para ajustar la cantidad de desenfoque que aporta un filtro. Un valor de '1.0' produce la acción por defecto, mientras que valores menores y mayores ajustan la 'borrosidad' general. Básicamente, esto agranda o encoge linealmente la curva del filtro a lo largo del eje X (distancia del píxel respecto al punto de muestreo), y normalmente hace un filtro más o menos borroso en conjunto. Usar un ajuste más pequeño hace que la función del filtro (y su ventana de soporte) se vuelva más pequeña. Para los filtros Gaussian y de tipo Gaussian, el efecto es como si multiplicaras el valor 'sigma' del filtro (por defecto=0.5) por este factor 'blur'. Este ajuste también agrandará o encogerá la ventana de soporte del filtro en la misma cantidad para evitar el recorte, pero esto puede anularse usando el Ajuste experto de soporte del filtro. Por ejemplo, aquí redimensiono una imagen con tres ajustes 'blur' distintos, usando un filtro Spline de tipo Gaussian..
for blur in 0.5 1.0 1.5; do \
magick logo: -define filter:blur=$blur -filter Spline \
-resize 150x logo_blur_$blur.png; \
done
![[IM Output]](../static/img/filter/logo_blur_0.5.png)
blur 0.5 | | ![[IM Output]](../static/img/filter/logo_blur_1.0.png)
blur 1.0 | | ![[IM Output]](../static/img/filter/logo_blur_1.5.png)
blur 1.5
---|---|---|---|---
Como puedes ver, este ajuste especial te permite controlar la borrosidad general del resultado para el filtro 'Spline'. Como el tamaño de la 'ventana de soporte' también se escala con el ajuste Filter Blur, usar valores de escalado muy pequeños puede hacer que el remuestreo 'no toque' ningún píxel, o genere solo píxeles de ponderación cero. Como resultado, se generarán 'líneas' o bloques negros regulares. Por ejemplo... |
magick rose: -define filter:blur=0.1 -filter Gaussian \
-resize 100x100 rose_black_bars.png
![[IM Output]](../static/img/filter/rose_black_bars.png)
Aumentar el tamaño de la ventana de soporte (antes de que se escale por blur) puede ayudar a prevenir estos efectos, pero como la mayoría de los filtros solo producirán ponderaciones cero para los píxeles que caen fuera de su rango de soporte 'natural', no funcionará para todos los filtros. Los únicos filtros que normalmente generarán valores útiles distintos de cero en todo el rango de soporte son el Filtro Box y los Filtros Sinc/Jinc con ventana. Pueden verse efectos similares con los Filtros cilíndricos, cuando el soporte de los filtros se vuelve demasiado pequeño para encontrar siempre al menos un píxel que muestrear. Los Filtros Lagrange usan el Ajuste experto de soporte del filtro para determinar el 'orden' apropiado que encaje en la 'ventana de soporte', y así se transforman en otras formas diversas (ver abajo). | _Usar ajustes de soporte inadecuados con filtros que contienen ponderaciones negativas (básicamente cualquiera de los filtros que veremos a continuación) puede producir afilado inverso y efectos de negación, así como efectos de aliasing desproporcionadamente más fuertes. En casos raros, incluso puede generar colores de ponderación infinita (que se recortan a blanco y negro puros en las versiones normales no HDRI de IM).
Se recomienda precaución y experiencia al usar esta opción especial con cualquier filtro.
---|---
| _Antes de IM v6.3.6-3, el define 'filter:blur' lo fijaba por error la opción "-support", lo cual era muy engañoso respecto a lo que hacía exactamente. Esta opción quedó obsoleta y ya no está disponible.
---|---
Variante del filtro interpolador Gaussian
Un valor de Control Blur de '0.75' en los Filtros de tipo Gaussian, o usar un valor de Control Sigma de '0.375' para el Filtro Gaussian, generará una variante que llamo interpolador Gaussian. Este filtro Gaussian afilado tiene propiedades similares a las de los Filtros de interpolación que vimos arriba. Pero no contiene paradas bruscas ni otros cambios de degradado que puedan notarse en imágenes ampliadas. En este sentido, se parece mucho al filtro "[Hermite](#hermite)" (ver gráfica), pero con un sesgo no simétrico que sí parece funcionar mejor como interpolador.
magick logo: -filter Gaussian -resize 150x logo_gaussian.png
magick logo: -define filter:blur=0.75 -filter Gaussian \
-resize 150x logo_gaussian_interpolate.png
![[IM Output]](../static/img/filter/logo_blur_1.5.png)
Gaussian | | ![[IM Output]](../static/img/filter/logo_gaussian_interpolate.png)
Interpolador Gaussian
(blur=0.75 o sigma=0.375)
---|---|---
De hecho, encuentro que hace que el filtro Gaussian produzca resultados mucho más aceptables, que no son ni demasiado nítidos ni demasiado borrosos. Sin embargo, reducir el desenfoque del filtro realzará los efectos de aliasing, por lo que será más probable que se generen efectos de muaré a gran escala a partir de patrones a nivel de píxel de bajo nivel. Este es el compromiso de usar una forma menos borrosa del filtro.
magick rings_crop.png -filter gaussian -resize 100x100 rings_gaussian.png
magick rings_crop.png -filter gaussian -define filter:blur=0.75 \
-resize 100x100 rings_gaussian_interpolate.png
![[IM Output]](../static/img/filter/rings_gaussian.png)
Gaussian | | ![[IM Output]](../static/img/filter/rings_gaussian_interpolate.png)
Interpolador Gaussian
(blur=0.75 o sigma=0.375)
---|---|---
Filtros Sinc con ventana
Filtros Sinc
Las matemáticas han determinado que el filtro ideal para redimensionar imágenes (usando una técnica de redimensionado 'tensorial' de 2 pasadas) es la función Sinc(). (Consulta el teorema de muestreo de Nyquist-Shannon).
La función Sinc(), al ser matemáticamente perfecta, tiene algunas características especiales que me gustaría señalar. Primero, en cada distancia entera del punto de muestreo, la función de ponderación del filtro se hace cero. Esto es muy importante, ya que significa que el filtro no desenfoca la imagen más de lo necesario (a diferencia de los Filtros Gaussian). También significa que, si una imagen se remuestrea sin redimensionar (un redimensionado 'sin operación'), la imagen permanece completamente inalterada por el filtro. Es, por tanto, un filtro interpolativo, aunque muy complejo. La función Jinc() está estrechamente relacionada con Sinc(), y tiene propiedades que la hacen útil como filtro para el filtrado bidimensional, como el que usa el Operador de distorsión de imagen general. Más sobre esta función más adelante, en Filtros cilíndricos. Por ahora, solo ten en cuenta que también podría usarse como función base para los Filtros Jinc con ventana. La otra gran diferencia entre los filtros basados en Sinc() y Jinc() y los filtros anteriores que hemos visto es que muchas de las ponderaciones son negativas. Es decir, restarán parte de los píxeles de color cercanos del color final, para cada píxel de la imagen. Esto puede parecer un poco extraño, pero da como resultado un fuerte afilado de los bordes de los objetos. Por supuesto, cualquier ponderación negativa generalmente necesita compensarse con muchas más ponderaciones positivas a lo largo de la curva, lo que produce la función ondulatoria que ves extendiéndose en un largo rango desde el punto de muestreo. Estos 'lóbulos' adicionales de ponderaciones positivas (y negativas) causan artefactos de ringing en imágenes que contienen límites de color muy fuertes, como en dibujos lineales de alto contraste, o un límite como el de un tejado rojo contra un cielo azul. Estos efectos de ringing pueden volverse aún más pronunciados si los filtros basados en estas funciones se aplican de forma inadecuada.
Funciones de ventana
Por desgracia, esta función también es una función IIR (respuesta al impulso infinita). Es decir, tiene efectos que llegan hasta el infinito, igual que el Filtro Gaussian anterior. Esto significa que, para usar 'Sinc', necesitarías generar un promedio ponderado de cada píxel de la imagen (y más allá) para crear la mejor representación de todos y cada uno de los nuevos píxeles de la imagen de destino. Esto es prohibitivamente costoso, lo que hace impráctico el uso directo de estos filtros perfectos. No es que quisieras hacerlo, debido a los efectos de ringing. Pero, a diferencia del Filtro Gaussian, la función 'Sinc' no decae simplemente hasta casi cero a poca distancia del punto de muestreo. De hecho, incluso a 10 píxeles del punto de muestreo (ver gráfica arriba), puedes obtener un efecto apreciable en el resultado final. Sin embargo, redimensionar una imagen con un filtro que tiene una distancia de soporte de 10 requeriría promediar al menos 20x20, o 400 píxeles por cada píxel del resultado final. Y eso produciría un redimensionado muy lento. En consecuencia, no se recomienda usar una forma 'en bruto' del filtro "Sinc", y casi nunca se usa, aunque mediante los Controles expertos de filtro IM no te impedirá hacerlo, si es lo que realmente quieres hacer. Lo que se recomienda y se proporciona son formas 'con ventana' de la función Sinc, desarrolladas por expertos en procesamiento de imágenes, que pueden usarse para 'limitar' las funciones Sinc (y Jinc) infinitas a un tamaño más práctico. Estos filtros de ventana incluyen filtros como: 'Blackman', 'Bohman', 'Hann', 'Hamming', 'Lanczos', 'Kaiser', 'Welch', 'Bartlett' y 'Parzen'.
Cómo funcionan los filtros con ventana
Por ejemplo, la gráfica de la derecha muestra tres funciones (haz clic para verla ampliada). La función roja es la función Sinc() matemáticamente ideal, que se extiende hasta el infinito. La función verde es una función de ventana "Hann" (basada en una simple curva Cosine()). Esta se multiplica por la Sinc() para modular los componentes más distantes del filtro, llegando a cero (o casi cero) en el borde de la ventana de soporte (4.0 unidades de píxel de distancia por defecto para este filtro). Básicamente, al seleccionar 'Hann' para la selección "[-filter](https://imagemagick.org/command-line-options/#filter)", en realidad estás seleccionando la 'función de ventana' 'Hann()' para modular la 'función de ponderación', como 'Sinc()' (o 'Jinc()'). Por eso, los 'filtros con ventana' son en realidad dos funciones: o la función Sinc o la función Jinc (según el operador de procesamiento de imágenes), y la 'función de ventana' que hayas seleccionado específicamente como filtro a usar. (Consulta Controles expertos de filtro más abajo). |
Antes de la v6.3.6-3, IM cometía el grave error de usar realmente las funciones de ventana directamente como función de ponderación del filtro. Esto, a su vez, hacía que todos estos filtros (excepto Lanczos) produjeran imágenes muy aliased cuando se usaban para redimensionar. En consecuencia, los usuarios de IM a menudo malinterpretaban estos filtros o rara vez los usaban. Esto ya se ha corregido. |
|---|---|
Las distintas funciones de ventana
A la derecha hay una gráfica de todas las distintas funciones de ventana que IM tiene disponibles al momento de escribir esto (después se añadieron más). Sí, hay muchas, ya que las funciones de ventana han sido objeto de intenso estudio por numerosos expertos en procesamiento de señales. Todas las funciones de filtro con ventana se usarán en general para modular una función de ponderación Sinc (o Jinc) usando un soporte de 3 o 4 para Sinc (3 o 4 lóbulos), según la clase de función de ventana que se use (ver abajo). Por ejemplo, un filtro de ventana 'Blackman' usará 4 lóbulos, pero 'Lanczos' usará 3 lóbulos. Esto depende de tu versión de IM, así que comprueba la Opción experta de filtro verbose si quieres asegurarte. Como puedes ver, todas las funciones de filtro con ventana producen una forma atenuada de la función Sinc() original, que también se muestra. Y, aparte de la cantidad de ringing que genera un filtro concreto, a menudo hay muy poco que distinga un filtro con ventana de otro. Probablemente uno de los mejores filtros con ventana es 'Lanczos'. Mientras que otras personas juran por 'Blackman', 'Bohman', 'Hann' (una campana atenuada por coseno), 'Hamming' (variante de campana de coseno), 'Cosine' (un único lóbulo de coseno) como funciones de ventana. Todas estas funciones se basan en el uso de una función Sinc, o Seno/Coseno, en su formulación, lo que supuestamente asegura que la función tendrá una buena respuesta en frecuencia. Las otras funciones de ventana incluyen 'Welch' (parabólica), 'Parzen' (spline cúbica), 'Kaiser' (Bessel) y, probablemente la más simple, 'Bartlett' (triangular o lineal). Normalmente, estas funciones se crearon por su simplicidad y rapidez de cálculo, aunque suelen considerarse de 'respuesta en frecuencia' deficiente. Además, muchas de estas funciones de ventana se usan como filtros de remuestreo por derecho propio. Por ejemplo, la 'Bartlett' (que es probablemente la más rara de todas las funciones de ventana) es en realidad la misma función matemática usada para un filtro 'Triangle', así como para el filtro de interpolación 'Bilinear'. Todas las funciones (excepto 'Bartlett') forman dos categorías básicas de funciones de ventana.
- Una curva en forma de 'campana' atenuada, como '
Hamming', 'Hann', 'Kaiser', 'Blackman', 'Bohman' y 'Parzen'. - Y un tipo de función de ventana de 'lóbulo' no atenuado que cae rápidamente a cero, antes de ser 'recortado' por el soporte de la ventana, como '
Lanczos', 'Welch' y 'Cosine'.
Si estudias la gráfica de funciones de ventana anterior, puedes ver en qué difieren las formas de los dos estilos de filtro. Sin embargo, las dos categorías de funciones de ventana no parecen ser tan importantes como la 'respuesta en frecuencia' general que obtienes al usar una curva definida trigonométricamente. Las funciones de ventana en forma de 'campana' atenuada usarán un Soporte en lóbulos de más de 4 lóbulos de la función de ponderación Sinc (o de la función Jinc en el remuestreo cilíndrico (distort)). El tipo de filtros de ventana de 'lóbulo' no atenuado usará por defecto un soporte de 3 lóbulos. Esto da como resultado una equivalencia aproximada entre los dos tipos de filtro de ventana, debido a la diferencia en el decaimiento de la función de ventana. Esto también significa que los filtros con ventana no atenuados serán, por defecto, ligeramente más rápidos que los atenuados. El número de lóbulos que los filtros deberían tener por defecto se discutió en la discusión de los foros de IM, ¿Añadir ventana Cosine?. Por supuesto, si quieres, puedes cambiar el Soporte en lóbulos o incluso solo el soporte general de cualquiera de los filtros de redimensionado. Todos son más o menos iguales, solo con variaciones muy ligeras en la cantidad de efectos de ringing y de bloques que se produce.
A la derecha están las mismas funciones de ventana, pero usando el Soporte en lóbulos por defecto definido por IM según la naturaleza atenuada/no atenuada de la función. Como puedes ver, a lo largo de los dos primeros lóbulos (los principales, con mayor influencia), hay muy poca diferencia entre los filtros, y todos muestran un 'decaimiento' muy similar en ese rango. Sin embargo, el orden de las funciones no ha cambiado mucho, con los extremos todavía entre 'Welch' y 'Parzen', y con 'Lanczos' situándose justo en medio de los decaimientos de curva resultantes.
Y a la derecha están los filtros Sinc con ventana resultantes que se obtendrían si un usuario seleccionara esas funciones de ventana usando los valores por defecto anteriores. Como puedes ver, las curvas de ponderación finales son todas muy similares y, como era de esperar, todas quedan encajadas entre los extremos de 'Welch' y 'Parzen'. Puedes ver definiciones y gráficas más detalladas de la mayoría de estas distintas funciones de ventana, y sus resultados en el espectro de frecuencias de Fourier, en Wikipedia, función de ventana.
En resumen: No he encontrado gran diferencia en los resultados entre estas distintas funciones de ventana. Además, mi lectura de los artículos de investigación de los resultados parecía ser más una opinión cualitativa sobre su idoneidad que algo concreto. Mi impresión es que casi cualquier función de ventana puede usarse, pero si tuviera que elegir una, mejor que te quedes con el filtro de ventana más popular, 'Lanczos'. Está en medio de todos los filtros anteriores, tiene una buena respuesta en el espectro de frecuencias y, en general, es una buena elección como filtro de remuestreo. Por otro lado, un experto en procesamiento de imágenes, que ha sido fundamental en los filtros de remuestreo de ImageMagick, no está de acuerdo con esto. Aunque él selecciona los filtros más en función de los requisitos exactos de imágenes específicas. Puedes ver sus sugerencias y comentarios en Técnicas recomendadas por Nicolas Robidoux.
Filtro Lanczos
Ya hemos mencionado el filtro 'Lanczos' varias veces. Es probablemente el más conocido de los Filtros con ventana, y queda en medio del rango de filtros con ventana que hemos visto. En esencia, no 'decae' demasiado rápido ni demasiado lento, y tiene una buena respuesta en frecuencia en la transformada de Fourier resultante. Básicamente, 'Lanczos' es un gran punto de partida para cualquier tipo de trabajo de filtro, y se ha usado extensamente en el desarrollo reciente de los Filtros cilíndricos Jinc con ventana (ver abajo). El filtro 'Lanczos' usa básicamente el primer 'lóbulo' de la función Sinc() para aplicar ventana a la función Sinc(). Es decir, la función de ponderación del filtro se usa para fijar la propia función de ventana del filtro. Mucha gente ve esto como una buena razón para elegirlo por encima de los muchos otros filtros Sinc con ventana. Aunque hay pocas o ninguna prueba real de que sea el mejor, es un filtro sólido de rango medio. Por defecto, IM define el filtro 'Lanczos' con 3 'lóbulos'. La razón de esto es que la propia función de ventana es 'no atenuada', en el sentido de que es solo un único lóbulo que se corta, con el primer cruce por cero de la función coincidiendo con los límites de soporte de la ventana. Consulta Cómo funcionan los filtros con ventana más arriba.
Sin embargo, también se ha visto que un filtro 'Lanczos2' de 2 lóbulos (Lanczos con un valor de lóbulos por defecto de 2, añadido para facilitar su selección por el usuario) es popular, ya que evita los artefactos de ringing positivos que pueden generar los filtros Sinc con ventana. El 'Catrom' (en realidad el 'filtro Catmull-Rom') es casi un duplicado exacto del filtro 'Lanczos2', aunque, al ser un Filtro cúbico, es mucho más rápido de generar matemáticamente. Eso, sin embargo, no suele ser un problema por la forma en que IM almacena en caché los valores del filtro antes de procesar las imágenes. Dicho esto, una larga discusión en los foros de IM parece indicar que, para el redimensionado ortogonal (tensorial), un 'Lanczos' de 4 lóbulos funciona en realidad mejor para reducir imágenes, evitando el muaré en imágenes de objetos con patrones muy finos, pero a costa de más ringing.
Tamaño de ventana en lóbulos
Como mencioné, la función de filtro Sinc (y Jinc) subyacente es en realidad de tamaño infinito. Aunque, por defecto, IM las limita usando la función de ventana especificada a un tamaño mucho más pequeño y práctico. Sin embargo, puede haber algunas situaciones en las que realmente quieras intentar obtener un redimensionado mucho mejor y más exacto de la imagen usando un tamaño de ventana (soporte) mucho mayor y más lento. Eso puede hacerse incluso de forma bastante sencilla usando el control experto Soporte del filtro, igual que hicimos para los filtros de tipo Gaussian. La propia función de ventana (en la mayoría de los casos) reducirá la Sinc (y Jinc) a cero en el rango del ajuste de soporte. Pero como la función de ventana se escala para encajar en la ventana de 'soporte', la función de filtro resultante también cambiará.
Por ejemplo, a la derecha he graficado los filtros Lanczos con ventana, frente a la función Sinc() como referencia, usando varios ajustes de 'soporte' de 2 a 8. Ten en cuenta que el tamaño real del filtro está limitado por el tamaño de soporte que se use. Cuanto más pequeño sea el 'soporte', más rápido será el filtro, pero menos exactamente seguirá la función la función Sinc() matemáticamente ideal. Fíjate bien en cada una de las curvas graficadas. La curva 'verde' (support=2) solo tiene el pico central principal, más un 'lóbulo' negativo (equivalente a un filtro 'Lanczos2'). Después de esto, la función es simplemente cero, y no se usa. La siguiente curva 'morada' (support=3, y el filtro 'Lanczos' por defecto) tiene un primer 'lóbulo' negativo mucho mayor, y luego un 'lóbulo' positivo más pequeño. Esto continúa con más lóbulos que se añaden a medida que el tamaño de soporte aumenta en incrementos enteros. Los lóbulos adicionales son cada vez más pequeños en altura, produciendo cada vez menos influencia en el resultado final, pero con los 'lóbulos' iniciales volviéndose más altos (más influencia y, por tanto, más efectos de ringing). Para obtener el mejor efecto, usarías un ajuste de soporte que genere un filtro con esa cantidad de 'lóbulos' arriba/abajo. Es decir, harías que la función de ventana, y por tanto el 'soporte' del filtro, terminara en un 'cruce por cero'. Sin embargo, mientras que la función Sinc() tiene 'lóbulos' (cruces por cero) en ajustes de 'soporte' enteros, la función de ponderación Jinc() no. Esto presenta un problema para los usuarios que quieren ajustar la ventana de soporte de un filtro usado con el Operador Distort. De hecho, Jinc() tiene 'cruces por cero' en posiciones de números muy irracionales. Estos cruces por cero son muy difíciles de calcular sin ser un experto en matemáticas. Para facilitar el ajuste de un filtro en términos del número de 'lóbulos', se creó otro ajuste especial, "[-define](https://imagemagick.org/command-line-options/#define) filter:lobes=_{entero}_". Si el filtro se usa con un operador de remuestreo de imagen bidimensional, como el Operador de distorsión general, que generalmente usa Jinc() como función base, este buscará en una tabla de los primeros 20 cruces por cero del filtro y fijará el ajuste de 'soporte' a ese valor. Esto significa que no tienes que intentar encontrar el ajuste de soporte apropiado para la función Jinc(), solo especifica el número de lóbulos que quieres usar. Por ello, es mejor especificar los filtros Sinc o Jinc con ventana en términos del número de 'lóbulos' que quieres que contenga el filtro, en lugar de especificar un ajuste de 'soporte' más directo. Si no se usa ni la función Sinc() ni Jinc() para la definición del filtro, entonces el ajuste 'filter:lobes' se usa para calcular el ajuste de 'soporte' apropiado para el uso del filtro. Ten en cuenta, no obstante, que un ajuste 'filter:support' anulará cualquier ajuste 'filter:lobes' dado, así que es mejor definir solo la opción experta 'filter:lobes', especialmente si usas el Operador de distorsión general.
Filtro Lagrange
Al igual que el filtro '[Gaussian](#gaussian)' es una función matemáticamente lenta (no es que afecte mucho a la velocidad general gracias al almacenamiento en caché de resultados de IM), los Filtros Sinc/Jinc con ventana son aún más lentos y complejos de calcular debido a la necesidad de calcular funciones trigonométricas para usarlas tanto en las funciones de ponderación como de ventana. El filtro 'Lagrange', sin embargo, genera una función polinómica cúbica por tramos para aproximar un filtro con ventana. (Consulta Wikipedia: polinomio de Lagrange). Igual que los Filtros con ventana son ajustables según el Ajuste de soporte, el filtro 'Lagrange' también se ajustará según ese valor. El ajuste de soporte por defecto de 2.0 genera un filtro 'Lagrange' (orden 3). Este filtro es bastante bueno tanto para la ampliación como para la reducción de imágenes, con mínimos efectos de bloques y ringing y sin efectos de desenfoque. | _El Control experto de soporte define en realidad el 'orden' del filtro Lagrange que debe usarse. Es decir, el filtro Lagrange por defecto de soporte 2.0 genera un filtro Lagrange de orden 3 (orden = soporte × 2 - 1, así que support=2.0 => filtro Lagrange-3). Por eso realmente solo puedes usar un ajuste en tamaños de medio entero.
Por tanto, para obtener un filtro Lagrange de orden 4 usarías la opción_ -define filter:support=2.5
---|---
Con ajustes de soporte más grandes, el filtro 'Lagrange' genera Filtros Sinc con ventana sin necesitar un cálculo de función trigonométrica complejo, ni siquiera funciones de ventana adicionales. Cuanto mayor sea el ajuste de soporte, más se acerca el filtro a emular una función Sinc(), pero también más lento es el cálculo. (Ver gráfica de filtros Lagrange de soporte mayor a la izquierda).
Con ajustes de soporte más pequeños, el filtro 'Lagrange' emula la mayoría de los distintos Filtros interpolados. Es decir, un tamaño de soporte de '0.5' generará el filtro 'Box', y '1.0' un filtro 'Triangle'. El ajuste de soporte está limitado a ajustes en medios enteros, y usar cualquier otro factor de soporte no es muy productivo.
Los otros filtros Lagrange de soporte de medio entero (que generan órdenes pares) producen un conjunto de ponderaciones de filtro muy inconexo y, muy parecido al filtro 'Box', pueden producir algunos fuertes artefactos de bloques en el redimensionado. Por otro lado, para el redimensionado a pequeña escala, esto puede asegurar que las imágenes se mantengan nítidas para ajustes de redimensionado muy pequeños. Estos filtros 'Lagrange' de orden 'par' destacan en realidad la principal desventaja de usar este filtro, que es que la función de ponderación no es un degradado 'suave'. En las ampliaciones a gran escala, esto significa que puedes obtener cambios visibles en el degradado generado. Sin embargo, esto rara vez es un problema, salvo en esos casos extremos. Básicamente, representa un filtro que crea universalmente uno apropiado para el ajuste de 'soporte' actual, sin importar lo grande o pequeño que sea ese ajuste. Es un filtro de redimensionado con auto-ventana. | El filtro '[Lagrange](#lagrange)' no quedó completamente definido y utilizable hasta la versión de IM v6.3.7-1.
---|---
Filtros cúbicos
Mientras muchos expertos en imagen intentaban encontrar un filtro mejor y más rápido de calcular para el redimensionado de imágenes, evolucionó una familia de filtros que pasó a conocerse como filtros cúbicos. Estos se parecen mucho a los Filtros Lagrange mostrados anteriormente, y estaban compuestos por un conjunto fijo más pequeño de secciones por tramos. Sin embargo, a diferencia de los filtros Lagrange, los tramos se diseñaron para encajar entre sí formando una curva suave, a fin de reducir los fuertes efectos de bloques.
En la gráfica de la izquierda se muestran cuatro de esos filtros cúbicos 'suaves' que están predefinidos en IM, y bien conocidos por su uso como filtros de redimensionado. El filtro 'Spline' (usado también como alias y ajustes por defecto para la función de filtro 'Cubic' general) emula un Filtro de desenfoque Gaussian. Esta curva también se conoce como curva de interpolación 'B-Spline', y se usa comúnmente para dibujar líneas suaves a través de un conjunto de puntos. También se usa a menudo para los movimientos de cámara y de objetos en animaciones, a fin de producir un flujo suave a través de los puntos de control proporcionados por el usuario. También se muestra 'Catrom', o más correctamente el 'filtro Catmull-Rom' o la 'convolución cúbica de Keys', que genera una forma suave y sin desenfoque de Filtro de interpolación. Sin embargo, puede sobrepasar ligeramente. Es en esencia un filtro auto-afilado ideal y, como tal, también la función comúnmente usada para la interpolación bicúbica básica. Y por último, el filtro cúbico 'Hermite', que es un tipo de Filtro de interpolación triangular suavizado, que se ralentiza suavemente (decae) en las coordenadas de entrada. Básicamente, redondea los bordes fuertes mientras preserva los 'niveles de color' planos de la imagen original.
Familias de filtros cúbicos
Los anteriores son los filtros 'con nombre' más comunes de las curvas cúbicas, pero también pertenecen a familias específicas de filtros cúbicos. La familia 'B-Spline' de cúbicos es en esencia equivalente a varios grados de desenfoque de los resultados. Normalmente van desde el muy borroso filtro 'Spline' hasta los resultados de bordes redondeados pero cuadriculados del filtro 'Hermite'. Luego estaba la familia 'Cardinal', que produce filtros que se comprometen entre los artefactos de bloques y ringing, y de la que evolucionó el 'filtro Catmull-Rom' ('Catrom') como un compromiso equilibrado de estos artefactos. Estas dos familias se fusionaron luego para formar la 'familia de filtros cúbicos de Keys', que vinculó el 'filtro Catmull-Rom' (Keys α = 0.5) con el 'filtro cúbico B-Spline' (Keys α = 0.0). La familia de filtros de Keys también tiene la propiedad especial de preservar cualquier degradado lineal (afín) que pueda existir a lo largo de la imagen. Los efectos de ringing y desenfoque de un filtro de la familia de Keys solo entrarían en juego cuando una imagen contiene cambios de color fuertes, en lugar de degradados de color suaves. ¿Confundido por la variedad? Por supuesto que sí. ¡Todos los demás también lo estaban! El problema es que los resultados de los filtros suelen ser muy subjetivos, dependientes de la imagen y de las restricciones de la 'familia' que estés usando. Lo que hacía bueno a un filtro dependía realmente de a quién preguntaras, de si estabas ampliando o reduciendo, y de qué imagen estabas procesando. En cierto modo, sigue siendo confuso. Me llevó más de dos años de andar enredando, leyendo y jugando con los distintos filtros llegar al inicio de este resumen, e incluso ahora sigue evolucionando. El redimensionado de imágenes es un área muy subjetiva, difícil (de hecho, se ha demostrado que es imposible) de cuantificar de forma real. No existe tal cosa como un redimensionado 'perfecto'.
Filtro Mitchell-Netravali
En medio de esto, Don P. Mitchell y Arun N. Netravali publicaron un artículo, 'Reconstruction Filters in Computer Graphics', que formuló dos variables conocidas como 'B' (usada para las curvas 'B-spline') y 'C' (usada para las curvas 'Cardinal' y equivalente al valor α del filtro 'Keys'). Con estos dos valores puedes generar cualquier filtro cúbico por tramos que encaje suavemente (con primera derivada continua).
Más importante aún, luego encuestaron a un grupo de 9 expertos en procesamiento de imágenes, en lugar de basarse solo en su propia opinión, para clasificar los artefactos producidos al ampliar ligeramente imágenes usando varios valores de B y C. Los resultados de esa encuesta se muestran en el diagrama recreado de la derecha. El área 'verde' representa los valores que los expertos consideraron que producían un resultado aceptable, mientras que las distintas áreas restantes producen los diferentes tipos de artefactos. Esta imagen es importante, ya que realmente muestra las relaciones entre los distintos artefactos y los distintos tipos de filtros que pueden producirse. También puedes ver por los resultados por qué la familia de filtros 'Keys' se volvió tan importante, como uno de los mejores métodos para generar buenos filtros cúbicos. Sus filtros caían básicamente en una línea que atraviesa directamente el área considerada 'aceptable' por los expertos en procesamiento de imágenes. A partir de esta encuesta, Mitchell y Netravali determinaron que el mejor filtro era un filtro de la familia 'Keys', que caía en medio del área aceptable, usando valores B,C de 1/3,1/3. Este filtro se conoce ahora como el 'filtro Mitchell-Netravali' y está disponible en IM como el ajuste de filtro 'Mitchell'. Básicamente, es un compromiso de todos los artefactos de redimensionado. Es también el filtro por defecto usado para las ampliaciones de imagen de IM. Todos los filtros cúbicos 'con nombre' incorporados: 'Mitchell', 'Robidoux', 'Catrom', 'Spline' y 'Hermite', también se han marcado en el diagrama anterior, mostrando lo que esos expertos pensarían de esos filtros específicos. También se muestran las líneas que representan las familias de filtros 'B-Spline', 'Cardinal' y 'Keys'. Internamente, todos estos filtros solo difieren en los ajustes B,C predefinidos del filtro; de hecho, IM usa la misma función interna para generar todos los filtros cúbicos, solo con distintos ajustes B,C para definir esos filtros.
Controles expertos B,C cúbicos
Puedes usar los ajustes expertos especiales para fijar los ajustes B,C que usa un Filtro cúbico. Para hacerlo, necesitas seleccionar la 'función' de filtro 'Cubic' general (o cualquiera de los otros filtros cúbicos con nombre), y los ajustes expertos 'b' y 'c' deseados. Por ejemplo...
-filter Cubic
-define filter:b=_value_
-define filter:c=_value_
Los ajustes expertos anularán los valores internos por defecto del filtro dado cuando lo use un operador de redimensionado o de distorsión. Por eso, el orden de las opciones anteriores no importa, siempre que hayas usado "[-define](https://imagemagick.org/command-line-options/#define)" o "[-set](https://imagemagick.org/command-line-options/#set)" para todos los ajustes expertos globales deseados antes de usar el operador de procesamiento de imágenes. Si uno de los ajustes 'b' o 'c' no se ha definido ni fijado, su valor se calculará a partir del otro, asumiendo que quieres un filtro de la familia 'Keys' (a lo largo de la línea punteada en el diagrama de la encuesta de Mitchell-Netravali). Recuerda que 'c' es equivalente al ajuste α de Keys, mientras que 'b' puede pensarse como un ajuste 'blur' de spline cúbica. Estos ajustes expertos ofrecen a los usuarios una buena forma de 'afinar' su redimensionado de imágenes para obtener exactamente lo que quieren (ya usen Resize o Distort). El ajuste 'b' es el más fácil de entender de los dos. Solo piensa en 'b' como 'borrosidad' (bluriness). Un valor de b=0 es el muy nítido (filtro Catmull-Rom), que tiende a producir un halo negativo de ringing y algunos efectos de aliasing o muaré. Un valor de b=1 tiende a producir un efecto demasiado borroso (el Spline o de tipo Gaussian). Esto facilita que los expertos (o incluso los usuarios normales) ajusten este valor para encontrar un filtro que les 'parezca bueno'. A la derecha hay una tabla de los valores B,C para los Filtros cúbicos específicamente 'con nombre'. Recuerda que 'Hermite' es el único filtro cúbico incorporado que no forma parte de la familia de filtros 'Keys'. También tiene el soporte más pequeño ('1.0') de todos los filtros cúbicos BC, y no contiene un lóbulo negativo. Los filtros '[Robidoux](#robidoux)' y '[RobidouxSharp](#robidoux_sharp)' son muy similares a 'Mitchell', pero, en lugar del resultado de una encuesta, se determinaron matemáticamente para un uso especial como Filtro cilíndrico. El filtro '[Robidoux](#robidoux)' es el filtro por defecto usado por el Operador Distort general (ver abajo). | | | Filtro | B
blur | C
Keys α
---|---|---
Hermite | 0.0 | 0.0
Spline | 1.0 | 0.0
Catrom | 0.0 | 1/2
Mitchell | 1/3 | 1/3
Robidoux | 0.3782 | 0.3109
Robidoux
Sharp | 0.2620 | 0.3690
Robidoux
Soft | 0.6796 | 0.1602
| El filtro de ventana 'Parzen' usa un filtro 'Spline' como su función de ventana. Por eso puedes redefinir este filtro de ventana en términos de las opciones expertas B,C. Lo útil que sea esto, y qué efecto tiene sobre el Sinc (o Jinc) con ventana resultante, se desconoce, y no se recomienda.
---|---
Filtros cilíndricos - para Distort
Como ya hemos tocado varias veces, el Operador Distort usa el ajuste de filtro para remuestrear imágenes de una forma ligeramente distinta al Operador Resize. En concreto, Distort aplica el filtro usando la distancia 'radial' entre el 'punto de muestra' y los píxeles reales dentro del área de muestreo de la imagen de origen, para determinar las ponderaciones de cada píxel y, por tanto, el color final en el punto de muestra. Resize, en cambio, procesa la imagen dos veces usando filtros alineados ortogonalmente. Una vez en la dirección X, y luego de nuevo en la dirección Y; está, por tanto, limitado al redimensionado rectangular simple de imágenes, y no implica el uso de píxeles virtuales. Es decir, Distort aplica los filtros para producir formas 'cilíndricas' en lugar de formas de 'caja', a fin de permitir distorsiones de forma libre de las imágenes, incluidas rotaciones y escalado variable (estiramiento y compresión) en cualquier dirección, no solo a lo largo del eje X o Y. Por ello, los propios filtros a menudo necesitan ajustarse o se diseñan específicamente para este tipo de uso.
Filtros cilíndricos interpolados
Aquí uso un filtro '[Box](#box)' para ampliar una imagen de un solo píxel 30 veces usando los operadores equivalentes Resize y Distort.
magick xc: -bordercolor black -border 1 \
-filter Box -resize 3000% dot_resize_box_black.png
magick xc: -bordercolor black -border 1 \
-filter Box +distort SRT 30,0 dot_distort_box_black.png
Como puedes ver, cuando el filtro '[Box](#box)' se usa como filtro cilíndrico obtienes un círculo (o un cilindro en 3 dimensiones). Sin embargo, debido a la forma en que se maneja el filtro, obtienes algunas áreas donde se muestrean dos píxeles (por igual) para producir un gris de tono medio perfecto. Puedes pensar en un filtro de caja cilíndrico como algo que convierte la imagen de origen en todo un conjunto de píxeles circulares superpuestos que se mezclan (no se suman) entre sí. Aquí hay un ejemplo más colorido de los resultados de expandir una imagen usando un filtro de 'caja cilíndrica' para la ampliación... |
magick \( xc:red xc:white xc:black +append \) \
\( xc:blue xc:lime xc:white +append \) \
\( xc:black xc:red xc:blue +append \) -append \
-filter Box +distort SRT 30,0 color_box_distort.gif
![[IM Output]](../static/img/filter/color_box_distort.gif)
Con una imagen distorsionada, estos píxeles circulares también se distorsionan en un conjunto de elipses superpuestas. Por ejemplo... |
magick \( xc:red xc:white xc:black +append \) \
\( xc:blue xc:lime xc:white +append \) \
\( xc:black xc:red xc:blue +append \) -append \
-alpha set -virtual-pixel transparent -filter Box \
+distort Perspective '0,0 0,0 0,3 0,90 3,0 90,30 3,3 90,60' \
color_box_distort.png
![[IM Output]](../static/img/filter/color_box_distort.png)
| _El 'radio' de soporte para un filtro 'Box' cilíndrico se incrementa de '0.5' a '0.707' (sqrt(2)/2). Esto asegura que el filtro siempre encuentre al menos un píxel de origen en el área de muestra circular (en diagonal). Este es el tamaño de soporte mínimo práctico para cualquier filtro cilíndrico.
Ningún otro filtro tiene este problema de cobertura que requiera un aumento del soporte._
---|---
| _Si el soporte no es de al menos '0.707', entonces puedes obtener áreas de tu imagen en las que el filtro 'no toca' ningún píxel de origen, y así producir un Fallo de remuestreo.
Usar un ajuste de soporte mayor también produce patrones interesantes. A medida que los 'círculos' se hacen más grandes, más píxeles se mezclan entre sí. Por ejemplo..._
magick \( xc:red xc:white xc:black +append \) \
\( xc:blue xc:lime xc:white +append \) \
\( xc:black xc:red xc:blue +append \) -append \
-filter Box -define filter:support=0.83 \
+distort SRT 30,0 color_box_distort_overlap.png
![[IM Output]](../static/img/filter/color_box_distort_overlap.png)
_El resultado es una especie de forma circular de una interpolación Blend.
Con un soporte de 1.0 o mayor, cada remuestreo será una mezcla de 'caja' o 'promedio' de al menos dos píxeles.
_
Aquí hay una comparación de varios de los filtros de interpolación. Se usan colores grises para que puedas ver los sobrepasos y los subpasos. La línea superior usa un redimensionado ortogonal, mientras que la línea inferior usa una distorsión cilíndrica.
for filter in box triangle hermite lagrange catrom
do
magick xc:gray80 -bordercolor gray20 -border 2 \
-filter $filter -resize 2000% dot_resize_$filter.png
magick xc:gray80 -bordercolor gray20 -border 2 \
-filter $filter +distort SRT 20,0 dot_distort_$filter.png
done
![[IM Output]](../static/img/filter/dot_resize_box.png)
![[IM Output]](../static/img/filter/dot_distort_box.png)
Box | ![[IM Output]](../static/img/filter/dot_resize_triangle.png)
![[IM Output]](../static/img/filter/dot_distort_triangle.png)
Triangle | ![[IM Output]](../static/img/filter/dot_resize_hermite.png)
![[IM Output]](../static/img/filter/dot_distort_hermite.png)
Hermite | ![[IM Output]](../static/img/filter/dot_resize_lagrange.png)
![[IM Output]](../static/img/filter/dot_distort_lagrange.png)
Lagrange | ![[IM Output]](../static/img/filter/dot_resize_catrom.png)
![[IM Output]](../static/img/filter/dot_distort_catrom.png)
Catrom
---|---|---|---|---
Puedes ver cómo los resultados son similares, pero con distintos estilos de artefactos generados, tanto interna como externamente (ringing), por las dos formas distintas en que se aplica el filtro. Los artefactos internos son especialmente evidentes en el filtro 'Triangle'. Sin embargo, recuerda que los filtros de interpolación no son especialmente buenos para la reducción extrema de imágenes distorsionadas, pero sí son muy buenos para la ampliación.
Gaussian cilíndrico
El único filtro que no produce diferencia en los resultados entre las formas de 'resize' ortogonal y de 'distort' cilíndrico es el filtro especial '[Gaussian](#gaussian)'... |
magick xc:red -bordercolor yellow -border 1 \
-filter Gaussian +distort SRT 33,0 -normalize dot_distort.jpg
![[IM Output]](../static/img/filter/dot_distort.jpg)
Esta es en realidad una de las propiedades especiales de este filtro (conocida como separabilidad), y una de las razones por las que muchas implementaciones de remuestreo cilíndrico lo usan como filtro por defecto. Era el filtro por defecto del artículo EWA original, pero sus resultados también son muy borrosos. ImageMagick también lo usaba cuando se implementaron por primera vez las distorsiones, pero ya no. Igual que ocurre con el redimensionado ortogonal, un filtro 'Gaussian' no producirá absolutamente ningún artefacto de aliasing en la imagen resultante, incluso cuando lo aplicas a la imagen especial de 'anillos'. Pero el precio de esto es un resultado borroso, aunque haya poca o ninguna distorsión involucrada. De forma similar, como se indicó en la discusión sobre el Control experto Sigma, también puedes usar este filtro como un tipo de filtro interpolado. | _A partir de IM v6.6.5-0, IM ya no usa este filtro por defecto para las distorsiones de imagen. En su lugar se usa otro filtro, '[Robidoux](#robidoux)', diseñado específicamente para producir un resultado más nítido.
En cualquier caso, antes de esta versión, las distorsiones también eran muy borrosas debido a un error en su implementación. Actualiza si tienes una versión más antigua y quieres usar las distorsiones de imagen.
_
---|---
| _Antes de IM v6.6.7-6, IM usaba un valor de 'sigma' ligeramente mayor para un Gaussian cilíndrico, de 1/sqrt(2) o aproximadamente 0.707, en lugar de 1/2. Esto producía un resultado ligeramente más borroso, que servía para reducir posibles artefactos de aliasing.
Esto fue un error creado al seguir la recomendación de un artículo de investigación, al pasar el soporte mayor de un Filtro Box cilíndrico al filtro Gaussian. El razonamiento que se planteó era que Gaussian es en esencia una caja desenfocada. No lo es. Un Gaussian es un impulso desenfocado, no una caja desenfocada. Esta versión eliminó ese error, lo que ahora significa que deberías obtener resultados equivalentes con resize o distort cuando se usa el filtro Gaussian.
Personalmente, encuentro que usar este valor de sigma ligeramente mayor sí suaviza cualquier artefacto de 'bloques' a lo largo de bordes diagonales con aliasing al hacer ampliaciones de dibujos lineales. Pero ese es un caso especial.
Filtros cilíndricos Jinc con ventana
La función Jinc() (a veces llamada inexactamente filtro 'Bessel') es el equivalente de 'Sinc' para usar con una operación de filtrado cilíndrico. Aunque es muy similar y está estrechamente relacionada con Sinc(), está diseñada para filtrar un arreglo rectangular de valores usando una distancia radial o cilíndrica, en lugar de solo en direcciones ortogonales (alineadas con los ejes). Si miras la gráfica proporcionada de la función Jinc(), verás que su primer 'cruce por cero', que representa el primer anillo de vecinos cercanos, cae entre los valores de 1.0 (para vecinos ortogonales) y la raíz cuadrada de 2. Es decir, el cruce por cero tiene un valor aproximado de '1.2196699'. La forma en que funciona la función Jinc() es que, si el punto de muestreo es igual a un valor de píxel real, la función Jinc() asignará un valor positivo a los píxeles vecinos ortogonales ligeramente más cercanos, pero luego asignará un valor negativo similar a los vecinos diagonales ligeramente más lejanos, y así sucesivamente a medida que avanza por el arreglo de valores bidimensional. Como resultado, cuando no se realiza ningún escalado (distorsión), las contribuciones de los vecinos deberían, en teoría, cancelarse entre sí. Por eso el filtro Jinc es matemáticamente la solución preferida para el remuestreo cilíndrico de un arreglo cuadrado y, por tanto, el filtro 'ideal' para el método de remuestreo elíptico (EWA) de Distort. Esto no quiere decir que sea un filtro 'perfecto' desde el punto de vista humano. Por ello, seleccionar cualquier filtro con ventana mientras se usa el Operador Distort sustituirá la función normal 'Sinc()' por la función 'Jinc()' equivalente. Como la función Jinc() tiene cruces por cero en posiciones no enteras, es muy importante especificar el soporte de los filtros en términos del Ajuste especial de soporte en lóbulos presentado arriba para los Filtros Sinc con ventana. El mayor problema de usar un filtro 'Jinc con ventana' es cuando la imagen de origen contiene un patrón de cuadrícula a nivel de píxel (como el proporcionado por "pattern:gray50", consulta Patrones incorporados). En esta situación, todos los vecinos ortogonales son distintos de los vecinos diagonales y, como resultado, la imagen queda fuertemente desenfocada por la función 'Jinc()'. Sin embargo, casi cualquier otro patrón, como líneas, bordes y esquinas, permanece bastante nítido y claro al usar un filtro 'Jinc con ventana', lo que lo convierte en una buena función a usar. Este 'problema' puede ser algo bueno, ya que significa que un filtro Jinc cilíndrico bidimensional puede usarse como método para eliminar fuertes patrones de cuadrícula a nivel de píxel de las imágenes, como los generados por un tramado de reducción de color, sin afectar mucho a la nitidez del resto de la imagen. Es decir, podría usarse como un 'método de eliminación de tramado' (ver abajo).
Distort y los filtros en el caso No-Op
Idealmente, una distorsión sin operación (no-op) debería devolver exactamente la misma imagen. Pero, como has visto en ejemplos anteriores, esto puede no ocurrir realmente. Los filtros de redimensionado (de 1 dimensión y 2 pasadas): Lanczos (Sinc-Sinc), Lanczos2, Catrom, Hermite, Triangle y muchos otros filtros de redimensionado sí tienen esta propiedad. El patrón de píxeles se preserva exactamente si la imagen no se escala. Por otro lado, los filtros de suavizado o desenfoque, como Gaussian, Cubic y Quadratic, desenfocarán una imagen si se aplican a un caso casi sin operación. Ten en cuenta que incluso el filtro de redimensionado por defecto, Mitchell-Netravali, también contiene algo de desenfoque, ya que es básicamente una mezcla del filtro de suavizado 'Cubic' B-spline y el filtro Catmull-Rom equivalente al sinc cúbico de dos lóbulos. | _El operador de redimensionado, por defecto, se cortocircuitará a sí mismo, de modo que no hace nada para el caso sin operación. Por eso, a menos que especifiques expresamente un filtro, no puedes generar un redimensionado 'noop'.
Distort nunca se cortocircuitará para el caso sin operación, y eso es para asegurar la consistencia en animaciones en las que el escalado de la distorsión pueda pasar por el caso 'sin operación'. Esto es algo que normalmente no es una preocupación con resize._
_
---|---
Mientras que muchos filtros de redimensionado preservarán las imágenes en el caso sin operación, los métodos cilíndricos (distort) básicamente nunca producirán una distorsión no-op perfecta. Cualquier distort no-op distorsionará al menos mínimamente los colores de una imagen, aunque la imagen en sí no se distorsione. Lo que ocurre es que, al usar un filtro cilíndrico, la contribución de los píxeles del vecindario ortogonal será distinta de la de los píxeles del vecindario diagonal. Están en esencia a distancias distintas del punto de búsqueda (centrado en un píxel real para el caso no-op). La función 'Jinc' intenta reducir esta distorsión de color cancelando las contribuciones de los vecinos ortogonales con las de los vecinos diagonales. Eso es en realidad parte de su definición matemática. En el peor de los casos, una 'cuadrícula a nivel de píxel', cada píxel vecino diagonal es distinto de cada píxel vecino ortogonal. En este caso, las ponderaciones del filtro realzarán, en lugar de cancelar, las contribuciones. Como resultado, este tipo de imagen tenderá a producir distorsiones de color muy severas para una distorsión no-op de cualquier imagen que contenga una 'cuadrícula a nivel de píxel'. Aquí, por ejemplo, uso en realidad esta propiedad especial para eliminar un patrón de cuadrícula de una imagen. No se usa ningún escalado, solo una 'convolución' bidimensional de distorsión aplicada sobre la imagen.
magick -size 100x100 pattern:gray50 hash.png
magick hash.png -filter Lanczos -distort resize 100% hash_removed.png
| _La razón por la que el nivel de gris percibido de la cuadrícula es mucho más oscuro que el nivel de gris general de la cuadrícula se debe a la forma en que funciona la percepción humana del color.
La solución es incluir '-set colorspace RGB' en lo anterior para indicar a IM que estamos redimensionando en el espacio de color RGB lineal. Consulta Redimensionar con corrección de espacio de color.
_
---|---
Lo anterior es en realidad equivalente a una Convolución con una función de núcleo de tipo Jinc. Pero, como puedes ver, la propiedad especial de la función Jinc (en este caso EWA Lanczos, o Jinc con ventana Jinc) eliminó por completo el patrón de cuadrícula que estaba fuertemente presente en la imagen original. La única parte donde ahora permanece es a lo largo de los bordes, donde el 'abismo' (sin contribución de píxel virtual) que rodea la imagen propiamente dicha puede afectar a los resultados. El número real de lóbulos de un filtro Jinc con ventana también tiene una enorme influencia en los resultados. Con 2 lóbulos, una 'cuadrícula a nivel de píxel' tiende a preservarse, aunque atenuada o desenfocada. |
magick hash.png -filter Lanczos2 -distort resize 100% hash_2_lobes.png
La contribución del método de ventana aplicado a la función Jinc también tendrá una influencia importante en este efecto. En algunos casos, incluso realzar más el patrón de cuadrícula. ![[IM Output]](../static/img/filter/hash_2_lobes.png)
Surge así la pregunta de cómo afinar los filtros de distort para minimizar las distorsiones de color generadas por el filtro en una distorsión no-op. La forma en que Nicolas Robidoux decidió hacer esto fue seleccionando un blur (reescalado del soporte del núcleo del filtro) que tiende a preservar los bordes ortogonales tanto como sea posible.
Filtro Lanczos cilíndrico
Ahora bien, como se discutió arriba, "Lanczos" normalmente se define como una función 'Sinc()' usada tanto para la ponderación como para la ventana del filtro. Pero cuando se usa como filtro cilíndrico EWA, AMBAS funciones de ponderación se reemplazarán por la función 'Jinc()'. Es decir, no solo se reemplaza la función de ponderación (como ocurre con los otros filtros lineales con ventana), sino que también se reemplaza la función de ventana, produciendo una ponderación Jinc con ventana Jinc. Por eso, un 'Lanczos cilíndrico' seleccionará un "Jinc con ventana Jinc" con el mismo número de lóbulos (3 por defecto). Esta técnica la propuso por primera vez Andreas Gustafsson, en una tesis sobre deformación (local) interactiva de imágenes (página 24). Usó específicamente un Lanczos cilíndrico (Jinc con ventana Jinc) de 2 lóbulos al que llamó 'Lanczos2D' (ver a continuación). Esto era simplemente una extensión obvia para la situación planar (EWA). De ahí el uso del mismo nombre. Para más información sobre esto, consulta esta publicación en la discusión de las BC-splines.
Lanczos2 - Lanczos de 2 lóbulos
Por comodidad, esta versión de dos lóbulos, simplemente llamada '**Lanczos2**', se incluyó en IM v6.6.4-10, especialmente para usarse en distorsiones. Es en realidad solo un 'Lanczos' cilíndrico (Jinc-Jinc) con un ajuste experto 'filter:lobes=2'. Consulta la gráfica de arriba y, como el filtro de IM cambia automáticamente entre usar las funciones Sinc() y Jinc() según corresponda, no es solo para uso '2D' (cilíndrico). También puede usarse para resize (como función Sinc-Sinc), aunque no lo recomiendo, ya que probablemente es un poco demasiado pequeño y se vuelve prácticamente equivalente a las distintas otras funciones cúbicas.
LanczosSharp - Un Lanczos ligeramente afilado
Se observó que aplicar ventana a una función Jinc() conduce a resultados de distort EWA mucho más borrosos que la función Sinc() con ventana análoga en los resultados de resize ortogonal (especialmente con líneas finas). Esto ocurría particularmente con distorsiones leves. Básicamente, la función Jinc() tiene algunas propiedades especiales, y aplicarle ventana estropea esas propiedades específicas y deseables. Con algunos cálculos, Nicolas Robidoux, profesor de Matemáticas en la Universidad Laurentian, fue capaz de deducir una versión ligeramente más nítida de un Lanczos cilíndrico de 3 lóbulos, ahora disponible como '**LanczosSharp**', que hasta cierto punto corrigió el problema para distorsionar imágenes. Sin embargo, el filtro resultante todavía tiene el fuerte desenfoque de los patrones de 'cuadrícula de píxeles' de bajo nivel, propio de los Filtros cilíndricos Jinc con ventana.
Lanczos2 afilado
El mismo problema era más severo en los filtros 'Lanczos2', así que Nicolas también produjo un filtro '**Lanczos2Sharp**' más nítido, usando un Control experto Blur ligeramente mayor. Esto dio como resultado un filtro con solo un desenfoque mínimo para las líneas verticales u horizontales en un caso 'sin distorsión'. Este filtro afilado produce un pequeño desplazamiento del punto cero, de modo que ahora se sitúa en aproximadamente '1.1684'. Esto puede no parecer mucho, pero supone una enorme diferencia en la cantidad de desenfoque que genera el filtro para imágenes con poca o ninguna distorsión.
Radio de Lanczos
Este es un filtro EWA Lanczos que se ha desenfocado (afilado) de modo que el número de lóbulos usados (3 por defecto) encaje en un radio de soporte entero. Es decir, un EWA Lanczos de 3 lóbulos (basado en un Jinc con ventana) se afila para tener un soporte de radio exactamente 3. Puedes usar el Control experto de lóbulos para lograr el mismo resultado, pero como implica un ajuste basado en el cruce por cero conocido de la función Jinc, no es un cálculo fácil de hacer. Nicolas recomendó añadir este filtro para que no necesites hacer ese cálculo, y para permitirte probar este filtro tan específicamente afilado. FUTURO: tabla de factores de blur para los filtros Jinc con ventana Jinc.
Incluir el número de lóbulos como referencia.
Filtro Robidoux cilíndrico
Curiosamente, los experimentos mostraban que usar un filtro Mitchell-Netravali como filtro cilíndrico producía resultados 'nítidos' casi equivalentes para el caso 'sin distorsión'. Y, sin embargo, el filtro no tiene relación con su uso como filtro cilíndrico, ya que fue seleccionado por un 'estudio social' para el filtrado ortogonal (resize). El filtro 'Mitchell' era especialmente bueno preservando los patrones de 'cuadrícula de píxeles' de bajo nivel, que los Filtros Jinc con ventana normales destruían en las imágenes filtradas cilíndricamente. Nicolas descubrió entonces que, por una extraña coincidencia, 'Mitchell' estaba extremadamente cerca de la forma 'afilada' del filtro 'Lanczos2' discutida arriba. Esto, a su vez, le llevó a desarrollar un Filtro cúbico de Keys que preserva las líneas verticales (y horizontales) a la perfección. Además, este nuevo filtro lo hace con un menor costo computacional, ya que una función cúbica es mucho más barata de calcular que una función Jinc. Este filtro cúbico se ha añadido a IM como el filtro '**Robidoux**', a partir de IM v6.6.5-0, y es también el filtro por defecto usado por Distort y su método de remuestreo ponderado elíptico, específicamente por su propiedad de desenfoque mínimo para imágenes con solo una distorsión mínima. Esto no quiere decir que sea 'el mejor' filtro a usar, e incluso a Nicolas le gusta usar otros filtros, pero es un muy buen compromiso, igual que 'Mitchell' es un buen compromiso para el redimensionado ortogonal (tensorial). He marcado este filtro en el "Mapa de cúbicos" generado por la Encuesta de Mitchell-Netravali, para que puedas ver lo estrechamente relacionado que está con el filtro '[Mitchell](#mitchell)'. De hecho, sería un filtro razonable tanto para imágenes redimensionadas ortogonalmente como distorsionadas cilíndricamente.
Filtro Robidoux Sharp cilíndrico
El filtro '**RobidouxSharp**' es una versión ligeramente más nítida del filtro '[Robidoux](#robidoux)', aunque algunos consideran que los resultados son demasiado nítidos. Está diseñado específicamente para preservar imágenes que contienen píxeles puramente blancos y negros con el mínimo error, en el caso 'sin distorsión'. En concreto, las ponderaciones de los píxeles vecinos ortogonales coinciden exactamente con las ponderaciones negativas de los píxeles vecinos diagonales en un caso 'sin distorsión'. Por coincidencia, el filtro '[Mitchell](#mitchell)' resulta caer casi exactamente entre el filtro '[Robidoux](#robidoux)' y el filtro '[RobidouxSharp](#robidoux_sharp)', y todos pertenecen a la familia de filtros Cúbicos de Keys. Por eso, los usuarios pueden elegir entre cualquiera de estos tres filtros para controlar el desenfoque-nitidez de los resultados en situaciones cercanas a 'sin distorsión'. Para detalles de este filtro, consulta la discusión BC-splines en los foros de IM.
Filtro Robidoux Soft cilíndrico
Este se añadió mucho después, y es muy diferente de los otros filtros cilíndricos vistos. Sí, es mucho más borroso, para hacerlo más útil para aumentar el tamaño o ampliar imágenes, lo que le permite evitar algunos efectos de escalera en fotos de edificios de ladrillo. Para más información sobre esto, consulta esta publicación en la discusión de las BC-splines, así como esta discusión de un foro de procesamiento fotográfico.
Resumen de filtros cilíndricos
Nicolas Robidoux, en la larga y continua discusión del foro sobre el escalado adecuado de un filtro Jinc en EWA, da lo siguiente como resumen de los filtros cilíndricos... Si Robidoux es demasiado suave y RobidouxSharp demasiado aliased, sugiero que pruebes Mitchell (con distort Resize), que está prácticamente a mitad de camino.
Como JPEG implica una transformada (discreta) de coseno, no me sorprende que los filtros basados en consideraciones de Fourier (los Lanczos y demás, ya sea resize con Sinc o distort con Jinc) generalmente funcionen mejor que los basados en 'buenas aproximaciones de funciones suaves' (los basados en cúbicos de Keys: Robidoux, Mitchell, RobidouxSharp, CatRom, ya sea con resize o distort). Esa ventaja parece ser menor con los PNG (que no destruyen información a través del dominio de Fourier).
Nicolas tiene mucho más que decir. Tanto que tiene su propia sección, Remuestreo por Nicolas Robidoux, que ahora es una página separada y extensa por derecho propio.
Magic Kernel Sharp 2013 + 2021
Magic Kernel Sharp es un algoritmo de redimensionado de imágenes desarrollado por John Costella, creado originalmente en 2013 para un proyecto en Facebook. Incluye un paso de afilado de tres tomas que mejora la claridad de la imagen al redimensionar, haciéndolo rápido y eficiente a la vez. Esta versión ha sido usada por Facebook para el redimensionado de imágenes del lado del servidor desde su desarrollo. En 2021, Costella refinó el Magic Kernel Sharp para mejorar su precisión, proporcionando al menos nueve bits de precisión y cumpliendo mejor los requisitos de afilado. Esta versión actualizada sigue siendo empleada por Facebook, Instagram y otras aplicaciones como el motor de redimensionado pica y el compresor de imágenes RedKetchup, asegurando un redimensionado de imágenes de alta calidad con una fidelidad notable.
Controles expertos de filtros
En las distintas secciones de arriba presento un gran número de 'controles' expertos especiales, que te permitirán modificar los distintos filtros de varias maneras. Estos ajustes expertos se definen usando el Ajuste global Define (o el equivalente Set Option). Hay un resumen completo de todas las opciones expertas en la página de referencia de opciones de línea de comandos de IM para "[-filter](https://imagemagick.org/command-line-options/#filter)". El ajuste "[-filter](https://imagemagick.org/command-line-options/#filter)" en realidad solo se usa para buscar y fijar los controles expertos de forma apropiada, a fin de definir el filtro de redimensionado 'con nombre' dado. Estos ajustes anularán esos valores por defecto especificados arriba, en el momento en que se configura el filtro para una operación específica de procesamiento de imágenes de redimensionado o distorsión. |
El ajuste "[-filter](https://imagemagick.org/command-line-options/#filter)" 'Point' omite por completo toda la configuración de filtro anterior, y degenera en una búsqueda directa 'del vecino más cercano' sin escalar (resize), o una búsqueda interpolada (distort). Por eso, este ajuste de filtro con nombre desactiva efectivamente por completo el filtro de búsqueda de imagen escalada. |
|---|---|
| Ahora bien, aunque están disponibles, me gustaría hacer una última observación. |
A menos que seas un experto (o solo estés jugando) -- ¡Es mejor NO usarlos!
Hay pocas personas expertas en el procesamiento de imágenes y, a menos que sepas exactamente qué hacen los filtros y cómo afecta su modificación al método de filtrado, lo único que es probable que consigas es destruir la eficacia de tu procesamiento de imágenes y producir resultados de mal aspecto. Especialmente en imágenes distintas de tus casos de prueba. Esto no quiere decir que los usuarios no deban usarlos, y muchos ejemplos de IM sí los usan, pero normalmente se hace para proporcionar algún efecto especial. Cuando se usa una opción especial, también se explica la razón de su uso, y deberías ceñirte a la receta dada para ese efecto. Por supuesto, eres libre de usarlos y puedes generar algunos efectos muy interesantes e inusuales aprovechándolos.
El control de filtro 'verbose'
El ajuste "filter:verbose" es quizás tu mejor amigo para descifrar y entender los otros controles de filtro. Por ejemplo, puedes verificar que el filtro Lanczos se define en términos de un Sinc con ventana Sinc de soporte 3.
magick null: -filter Lanczos -define filter:verbose=1 \
-resize 2 null: | grep '^#'
Ten en cuenta que internamente el filtro Lanczos se define en términos de una función 'SincFast' (4 lóbulos) equivalente polinómica rápida, en lugar de una función 'Sinc' completa que se define en términos de funciones de biblioteca trigonométricas mucho más intensivas computacionalmente. Aquí vemos que el filtro Lanczos se define como un filtro Jinc con ventana Jinc cuando se usa como filtro "-distort" cilíndrico (algoritmo EWA).
magick null: -filter Lanczos -define filter:verbose=1 \
-distort SRT 0 null: | grep '^#'
El ajuste 'filter:verbose' es la única forma en que los usuarios pueden comprobar exactamente cuál es el filtro resultante final, debido al uso de los distintos ajustes expertos. Tras la cabecera comentada con '#' de los ajustes del filtro, se devuelve un conjunto de puntos de datos generados por el filtro. Estos se proporcionan específicamente para graficar los datos del filtro, y te permiten verificar y comprobar con más detalle qué está produciendo el filtro sin hacer conjeturas a partir de los resultados de las imágenes de prueba. Por ejemplo, extrae los datos de un filtro Sinc con ventana Welch...
magick null: -filter Welch -define filter:verbose=1 \
-resize 2 null: > filter_welch.dat
O la función de ventana Welch en bruto que se usó en lo anterior, con la función de ventana escalada a un rango de soporte de 0 a 1.
magick null: -define filter:filter=Box \
-define filter:window=Welch \
-define filter:support=1.0 \
-define filter:verbose=1 \
-resize 2 null: > window_welch.dat
Luego puedes graficar esos datos con el comando "gnuplot" (como hice en Filtros Sinc con ventana más arriba)...
gnuplot
set grid
plot "window_welch.dat" with lines
Otros ejemplos de controles expertos de filtros
Crear un filtro 'Sinc en bruto de 8 lóbulos' puede fijarse usando...
-define filter:filter=Sinc
-define filter:lobes=8
Usar la función de ventana Blackman directamente como filtro (como IM hacía por error, antes de la v6.3.6-3).
-define filter:filter=Blackman
-define filter:support=4.0
La función de ventana adoptará por defecto 'Box' cuando no esté definida. Una función de ventana 'Box' no producirá ninguna aplicación de ventana a la función de filtro base. Por ejemplo, un filtro 'Gaussian' tiene por defecto una función de ventana 'Box'. El único efecto que tiene una función de ventana box es un recorte del área con ventana de la función. Consulta Control experto de soporte del filtro más arriba. Fuerza el uso de una función Jinc en bruto (fijando explícitamente la ventana 'Box') usando...
-define filter:filter=Jinc
-define filter:window=Box
-define filter:lobes=3
Un filtro con ventana 'Lanczos' de 12 lóbulos recortado a solo los primeros 8 lóbulos del filtro con ventana resultante...
-filter Lanczos
-define filter:win-support=12
-define filter:support=8
Esto lo hace unas cuatro veces más rápido, al ignorar (recorte de soporte en 8) la 'cola' modulada por la ventana (hasta 12) del filtro sinc con ventana resultante. Esto, sin embargo, puede producir algunos artefactos extra, aunque menores, como resultado del recorte de soporte. ¡Usar Gaussian para 'desenfocar' una imagen! ¡Esto es equivalente a una operación -gaussian 5x2, pero usando un distort sin operación!
-filter Gaussian
-define filter:sigma=2
-define filter:support=5
-distort SRT 0
Nota: no puedes usar -resize para esto, ya que puede cortocircuitar la operación y dar como resultado que la operación no se realice en absoluto. Crea un filtro diferente a partir de la encuesta de 'Mitchell-Netravali'.
-filter Cubic
-define filter:b=0.5
-define filter:c=0.5
Crea tu propio filtro 'Cúbico de Keys' con un valor α de 0.4...
-filter Cubic
-define filter:c=0.4
Nicholas Robidoux creando este filtro extraño mientras exploraba 'Filtros EWA interpolantes'
-define filter:blur=.7071067811865475
-define filter:c=.49257366
-define filter:b=2.089813051319261
-filter Cubic
Cuando se usa para ampliar imágenes, los píxeles se convierten en patrones tipo diamante, en un esquema similar a Blend pero usando diamantes en lugar de cuadrados. Cualquier uso de las opciones expertas es bajo tu propio riesgo. No están pensadas para uso en producción, sino como un método para explorar o producir funciones de redimensionado ingeniosas o de otro modo imposibles. ¡Úsalas bajo tu propio riesgo!
Resumen de los filtros de redimensionado
Lo siguiente es mi propia opinión personal tras estudiar, recodificar y documentar todos los filtros anteriores disponibles en ImageMagick. Si crees que puedo estar equivocado o quieres expresar tu opinión, te invito a expresar tus puntos de vista en el foro de IM, y a invitarme a responder. Los Filtros interpolados, como 'Hermite', son ideales al ampliar mucho las imágenes, produciendo un mínimo de desenfoque en el resultado final, aunque a menudo la salida podría afilarse artificialmente más en el posprocesado. Los Filtros de desenfoque de tipo Gaussian, como 'Mitchell', funcionan mejor para imágenes que básicamente consisten en dibujos lineales e imágenes tipo dibujo animado. Puedes controlar los efectos de desenfoque frente a los de aliasing del filtro sobre la imagen usando el especial Ajuste Filter Blur. Los Filtros Sinc/Jinc con ventana, y el equivalente Lagrange, son los mejores filtros para usar con imágenes del mundo real, y especialmente al reducir imágenes. Todos ellos son muy similares en sus resultados básicos. Un soporte mayor o, mejor aún, un ajuste de número de lóbulos, producirá en general un resultado todavía mejor, aunque también puedes obtener más efectos de ringing, pero a un mayor costo de cálculo. Los Filtros cúbicos son una mezcla variada de filtros rápidos y simples, de soporte fijo (normalmente 2.0), que produce de todo, desde el filtro de interpolación suave 'Hermite', el cualitativamente evaluado 'Mitchell' para ampliaciones de imagen, el filtro muy borroso de tipo Gaussian 'Spline', o un filtro nítido de tipo sinc con ventana usando 'Catrom'. En general, si los resultados del redimensionado son aceptables tal cual, déjalo estar, ya que es más probable que empeores las cosas en lugar de mejorarlas.
Comparación de filtros
Ampliación... Para dar una comparación final, aquí presento una selección de 12 filtros de redimensionado representativos. La imagen es una ampliación de un escalón con aliasing en una línea de un píxel de ancho, sobre un fondo gris oscuro. La propia imagen original tiene 'aliasing', así que deberías poder ver lo bien que los distintos filtros eliminan cualquier efecto de aliasing existente.
magick -size 10x6 xc:grey20 +antialias -draw 'fill white line 4,0 5,5' \
-filter {_filter_type_} -resize 100x {_result_}
Lo anterior comienza con los Filtros interpolados y continúa con los Filtros de desenfoque Gaussian, mostrando cuánto desenfoque producen estos filtros y, al hacerlo, eliminan el 'aliasing' de la imagen original. Estos filtros no producen ringing. La segunda línea comienza con tres Filtros Sinc con ventana que muestran los fuertes efectos de ringing que pueden producir. Recuerda que estos filtros están realmente diseñados para reducir imágenes, no para ampliarlas. Esto continúa con el 'Lagrange' usando su ajuste 'de interpolación' por defecto, y el filtro cúbico interpolado 'Catrom'. La imagen final es el filtro 'Mitchell', que muestra lo que los 'expertos' acordaron subjetivamente que era el mejor filtro 'ideal' a usar para ampliar imágenes, con un mínimo de los cuatro artefactos de remuestreo presentes en el resultado final. Yo mismo coincido con sus conclusiones, pero solo para las ampliaciones. Por eso 'Mitchell' es el filtro de 'ampliación' por defecto usado por IM. Reducción... Para hacerte una idea de los efectos de aliasing, aquí reduzco el recorte de la imagen de anillos grande que hicimos antes (105x105 píxeles de tamaño), para ver qué tipo de efectos de muaré genera cada uno de los mismos 12 filtros representativos.
magick rings_crop.png -filter {_filter_type_} -resize 100x {_result_}
Como puedes ver, los Filtros interpolados presentan un efecto de muaré con aliasing muy fuerte, causado como efecto secundario de los artefactos de bloques que producen. Por otro lado, los artefactos de desenfoque de los Filtros de desenfoque Gaussian eliminaron todos esos efectos de muaré de bloques de la imagen resultante, aunque con un desenfoque general (líneas indistintas) en la imagen resultante. El propio filtro '[Gaussian](#gaussian)' sí muestra un efecto de aliasing apenas perceptible, causado por el recorte de su filtro infinito (IIR) por el Ajuste de soporte del filtro, pero es muy leve. Por otro lado, los Filtros Sinc con ventana producen una imagen de aspecto muy nítido con efectos de muaré circulares, de intensidad aproximadamente igual en los tres filtros representativos. Esto lo causan los artefactos de ringing que producen estos filtros, generando patrones de interferencia. Por último, los filtros cúbicos también muestran algunos efectos de muaré muy leves, pero solo debido al ringing de lóbulo negativo. El filtro '[Mitchell](#mitchell)' es el que produce el menor efecto de ringing. Ten en cuenta que 'Mitchell' sí genera efectos muy menores de casi todos los artefactos de redimensionado. Es decir: muaré tipo rejilla - aliasing/bloques, muaré tipo circular - ringing, y desenfoque de las líneas. Sin embargo, todos los artefactos están en niveles muy mínimos, razón por la cual es un buen filtro polivalente. Aquí hay otra comparación, pero esta vez reduciendo fuertemente a un tamaño menor una imagen de anillos más pequeña.
magick rings_sm_orig.gif -filter {_filter_type_} -resize 100x {_result_}
Como puedes ver, los Filtros interpolados producen muchos artefactos de aliasing, mientras que los Filtros de desenfoque Gaussian tienden a desenfocar más líneas que los demás. Pero todos los otros filtros tienden a hacer un trabajo razonable.
¿El mejor filtro?
Eso es algo que tendrás que averiguar por ti mismo. Sin embargo, a menudo depende del tipo de imagen y de redimensionado que estés haciendo. Para ampliar imágenes, 'Mitchell' es probablemente el mejor filtro que puedes usar, mientras que básicamente cualquiera de los Filtros con ventana (el predeterminado es 'Lanczos') es bueno para reducir imágenes, especialmente cuando hay algún tipo de patrón de bajo nivel involucrado. Sin embargo, si no tienes patrones, pero sí muchos bordes rectos (como la transparencia GIF), puede que te convenga más usar un Filtro Gaussian afilado o, de nuevo, un 'Mitchell', para evitar fuertes efectos de ringing. El filtro 'Lagrange' también es bastante bueno, especialmente con un Ajuste de soporte del filtro mayor, para reducir imágenes. Para los interesados, recomiendo que mires el tema de discusión de usuarios de IM ¿una forma de comparar la calidad de imagen tras un redimensionado?, que básicamente muestra que no hay forma de determinar cuantitativamente "el mejor filtro", solo un "mejor filtro" cualitativo o subjetivo. La elección es tuya, y la elección es una característica clave de ImageMagick.
El filtro por defecto de IM...
Es por estas razones que 'Mitchell' es el filtro por defecto para la ampliación, así como para reducir imágenes que involucran transparencia, o imágenes que contienen una paleta (o mapa de colores). Sin embargo, 'Lanczos' se usará en todos los demás casos, es decir, al reducir imágenes normales (típicamente fotografías). Para Distort, el ajuste de filtro adopta por defecto el filtro 'Robidoux', que se diseñó específicamente para minimizar el desenfoque de la imagen cuando no tiene lugar ninguna distorsión real. Por supuesto, puedes anular estas elecciones.
Nicolas Robidoux
Nicolas Robidoux es un experto en procesamiento de imágenes con mucho más que decir y recomendar sobre cómo intentar obtener los mejores resultados posibles de tu redimensionado de imágenes. Tanto es así que tiene su propia sección...
Remuestreo por Nicolas Robidoux.
![[IM Output]](../static/img/filter/gray_edge.gif)
![[IM Output]](../static/img/filter/gray_edge_ringing.gif)
![[IM Output]](../static/img/filter/gray_edge_resize.gif)
![[IM Output]](../static/img/filter/graph_gaussian_support.gif)
![[IM Output]](../static/img/filter/graph_sinc_windowing.gif)
![[IM Output]](../static/img/filter/dot_resize_box_black.png)
![[IM Output]](../static/img/filter/dot_distort_box_black.png)
![[IM Output]](../static/img/filter/hash.png)
![[IM Output]](../static/img/filter/hash_removed.png)
![[IM Text]](../static/img/filter/filter_verbose.txt.gif)
![[IM Text]](../static/img/filter/filter_verbose2.txt.gif)
![[IM Output]](../static/img/filter/montage_enlarge.png)
![[IM Output]](../static/img/filter/montage_shrink.png)
![[IM Output]](../static/img/filter/montage_smaller.png)