Ejemplos de ImageMagick -- Misceláneos
- Ejemplos de ImageMagick: prefacio e índice
- Interpolación (búsquedas de color entre píxeles)
- Métodos de interpolación simples
- Bilinear, Mesh, Catrom, Spline
- Interpolación sobre un fondo
- Interpolación de una línea rotada
-
Interpolación de un borde rotado
Píxeles virtuales (búsquedas de color fuera de la imagen)
-
Edge, Tile, Mirror, Transparent, Black, Gray, White, Background,
HoriziontalTile, HoriziontalTileEdge, VerticalTile, VerticalTileEdge,
CheckerTile, Random, Dither - Píxeles virtuales e infinitos
- Colores de los píxeles virtuales
- Ejemplos de píxeles virtuales
-
Efectos de implosión sobre píxeles virtuales
Manchas aleatorias de color sólido Uso del argumento de Annotate Splice: creación de un nuevo operador de imagen Border, Frame y el uso de BorderColor Prueba de operadores de lista Esta página reúne ejemplos que prueban diversos aspectos de ImageMagick, pero que no encajan bien en las explicaciones de las otras páginas de ejemplos (al menos no formalmente). También se incluyen aquí algunas tablas que muestran los resultados del argumento versions con operadores concretos de IM. No obstante, otras personas también han hecho esto, así que, a menos que tenga algo que añadir, no lo trataré más a fondo.
Interpolación de píxeles o búsqueda de color entre píxeles
El ajuste «[-interpolate](https://imagemagick.org/command-line-options/#interpolate)» se usa al buscar un color en una imagen de origen cuando ese «punto de búsqueda» cae entre los píxeles de la imagen de origen. Esto ocurre en diversas operaciones de imagen, como «[-fx](https://imagemagick.org/command-line-options/#fx)» (operador de efectos especiales caseros) y «[-distort](https://imagemagick.org/command-line-options/#distort)» (operador generalizado de distorsión de imagen), así como en otros operadores relacionados como las distorsiones circulares. Básicamente, la «interpolación» le indica a IM cómo interpretar una búsqueda directa de color de una imagen cuando el punto no coincide exactamente con un píxel real de la imagen, sino que cae en el espacio entre píxeles. Por ejemplo, si se busca el color en la posición de píxel 3,4, se debería obtener el color exacto de ese píxel. Pero ¿qué debería devolver IM si se buscara el color de una imagen en el punto 3.23,4.75? ¿Se debería obtener el color del píxel en 3,4 o en 3,5? ¿O quizá una mezcla de los colores de los píxeles circundantes y, de ser así, cómo se deberían combinar esos colores? La interpolación de píxeles define qué debe hacer ImageMagick al buscar un único color en una posición de punto flotante (en coordenadas de píxel). La interpolación se parece en cierto modo al remuestreo de píxeles, como el que proporcionan los filtros de remuestreo. La diferencia esencial es que el remuestreo tiene una «escala», un «área» o una «ventana» variable de la que se devuelve un color que representa a todos los píxeles del área. La interpolación no implica ninguna «escala», solo un único «punto» de búsqueda y solo un «área» de tamaño fijo alrededor de ese punto a partir de la cual determinar el color que se usará en él. Por supuesto, la mayoría de los algoritmos de remuestreo por área tienden a degenerar en un método interpolativo cuando el área de remuestreo alcanza una «ventana» de trabajo mínima, y esto sucede de forma natural cuando las imágenes se amplían o se sobremuestrean. Por eso los filtros interpolados y los filtros de desenfoque gaussiano tienden a funcionar mejor para ampliar imágenes. La interpolación es básicamente una forma inferior de muestreo y se usa, en esencia, cuando se quiere una respuesta simple y rápida a la pregunta de «qué color».
Métodos de interpolación simples
Son métodos directos y simples, que intentan hacer lo menos posible para devolver un color a partir de una «interpolación de punto». Los más simples son «Nearest » e «Integer », que se limitan a tomar el color de un único píxel de la imagen de origen, tal cual, sin ninguna mezcla ni otros efectos de fusión. Esto conserva los valores de color originales de la imagen, pero a costa de efectos de aliasing y, por lo general, de un aspecto poco suave en las imágenes. |
Desde IM v6.7.6-2 puedes usar «Nearest» como abreviatura del ajuste de interpolación «Nearest-Neighbour». |
|---|---|
Los dos son muy parecidos y solo difieren en qué píxel extrae de la imagen de origen la coordenada de búsqueda. En concreto, «Integer» simplemente redondea hacia abajo el punto de búsqueda para seleccionar el píxel, lo que produce un desplazamiento general de medio píxel hacia la derecha y hacia abajo. Suele usarse únicamente en un «escalado» simplificado de la imagen de origen. En cambio, «Nearest» selecciona el píxel más cercano a la coordenada de búsqueda de punto flotante y, por tanto, produce un resultado más correcto. «Blend » fusiona (promedia) los 1, 2 o 4 píxeles más cercanos, según su distancia al punto de muestreo. El resultado es que el color del píxel original sigue presente, pero reducido a la mitad de tamaño, mientras que un tablero de ajedrez de colores fusionados rellena el espacio intermedio. (véase el ejemplo más abajo) «Average » en realidad nunca produce una coincidencia exacta de color, sino que siempre mezcla los 4 píxeles circundantes para producir un promedio local. Esto puede resultar útil en situaciones de búsqueda de color. «Average4» también puede usarse como alias de este método de interpolación. «Average9 » es similar, pero promedia los 9 píxeles más cercanos alrededor del punto de muestreo, lo que produce un resultado borroso. «Average16 » promedia los 16 píxeles más cercanos alrededor del punto de muestreo, lo que produce un resultado extremadamente borroso. Aquí tienes un resumen de los distintos métodos de interpolación simples, al ampliar un pequeño grupo de píxeles de color o un único píxel blanco. La imagen original se parece al resultado de «Nearest», pero mucho más pequeña. |
for method in integer nearest blend average average9 average16 ; do
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-bordercolor black -border 1 \
-filter point -interpolate $method \
+distort SRT 20,0 ip_color_${method}.jpg
magick xc: -bordercolor black -border 2 \
-filter point -interpolate $method \
+distort SRT 16,0 ip_pixel_${method}.jpg
done
| Antes de IM v6.7.7-6, «Average» equivalía en realidad a lo que ahora es «Average16». Los otros dos interpoladores de promediado, así como «Blend» y «Background», se añadieron en ese momento.
---|---
Se proporciona también otro método de interpolación simple, «Background », que simplemente devuelve el color de fondo actual para cualquier «muestreo» de la imagen de origen. En muchos sentidos esto resulta más bien inútil, ya que normalmente acabas con una imagen de color sólido y sin nada. Su uso principal es como comprobación de funciones de remuestreo más complejas, como en un fallo de remuestreo, donde el filtro de remuestreo EWA (usado normalmente por el operador de distorsión general) recurre a una búsqueda interpolada cuando el remuestreo no encuentra ningún píxel en su «soporte» o área de remuestreo. Si se ajusta la interpolación a «Background» y se establece un color de fondo llamativo (como «red»), se pueden buscar píxeles en la imagen resultante para ver dónde «falló» el remuestreo o «no acertó a ningún píxel de la imagen de origen» por algún motivo. Normalmente se debe a un ajuste de soporte demasiado pequeño o a haber experimentado con opciones de filtro avanzadas. FUTURO: posible opción de interpolación futura de selección «aleatoria» sobre el área interpolada. ¡Podría ser útil para efectos interpolados vistosos!
Bilinear
«Bilinear » (o interpolación lineal) es el método de interpolación predeterminado y probablemente una de las formas más simples de obtener un resultado realmente interpolado, combinando los colores de los píxeles que rodean el punto de búsqueda o de muestreo. Aquí tienes un diagrama que explica cómo funciona una interpolación bilineal.
![[diagram]](../static/img/img_diagrams/bilinear_interpolation.jpg)
Es decir, simplemente traza líneas rectas en las direcciones ortogonales para situar el color del punto de muestreo dado. El resultado también equivale a un filtro de remuestreo triangular cuando se usa con resize. |
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -fx 'v.p{i/(w-1),j/(h-1)}' \
interpolate_bilinear.jpg
magick \( xc:white xc:black +append \) \
\( xc:black xc:white +append \) -append \
-size 100x100 xc: +swap -fx 'v.p{i/(w-1),j/(h-1)}' \
interpolate_saddle.jpg
![[IM Output]](../static/img/misc/interpolate_saddle.jpg)
Esta última imagen muestra cómo se forma un degradado lineal a lo largo de los bordes entre los cuatro puntos conocidos y, después, se forma un segundo degradado lineal entre esos bordes. Es decir, los colores entre los píxeles circundantes se generan mediante degradados lineales horizontales y verticales. Esto, a su vez, produce un degradado bidimensional curvo que se conoce normalmente como «silla de montar», en el sentido de que se eleva en dos esquinas opuestas y desciende en las otras dos. Incluso puedes usar este método para generar de forma más directa un degradado lineal en ángulo de 45 grados, pero requiere especificar el color intermedio para las esquinas diagonalmente opuestas. |
magick \( xc:blue xc:navy +append \) \
\( xc:navy xc:black +append \) -append \
-size 100x100 xc: +swap -fx 'v.p{i/(w-1),j/(h-1)}' \
interpolate_45linear.jpg
![[IM Output]](../static/img/misc/interpolate_45linear.jpg)
El aspecto más importante de este método de interpolación predeterminado es que el píxel del centro mismo de la imagen siempre será un promedio de los cuatro colores de las esquinas, con degradados lineales perfectos en los bordes y una coincidencia exacta de color en las esquinas.
Mesh
El ajuste «[-interpolate](https://imagemagick.org/command-line-options/#interpolate)» de «Mesh» es una variante de la interpolación «[Bilinear](#bilinear)». Mientras que «Bilinear» produce una superficie curva tridimensional, «Mesh» se diseñó para dividir el área entre píxeles en dos superficies triangulares planas. La división del área en dos triángulos se basa en la diagonal con los dos colores de esquina más «cercanos». |
Para más detalles del algoritmo «Mesh», véase el artículo Image Interpolation by Pixel-Level Data-Dependent Triangulation. |
|---|---|
| Por ejemplo, usemos el mismo conjunto de colores de esquina que usamos antes. |
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Mesh \
-fx 'v.p{i/(w-1),j/(h-1)}' interpolate_tri-mesh.jpg
![[IM Output]](../static/img/misc/interpolate_tri-mesh.jpg)
Como puedes ver, el algoritmo «Mesh» produjo casi exactamente el mismo conjunto de interpolaciones de color que «[Bilinear](#bilinear)». Sin embargo, si invertimos los colores amarillo y cian… |
magick \( xc:red xc:blue +append \) \
\( xc:cyan xc:yellow +append \) -append \
-size 100x100 xc: +swap -interpolate Mesh \
-fx 'v.p{i/(w-1),j/(h-1)}' interpolate_tri-mesh2.jpg
![[IM Output]](../static/img/misc/interpolate_tri-mesh2.jpg)
Esta vez el algoritmo «Mesh» decidió que los colores «blue» y «cyan» eran las dos esquinas más cercanas y creó un degradado lineal en diagonal entre esas dos esquinas. El resto de los colores forman entonces un sencillo degradado triangular plano desde esa línea hacia las otras dos esquinas. Esto puede parecer una interpolación inusual, pero el método garantiza que los bordes nítidos se mantengan bastante nítidos cuando las imágenes de color solo se redimensionan, rotan o cizallan ligeramente. De hecho, una operación de redimensionado adaptativo («[-adaptive-resize](https://imagemagick.org/command-line-options/#adaptive-resize)») aprovecha este hecho en los redimensionados pequeños para reducir el desenfoque excesivo del resultado. Por ejemplo, si tenemos una única esquina «blanca», «mesh» asume que se ha encontrado un borde y ajusta los colores interpolados para resaltarlo. |
magick \( xc:black xc:black +append \) \
\( xc:white xc:black +append \) -append \
-size 100x100 xc: +swap -interpolate Mesh \
-fx 'v.p{i/(w-1),j/(h-1)}' interpolate_tri-mesh3.jpg
![[IM Output]](../static/img/misc/interpolate_tri-mesh3.jpg)
Por supuesto, si los colores producen un degradado razonablemente coherente, la interpolación «mesh» también produce un degradado razonablemente coherente. |
magick \( xc:blue xc:navy +append \) \
\( xc:black xc:black +append \) -append \
-size 100x100 xc: +swap -interpolate Mesh \
-fx 'v.p{i/(w-1),j/(h-1)}' interpolate_tri-mesh4.jpg
![[IM Output]](../static/img/misc/interpolate_tri-mesh4.jpg)
Como puedes ver, el resultado es un degradado bastante razonable, aunque, si miras con atención, se aprecia la unión diagonal de los dos triángulos separados. El cambio no es tan suave como en bi-linear (que tampoco es exactamente suave), pero estos métodos tampoco intentan conservar los bordes nítidos en imágenes redimensionadas o distorsionadas.
Catrom (Catmull-Rom)
El ajuste «[-interpolate](https://imagemagick.org/command-line-options/#interpolate)» de «Catrom» (conocido generalmente, de forma imprecisa, como interpolación «BiCubic») es más complejo a la hora de determinar los colores de una búsqueda de punto. Básicamente, no se limita a mirar los colores de las esquinas del área entre píxeles, sino que va más allá y observa los colores que hay más allá de esos píxeles vecinos más próximos. Un total de 16 píxeles en un área de 4x4 alrededor del punto de muestreo. En esencia, ajusta una curva a toda el área implicada para determinar el mejor color global que usar. Aquí tienes un diagrama que probablemente explica el proceso mejor…
![[diagram]](../static/img/img_diagrams/bicubic_interpolation.jpg)
Y aquí están los colores interpolados para nuestros cuatro colores estándar. |
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Catrom \
-fx 'v.p{i/(w-1),j/(h-1)}' interpolate_catrom.jpg
![[IM Output]](../static/img/misc/interpolate_catrom.jpg)
La imagen anterior puede parecer muy similar a una interpolación «[Bilinear](#bilinear)», pero el resultado tiene una curva de fusión más suave en lugar de líneas rectas para producir el color interpolado. Lo que esta imagen no muestra, sin embargo, es el efecto de los demás píxeles que rodean a nuestros cuatro vecinos próximos. Para verlo necesitamos observar un área algo mayor. En este ejemplo concreto (muy pequeño), los píxeles circundantes se controlan mediante el ajuste de píxel virtual.
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Catrom -virtual-pixel edge \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' interpolate_catrom_edge.jpg
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Catrom -virtual-pixel White \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' interpolate_catrom_white.jpg
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Catrom -virtual-pixel Black \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' interpolate_catrom_black.jpg
| En una imagen real, los efectos de lospíxeles virtuales suelen afectar solo a los resultados cercanos a los bordes mismos de la imagen. Como esta imagen tiene solo 2 píxeles de ancho, el ejemplo anterior se ve fuertemente afectado. Esto no ocurre en imágenes más grandes y típicas.
---|---
Como puedes ver, la curva está fuertemente influida por los colores circundantes, lo que produce o bien un cambio de color muy nítido y abrupto, o bien un cambio de color más fusionado según definan los colores circundantes. Sin embargo, también se aprecia que los cambios fuertes en los colores de los píxeles circundantes pueden producir pequeñas áreas con el inverso o el negativo de ese color. Esto es un artefacto de ringing y normalmente solo se observa en bordes extremadamente nítidos de colores complementarios en una imagen real. | _Este efecto de ringing en bordes de color muy muy fuertes puede recortarse y producir una línea de píxeles horribles. Este problema se puede evitar haciendo los redimensionados y la interpolación en un espacio de color distinto de «RGB», como los espacios de color «Lab» o «Luv».
Para más información y ejemplos de este problema, véase Redimensionar en el espacio de color LAB.
_
---|---
| _Ten en cuenta que «BiCubic» (filtro cúbico interpolado) se refiere a una familia muy amplia de filtros y, por tanto, su significado es muy impreciso. Sigue estando disponible, pero su uso está obsoleto, en favor de nombres más precisos.
Después de IM v6.7.7-7, «BiCubic» es simplemente un alias de «Catrom», que suele considerarse un buen «interpolador cúbico» (b=0, c=1/2). Deberías usar el nombre «Catrom» en lugar de «BiCubic» para dejar claro qué estás usando para la interpolación.
Antes de IM v6.7.7-7, «BiCubic» usaba en realidad un filtro «Cardinal Cubic» extremo (b=0, c=1) que tiene un efecto de ringing negativo demasiado fuerte. Este se ha sustituido por completo por «Catrom» y ya no está disponible como función interpolativa.
Antes de IM v6.3.5-3, «BiCubic» se implementaba como un interpolador cúbico «Spline» muy borroso. Ese filtro se renombró en esta versión de ImageMagick. (véase a continuación)
Spline
El método de interpolación «Spline», al igual que «[Catrom](#catrom)» más arriba, también usa los 16 píxeles más cercanos. Sin embargo, es una interpolación muy borrosa, de tipo gaussiano. |
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate spline \
-fx 'v.p{i/(w-1),j/(h-1)}' interpolate_spline.jpg
![[IM Output]](../static/img/misc/interpolate_spline.jpg)
Como puedes ver, los colores de las esquinas mismas de la interpolación «Spline» anterior están apagados, ya que la superficie interpolada en realidad no pasa por el color original de esos píxeles. En esencia, está demasiado «borrosa» y se conoce con más propiedad como una superficie «B-Spline». La superficie sigue siendo un tipo de filtro cúbico (b=1, c=0), ya que se genera mediante una técnica de curvas cúbicas por tramos. Sin embargo, esta curva solo se aproxima a los colores originales de los píxeles, especialmente en áreas con cambios de color fuertes. Es decir, una búsqueda interpolada en una posición de píxel entera exacta no devolverá el color real de ese píxel, sino una mezcla difuminada del color con los píxeles circundantes. A menudo se considera algo malo, pero puede usarse como función general de suavizado. Al igual que «[Catrom](#catrom)», también se ve afectada por los píxeles circundantes.
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Spline -virtual-pixel edge \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' interpolate_spline_edge.jpg
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Spline -virtual-pixel White \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' interpolate_spline_white.jpg
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Spline -virtual-pixel Black \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' interpolate_spline_black.jpg
| En una imagen real, los efectos de lospíxeles virtuales solo se dan en los bordes de la imagen. Con píxeles reales rodeando el área entre píxeles desde la que se realiza la búsqueda.
---|---
Aquí puedes ver los efectos del apagado de color que resulta del mal ajuste de las curvas «spline» a los colores de los píxeles. El resultado son, en general, bordes más borrosos en las áreas de color y en las líneas finas. Sin embargo, tampoco mostrarán nunca ningún efecto de «ringing» negativo como el que se puede obtener con una interpolación «[Catrom](#catrom)».
Fondo de interpolación
Como los efectos de la interpolación a menudo abarcan áreas mayores, aquí tienes una ampliación de los cuatro métodos de interpolación principales con píxeles circundantes blancos o negros.
for method in bilinear mesh catrom spline ; do
for vpixel in white black ; do
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate $method -virtual-pixel $vpixel \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' ip_area_${method}_$vpixel.jpg
done
done
Como puedes ver, el color de fondo circundante no tiene un efecto real en los colores interpolados con «[bilinear](#bilinear)». Parece simplemente superpuesto sobre cualquier color de fondo presente. En cambio, puedes ver cómo «[mesh](#mesh)» genera bordes más fuertes y nítidos, pero puede decidir invertir la diagonal según el color circundante cuando este interviene en los bordes de la imagen. Observa la unión entre el rojo y el azul, entre los fondos blanco y negro, para ver esta «inversión». La curva interpolada de «[catrom](#catrom)» y «[spline](#spline)» se ve afectada por los píxeles circundantes, sobre todo en los casos de prueba que implican colores absolutos. Y, por último, la interpolación «[spline](#spline)» no es en realidad más que un desenfoque de tipo gaussiano de la imagen (usando una sigma de 0.65). Suficiente desenfoque para eliminar cualquier efecto de «ringing» o de aliasing, aunque normalmente resulta demasiado borroso para la mayoría de los usos. Véase Filtros gaussianos.
Interpolación de una línea rotada
Aquí muestro los distintos métodos de interpolación creando una imagen de una línea vertical y, mediante una distorsión afín, rotando la línea 17 grados; después amplío la vista para que se puedan ver los píxeles de antialiasing generados.
magick -size 10x20 xc: -draw 'line 4,0 4,20' \
-scale 50x100 ip_line_none.gif
for method in integer nearest bilinear mesh catrom spline; do
magick -size 10x20 xc: -draw 'line 5,0 5,20' \
-interpolate $method -filter point -distort SRT 17 \
-scale 50x100 ip_line_${method}.gif
done
![[IM Output]](../static/img/misc/ip_line_none.gif)
Sin rotar | | ![[IM Output]](../static/img/misc/ip_line_integer.gif)
Integer | ![[IM Output]](../static/img/misc/ip_line_nearestneighbor.gif)
Nearest | ![[IM Output]](../static/img/misc/ip_line_bilinear.gif)
Bilinear | ![[IM Output]](../static/img/misc/ip_line_mesh.gif)
Mesh | ![[IM Output]](../static/img/misc/ip_line_catrom.gif)
Catrom | ![[IM Output]](../static/img/misc/ip_line_spline.gif)
Spline
---|---|---|---|---|---|---|---
Como puedes ver, los métodos de búsqueda directa de color «Interger» y «NearestNeighbor» producen un resultado muy aliasado, pero solo usan los colores originales presentes en la imagen. La diferencia principal entre los dos es que «Interger» tiende a empujar la imagen resultante hacia abajo y hacia la izquierda medio píxel. «Bilinear», «Mesh» y «Catrom» producen en general resultados muy buenos y similares (más sobre esto luego), y el último genera una línea rotada muy nítida. Cualquiera de ellos se considera en general una buena solución. Los métodos de interpolación «Spline» producen un desenfoque marcado de las líneas finas, de modo que eliminan los efectos de aliasing. Sin embargo, «Spline» tiende a desenfocar demasiado los resultados y, en realidad, es más adecuado para suavizar degradados que para líneas rotadas. |
El ajuste especial «[-filter](#filter) point» del ejemplo anterior se usa para garantizar que el operador de distorsión solo emplee interpolación de un único «punto» al determinar el color final del píxel. Sin él, se usaría un remuestreo por área en lugar de una búsqueda interpolada, aunque eso también produce muy buenos resultados. |
|---|---|
_Ten en cuenta que no usé el operador «[-rotate](https://imagemagick.org/command-line-options/#rotate)» para estos ejemplos, ya que ese operador usa un método de cizallamiento de píxeles para rotar imágenes. Como resultado, no se usa la interpolación de píxeles. |
Véase Rotar una línea fina para un ejemplo del uso del operador «[-rotate](https://imagemagick.org/command-line-options/#rotate)» de esta manera y los efectos resultantes a nivel de píxel.
Actualización: desde IMv6.7.3-4, el operador rotate usa internamente el operador de distorsión, por lo que lo anterior puede que ya no sea cierto.
Interpolación de un borde rotado
Los resultados presentan una ligera diferencia cuando se distorsiona el borde de un área, en comparación con una única línea de píxeles.
magick -size 10x20 xc: -draw 'rectangle 0,0 4,19' \
-scale 50x100 ip_edge_none.gif
for method in integer nearest bilinear mesh catrom spline; do
magick -size 10x20 xc: -draw 'rectangle 0,0 4,19' \
-interpolate $method -filter point -distort SRT -17 \
-scale 50x100 ip_edge_${method}.gif
done
![[IM Output]](../static/img/misc/ip_edge_none.gif)
Sin rotar | | ![[IM Output]](../static/img/misc/ip_edge_integer.gif)
Integer | ![[IM Output]](../static/img/misc/ip_edge_nearestneighbor.gif)
Nearest | ![[IM Output]](../static/img/misc/ip_edge_bilinear.gif)
Bilinear | ![[IM Output]](../static/img/misc/ip_edge_mesh.gif)
Mesh | ![[IM Output]](../static/img/misc/ip_edge_catrom.gif)
Catrom | ![[IM Output]](../static/img/misc/ip_edge_spline.gif)
Spline
---|---|---|---|---|---|---|---
Lo anterior habla por sí mismo en general. «Bilinear» y «Mesh» producen bordes razonablemente nítidos para rotaciones generales, mientras que «Catrom» produce un borde más nítido en la imagen distorsionada. «Spline», en cambio, produce bordes más borrosos. La diferencia entre «Bilinear» y «Mesh» es extremadamente mínima en los casos anteriores. Los dos métodos solo generan diferencias visibles en casos de ampliación extrema durante la operación de distorsión. De lo contrario, solo verás cambios leves y apenas perceptibles en la intensidad de los píxeles.
Píxeles virtuales: búsqueda de color fuera de la imagen
Muchos operadores a menudo necesitan buscar colores que caen fuera de los límites propios de la imagen. Esto incluye los operadores para desenfocar imágenes, distorsión general de imagen, operadores morfológicos y de convolución, el operador de distorsión general e incluso el muy antiguo operador de implosión. Entonces, ¿qué color debería devolverse si se pide un píxel en -22,-3? Ese píxel en realidad no existe, pero el valor de color devuelto puede tener efectos de gran alcance sobre el efecto global de tu procesamiento de imagen, especialmente sobre los colores resultantes de los píxeles cercanos al borde real de la imagen. El ajuste «[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)» define qué debe devolver IM al acceder a un píxel fuera de los límites normales de la imagen.
Por ejemplo, aquí usamos el operador casero FX «[-fx](https://imagemagick.org/command-line-options/#fx)» para «buscar» y mostrar todos los píxeles de la pequeña imagen y de su alrededor, de modo que podamos ver qué devolvió el ajuste predeterminado «[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)». |
magick -size 70x70 xc: tree.gif \
-fx 'v.p[-19,-19]' virtual_default.gif
![[IM Output]](../static/img/misc/virtual_default.gif)
El ajuste «Edge » de «[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)» devuelve el color del píxel real más cercano a la ubicación «virtual» solicitada. Es decir, el color del «borde» más próximo. Esta vez usaré una distorsión de imagen con viewport, más rápida, para mostrar los píxeles virtuales circundantes, en lugar del operador FX, mucho más lento. El método de distorsión «SRT 0» en realidad no distorsiona el resultado de la imagen, solo observa qué píxeles ve realmente el operador de imagen, en especial los «virtuales» que rodean la imagen de origen. |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Edge -filter point -distort SRT 0 \
+repage virtual_edge.gif
![[IM Output]](../static/img/misc/virtual_edge.gif)
El ajuste de píxel virtual «Edge» es el ajuste predeterminado, así que lo anterior debería ser igual que el ejemplo previo. Este ajuste suele tener el impacto más mínimo (en cuanto a efectos de borde) al procesar imágenes, razón por la que también se eligió como ajuste predeterminado. Esto es especialmente importante al usar desenfoque u otros operadores morfológicos y de convolución que usan un «vecindario» de píxeles para procesar. Es importante notar cómo el color del píxel de la esquina acaba rellenando por completo las áreas diagonalmente adyacentes que rodean la imagen real. Esto puede hacer que ese único píxel de la esquina tenga un gran efecto en diversas transformaciones de imagen. Este efecto de «esquina» es especialmente notable al desenfocar imágenes. El ajuste VP «Tile » es muy útil para generar efectos de borde del procesamiento de imagen que se enrollen alrededor de los límites de la imagen, y para garantizarlos. |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Tile -filter point -distort SRT 0 \
+repage virtual_tile.gif
![[IM Output]](../static/img/misc/virtual_tile.gif)
Esto te permite garantizar que las imágenes en las que trabajas sigan siendo «teselables», o que lo sean más a medida que se modifica la imagen. Para más ejemplos, véase Modificar imágenes teseladas. «Mirror » es muy similar a «[tile](#tile)» y puede ser mejor para algunos efectos que el «[edge](#edge)» predeterminado. |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Mirror -filter point -distort SRT 0 \
+repage virtual_mirror.gif
![[IM Output]](../static/img/misc/virtual_mirror.gif)
Esto es especialmente útil para reducir el efecto de borde y de esquina de las imágenes que se desenfocan. Sin embargo, también puede generar otros efectos. | _Hasta IM v6.5.0-1, solo se reflejaban las imágenes directamente adyacentes a la imagen original. Las demás copias virtuales, más alejadas de la original, permanecían sin reflejar (patrón de teselado normal). Esto se corrigió, de modo que ahora todo el espacio de lienzo virtual se tesela correctamente en espejo, no solo las copias virtuales vecinas.
Solo cobra importancia al usar el teselado en espejo con el operador de distorsión general para teselar en espejo un área muy grande, como al contemplar horizontes lejanos_
---|---
«Transparent » simplemente devuelve el color transparente para los píxeles fuera de los límites reales de la imagen. |
magick tree.gif -alpha set -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Transparent -filter point -distort SRT 0 \
+repage virtual_trans.gif
![[IM Output]](../static/img/misc/virtual_trans.gif)
El operador Alpha «set» anterior es necesario para garantizar que la imagen tenga un canal mate o alfa, de modo que el color transparente se rellene correctamente. Sin este ajuste, lo anterior podría devolver un color «negro» en lugar de transparente, ya que el color «none» o «negro totalmente transparente» es el color transparente predeterminado. Por ejemplo, aquí desactivo por error la transparencia… |
magick tree.gif -alpha off -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Transparent -filter point -distort SRT 0 \
+repage virtual_trans2.gif
![[IM Output]](../static/img/misc/virtual_trans2.gif)
El ajuste «Transparent» es especialmente útil para distorsiones de imagen en las que la imagen distorsionada se «superpondrá» luego para construir imágenes mayores. Por ejemplo, cubos afines en 3D y cajas en perspectiva en 3D. Los ajustes «white », «gray » y «black » son similares al ajuste «Transparent» anterior. Simplemente devuelven ese color concreto para cualquier píxel que caiga fuera de los límites. |
magick tree.gif -alpha off -set option:distort:viewport 70x70-19-19 \
-virtual-pixel White -filter point -distort SRT 0 \
+repage virtual_white.gif
magick tree.gif -alpha off -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Gray -filter point -distort SRT 0 \
+repage virtual_gray.gif
magick tree.gif -alpha off -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Black -filter point -distort SRT 0 \
+repage virtual_black.gif
![[IM Output]](../static/img/misc/virtual_black.gif)
Si quieres cualquier otro color sólido, debes definirlo en el ajuste «[-background](https://imagemagick.org/command-line-options/#background)» y usar un ajuste «Background » de «[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)». |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Background -background coral \
-filter point -distort SRT 0 +repage virtual_bgnd.gif
El ajuste VP «HorizontalTile » se añadió en IM v6.4.2-6 como una forma especial de teselado útil para las distorsiones completas de 360 grados «[Arc](distorts.html#arc)» y «[Polar](distorts.html#polar)». La imagen se tesela solo horizontalmente, mientras que los píxeles virtuales situados encima y debajo de las teselas se toman del color «[-background](https://imagemagick.org/command-line-options/#background)» actual. |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel HorizontalTile -background coral \
-filter point -distort SRT 0 +repage virtual_horizontal.gif
![[IM Output]](../static/img/misc/virtual_horizontal.gif)
Esto te permite garantizar que las imágenes que se transforman sigan siendo «teselables» horizontalmente. Para más ejemplos, véase Modificar imágenes teseladas. «HorizontalTileEdge » (añadido en IM v6.5.0-1) también tesela la imagen horizontalmente a lo largo del espacio virtual, pero replica los píxeles del borde lateral por el resto del espacio de lienzo virtual. |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel HorizontalTileEdge -background coral \
-filter point -distort SRT 0 +repage virtual_horizontal_edge.gif
![[IM Output]](../static/img/misc/virtual_horizontal_edge.gif)
Estos dos métodos VP se añadieron para manejar mejor las distorsiones de círculo completo «[Arc](../static/img/distorts#arc)» y «[Polar](../static/img/distorts#polar)», en las que la imagen encerrada en círculo «se envuelve» y se une extremo con extremo.
De forma similar, el ajuste VP «VerticalTile » (también añadido en IM v6.4.2-6, por completitud) tesela la imagen solo verticalmente, usando el color «[-background](https://imagemagick.org/command-line-options/#background)» actual para rellenar los laterales de la imagen. |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel VerticalTile -background coral \
-filter point -distort SRT 0 +repage virtual_vertical.gif
![[IM Output]](../static/img/misc/virtual_vertical.gif)
«VerticalTileEdge » se añadió en IM v6.5.0-1 y replica los píxeles del borde lateral por el resto del espacio de lienzo virtual. |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel VerticalTileEdge -background coral \
-filter point -distort SRT 0 +repage virtual_vertical_edge.gif
![[IM Output]](../static/img/misc/virtual_vertical_edge.gif)
En IM v6.5.0-1 se añadió «CheckerTile » para teselar una imagen como si se rellenara un patrón de tablero de ajedrez. Las demás casillas se rellenan simplemente con el color de fondo (que puede ser transparente). |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel CheckerTile -background coral \
-filter point -distort SRT 0 +repage virtual_checker.gif
![[IM Output]](../static/img/misc/virtual_checker.gif)
Haciendo transparente el fondo y superponiendo esa imagen sobre otra imagen totalmente teselada del mismo tamaño, puedes combinar los dos teselados para producir un patrón de tablero de ajedrez entrelazado de las dos imágenes. |
magick -size 96x96 tile:balloon.gif \
\( tree.gif -alpha set -set option:distort:viewport 96x96 \
-virtual-pixel CheckerTile -background none \
-filter point -distort SRT 0 \) \
-flatten virtual_checker_2.gif
Hay también un par de ajustes «[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)» más inusuales. «random » simplemente elige un píxel aleatorio de la imagen para usarlo. |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Random -filter point -distort SRT 0 \
+repage virtual_random.gif
![[IM Output]](../static/img/misc/virtual_random.gif)
Esto se usa a menudo con «[-blur](https://imagemagick.org/command-line-options/#blur)» para generar un color de imagen promedio, áspero y moteado, en los efectos de borde que produce. Ten en cuenta que el valor del píxel no es coherente y producirá un efecto distinto en cada búsqueda, e incluso en cada ejecución de la operación, a menos que se le dé al generador de números aleatorios un valor inicial con «[-seed](https://imagemagick.org/command-line-options/#seed)». Esto es especialmente malo al usarlo con procesamiento de imagen de convolución o morfología, ya que cada búsqueda a lo largo del borde de la imagen aportará un valor diferente aunque se use la misma búsqueda de píxel. No obstante, he descubierto que el patrón aleatorio es muy bueno al generar un horizonte en perspectiva, ya que el patrón muestra un resultado más borroso a medida que te acercas al horizonte. El desenfoque da a la textura aleatoria resultante una profundidad que de otro modo no sería visible si se usara un simple color sólido.
«dither », en cambio, devuelve un patrón de colores con tramado ordenado basado en los píxeles situados a menos de 32x32 píxeles de la posición solicitada. Esto significa que, una vez que avanzas más de 32 píxeles desde la imagen, el resultado vuelve a ser simplemente el color del píxel de la esquina de la imagen. Es algo así como una fusión de «[edge](#edge)» y «[random](#random)». |
magick tree.gif -set option:distort:viewport 120x120-44-44 \
-virtual-pixel Dither -filter point -distort SRT 0 \
+repage virtual_dither.gif
![[IM Output]](../static/img/misc/virtual_dither.gif)
Arriba puedes ver que el amarillo del sol en una esquina de esta imagen de 32x32 píxeles consigue ser seleccionado hasta bien arriba, en la esquina inferior derecha, pero no más allá. Es decir, el límite del «vecindario» de 32 píxeles para la selección de color del tramado ordenado. Si esta imagen fuera más grande, el color amarillo del sol no llegaría a las demás esquinas. Este patrón no es «aleatorio» y siempre generará el mismo resultado para la misma imagen. Podrías concebirlo como una forma más ordenada del VP «[random](#random)» cerca de la imagen, pero que pasa a comportarse más como «[edge](#edge)» una vez que procesas más allá de 32 píxeles de la imagen propiamente dicha.
Píxeles virtuales e infinitos
Puedes ver los efectos de «[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)» mucho más claramente en los resultados del operador de distorsión general, y sobre todo con una distorsión de perspectiva, que te permite crear una vista distorsionada hacia una distancia infinita. Por ejemplo, aquí muestro los resultados de un ajuste «[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) dither» en una vista en perspectiva del árbol. Esto muestra cómo este ajuste puede afectar a los píxeles devueltos hasta el infinito.
magick tree.gif -mattecolor DodgerBlue -virtual-pixel dither \
-set option:distort:viewport 150x100-50-50 \
-distort perspective '0,0 9,0 31,0 38,0 0,31 0,18 31,31, 40,18' \
perspective_dither.gif
Prueba lo anterior con otros ajustes «[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)» para hacerte una mejor idea de cómo funcionan. También se pueden ver otros ejemplos en Contemplar horizontes lejanos. Ten en cuenta que el «cielo» de la vista anterior se genera en realidad a partir del ajuste «[-mattecolor](https://imagemagick.org/command-line-options/#mattecolor)», que distort usa para representar las áreas «no válidas», en este caso el «cielo» de una distorsión en perspectiva. No proviene del ajuste «[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)».
Colores de los píxeles virtuales
Ninguno de los métodos de «[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)» devuelve en realidad un color distinto o compuesto respecto al que ya está presente en la imagen, a menos que ese color se haya solicitado específicamente mediante uno de los métodos de color sólido: «[background](#background)», «[transparent](#transparent)», «[background](#background)», «[black](#black)», «[white](#white)», «[gray](#gray)»; es decir, nunca se generan colores nuevos, aunque sí puede añadirse un color concreto (dos en el caso del operador de distorsión general). Por supuesto, si los píxeles solicitados se interpolan a nivel de píxel o se remuestrean por área, como en la vista en perspectiva distorsionada de arriba, entonces esos métodos pueden mezclar los colores devueltos según el ajuste «[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)» elegido.
Efectos de los píxeles virtuales sobre los operadores
Aquí exploro los efectos del ajuste «[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)» con diversos operadores. «[-blur](https://imagemagick.org/command-line-options/#blur)»… |
magick -size 70x70 xc:lightblue -fill black -draw 'circle 35,65 25,55' \
-virtual-pixel edge -blur 0x8 vp_blur.png
magick -size 70x70 xc:lightblue -fill black -draw 'circle 35,65 25,55' \
-virtual-pixel mirror -blur 0x8 vp_blur_2.png
![[IM Output]](../static/img/misc/vp_blur_2.png)
Observa en el siguiente ejemplo cómo la imagen puede contaminarse cruzadamente al usar «[-blur](https://imagemagick.org/command-line-options/#blur)» con el ajuste «tile» de «[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)». Por supuesto, si la imagen ya era teselable de partida, esto puede ser lo deseado. |
magick -size 70x70 xc:lightblue -fill black -draw 'circle 35,65 25,55' \
-virtual-pixel tile -blur 0x8 vp_blur_3.png
![[IM Output]](../static/img/misc/vp_blur_3.png)
Establecer un color concreto para el «[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)» de la imagen tiene efectos y posibilidades muy interesantes. |
magick -size 70x70 xc:lightblue -fill black -draw 'circle 35,65 25,55' \
-virtual-pixel background -background blue \
-blur 0x8 vp_blur_4.png
magick -size 70x70 xc:lightblue -fill black -draw 'circle 35,65 25,55' \
-virtual-pixel transparent -channel RGBA -blur 0x8 \
-background red -flatten vp_blur_5.png
![[IM Output]](../static/img/misc/vp_blur_5.png)
Observa cómo el fondo «red» que coloqué detrás de la imagen es visible alrededor de los bordes, donde la imagen desenfocada resultante ha hecho uso de los píxeles virtuales que rodean los píxeles reales de la imagen. «[-gaussian](https://imagemagick.org/command-line-options/#gaussian)» tiene básicamente los mismos resultados que «[-blur](https://imagemagick.org/command-line-options/#blur)», lo cual es comprensible, ya que son matemáticamente idénticos. |
magick -size 70x70 xc:lightblue -fill black -draw 'circle 35,65 25,55' \
-virtual-pixel background -background blue \
-gaussian 0x8 vp_gaussian.png
![[IM Output]](../static/img/misc/vp_gaussian.png)
En cambio, «[-radial-blur](https://imagemagick.org/command-line-options/#radial-blur)» (en realidad un desenfoque de rotación) produce efectos de borde más interesantes… |
magick -size 70x70 xc:lightblue \
-virtual-pixel background -background blue \
-radial-blur 0x30 vp_radial.png
![[IM Output]](../static/img/misc/vp_radial.png)
Este último, con el «borde transparente» predeterminado, probablemente generará un borde suave cuando se use con ángulos de desenfoque radial mayores. Puede producir una imagen de superposición de «viñeta» o de borde suave más limpia que otras técnicas. Véase Bordes suaves y desenfocados para ejemplos del uso de este efecto. Ten en cuenta que «[-motion-blur](https://imagemagick.org/command-line-options/#motion-blur)» puede verse afectado muy negativamente por los efectos de borde. | Lo empeora el hecho de que «[-motion-blur](https://imagemagick.org/command-line-options/#motion-blur)» actualmente no entiende el uso de «[-channel](https://imagemagick.org/command-line-options/#channel)» para limitar sus efectos a canales específicos.
---|---
|
magick -size 70x70 xc:none -virtual-pixel edge \
-fill yellow -stroke red -strokewidth 3 -draw 'circle 45,55 35,45' \
-channel RGBA -motion-blur 0x12+65 vp_motion.png
magick -size 70x70 xc:none -virtual-pixel transparent \
-fill yellow -stroke red -strokewidth 3 -draw 'circle 45,55 35,45' \
-channel RGBA -motion-blur 0x12+65 vp_motion_2.png
magick -size 70x70 xc:none -virtual-pixel background -background blue \
-fill yellow -stroke red -strokewidth 3 -draw 'circle 45,55 35,45' \
-channel RGBA -motion-blur 0x12+65 vp_motion_3.png
Efectos de implosión de los píxeles virtuales
Aquí tienes algunos ejemplos más interesantes de diversas implosiones de valor grande (>1.0) usando distintos ajustes «-virtual-pixel».
for v in edge tile mirror dither random gray; do
for i in 2 5 10 50 500; do \
magick koala.gif -virtual-pixel $v \
-implode $i implode_${v}_${i}.gif
done
done
La naturaleza «punteada» de los resultados anteriores es consecuencia directa del «muestreo interpolado» directo que usa el operador «-implode». Véase Búsqueda interpolada directa. Esto puede cambiar en una versión futura de IM, usando remuestreo por área. Por ahora tendrás que usar una técnica de supermuestreo para mejorar los resultados. El ajuste «edge» es el ajuste más habitual y predeterminado que se usa, para evitar la mayoría de los efectos extraños. Los demás (excepto «background») producen en esencia un patrón replicado a partir de los píxeles existentes en la imagen, y los efectos son muy variables. Ten en cuenta también cómo el argumento requiere un aumento exponencial de tamaño para aumentos similares de los efectos. Asimismo, para argumentos mayores de unos 200, puede aparecer un círculo negro en el centro de la imagen resultante. Esto se debe a que se alcanza el límite matemático de la computadora. Usar valores tan grandes es un efecto que no te recomendamos.
Manchas aleatorias de color sólido
Desenfocando un lienzo «plasma:fractal» y reduciendo después los colores a valores muy bajos, puedes producir imágenes simples que contienen áreas aleatorias de distintos colores. Sin embargo, los resultados son muy variables según el número final de colores solicitado y el ajuste de píxel virtual (véase más arriba). En este experimento tenía dos opciones para la imagen aleatoria inicial: una imagen de plasma fractal y una imagen de ruido aleatorio. La imagen aleatoria, por su naturaleza, produce una imagen que (con un ajuste «[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)» «tile») puede crear una imagen más teselable. Mientras que la imagen de plasma tiende a crear bordes de tipo rectangular en sus manchas de color. Por otro lado, la imagen de plasma produce manchas, o gotas, de color pastel bastante agradables, mientras que la imagen aleatoria tiende a producir tonos horribles de gris medio. Por eso elegí usar la imagen de plasma para estos experimentos.
magick -size 80x80 plasma:fractal -normalize spot_start.gif
#magick -size 80x80 xc: +noise Random \
# -virtual-pixel tile -blur 0x5 -normalize spot_start.gif
for n in 2 3 4 5; do
for v in edge mirror tile white black; do
magick spot_start.gif -virtual-pixel $v -blur 0x10 \
+dither -colors $n spot${n}_${v}.gif
done
done
Las tres primeras imágenes tienen efectos muy específicos sobre cómo interactúan las «manchas» de color con los bordes de la imagen. «Edge» y «Mirror» tienden a hacer que los colores se unan a los bordes en ángulos de 90 grados. Un ajuste «Random» o «Dither» tiene una adherencia similar, pero más fuerte, de las gotas de color a los bordes de la imagen, aunque ambos también introducen algunos efectos de borde nítidos cerca de los bordes de la imagen. Puede que se necesite un segundo ciclo de desenfoque-cuantización para limpiar y suavizar los bordes de las manchas. El ajuste «Tile» tiende a permitir que las manchas se enrollen alrededor de la imagen. Sin embargo, como la imagen de plasma de origen no es teselable en sí misma, el resultado es un cambio general de color cerca del borde rectangular. Si se usara como origen la imagen aleatoria teselable, las manchas de color ignorarían por completo los bordes de la imagen. Al usar un ajuste de píxel virtual de fondo «White» o «Black», las manchas de color tienden a centrarse en la imagen propiamente dicha. Lo bien que se produzca este «centrado» depende de cuán diferente fuera la imagen aleatoria original respecto al «color de fondo» usado. El tamaño del «[-blur](https://imagemagick.org/command-line-options/#blur)» afecta básicamente al tamaño y la suavidad de las gotas. Un desenfoque pequeño produce muchas manchas pequeñas; un desenfoque grande, como el que usamos arriba, produce una única mancha de color más circular.
También puedes producir un conjunto de colores e interacciones completamente distinto usando un espacio de color de cuantización de color diferente. Por ejemplo, aquí repito el último ejemplo de arriba (reducir a 5 colores), pero uso algunos espacios de color «[-quantize](https://imagemagick.org/command-line-options/#quantize)» más inusuales para la selección de color. (Véase Cuantización de color y espacio de color)
Recuerda que todas las imágenes anteriores se generaron a partir de la misma imagen de origen aleatorizada. Los distintos efectos que ves son el resultado de las distintas formas de reducir el número de colores de la imagen. Puedes ver cómo el ajuste «[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)», que define cómo ve blur las áreas más allá de los límites de la imagen, tiene una fuerte influencia en las formas de las áreas de color.
Uso del argumento de Annotate
La versión 6 de IM proporcionó una nueva opción de línea de comandos para dibujar texto, «[-annotate](https://imagemagick.org/command-line-options/#annotate)», que evita el antiguo método «[-draw](https://imagemagick.org/command-line-options/#draw)» para usar directamente la API Annotate(). Esto ofrece algunas funciones nuevas a los usuarios de la línea de comandos. Para este ejemplo elijo la fuente Arial Black, por su letra recta, de modo que la rotación quede bastante clara. |
magick -font ArialB -pointsize 24 -gravity center \
-size 55x55 xc:white -annotate 0x0+0+0 'Text' \
annotate_source.jpg
**-annotate {_SlewX_}x{_SlewY_}+{_X_}+{_Y_} 'Text String' **
El desplazamiento X e Y de lo anterior es la posición del texto anotado que se va a dibujar, afectada por la gravity. En cambio, SlewX y SlewY representan una forma de rotación. Si ambos valores son iguales, se realiza una rotación normal. Pero si difieren, pueden producirse efectos muy interesantes…
Como puedes ver, algunos de los argumentos dieron como resultado que no se dibujara ningún texto, básicamente cuando el texto se habría dibujado todo en una sola línea. Esto es de esperar. Sin embargo, puedes ver que podemos dibujar el texto volteado vertical y horizontalmente, rotado, en cursiva, de toda clase de formas. Un operador de imagen de lo más útil.
Splice: creación de un nuevo operador de imagen
Justo después de la primera publicación de la versión 6 de ImageMagick, surgió una discusión en respuesta a una pregunta. La pregunta tenía que ver con añadir espacio adicional (filas y columnas) en medio de una imagen. El ejemplo de abajo es el complejo conjunto de comandos que resultó de esa discusión, usando la potente magia de la versión 6 de IM, y detallaba exactamente qué debía hacerse. A partir de este ejemplo se creó el operador «[-splice](https://imagemagick.org/command-line-options/#splice)» (para más detalles, véanse los ejemplos en Insertar y recortar filas y columnas en imágenes). Por tanto, esta línea de comandos es la operación que define este nuevo comando, y ambos deberían funcionar exactamente de la misma manera. |
magick rose: -size 20x10 xc:blue -background blue \
\( -clone 0 -crop 40x0 +repage +clone -insert 1 +append \) \
-swap 0,-1 +delete +repage \
\( -clone 0 -crop 0x30 +repage +clone -insert 1 -append \) \
-delete 0 -delete 0 +repage splice_rose_seq.gif
![[IM Output]](../static/img/misc/splice_rose_seq.gif)
En el ejemplo anterior dividimos la rosa en muchos cortes verticales y luego insertamos una imagen de separación en esa secuencia, antes de volver a unirlas todas. Básicamente, añadimos una columna vertical de píxeles a la imagen de la rosa. Después, reemplazando nuestra imagen original por la modificada, repetimos las mismas operaciones, pero en horizontal. Una pequeña limpieza de las imágenes de trabajo y listo. Este ejemplo también puso de relieve ante la lista de correo la utilidad del nuevo manejo ordenado de la línea de comandos y de las operaciones de secuencia de imágenes de la versión 6 de ImageMagick. En versiones antiguas de IM, esto habría requerido un gran número de comandos separados e imágenes temporales para lograr el mismo resultado.
Border, Frame y el uso de BorderColor
Hay un debate sobre si «[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)» solo debería usarse para añadir un borde a las imágenes con «[-border](https://imagemagick.org/command-line-options/#border)» o «[-frame](https://imagemagick.org/command-line-options/#splice)». Es decir, muchos usuarios piensan que no debería usarse para establecer el fondo detrás de imágenes con transparencia. Por ejemplo, en IM esto establece las áreas transparentes de la imagen de la estrella al «[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)» e ignora por completo el ajuste de color «[-background](https://imagemagick.org/command-line-options/#background)». |
magick star.gif -bordercolor LimeGreen -background Gold \
-border 10 star_border.gif
![[IM Output]](../static/img/misc/star_border.gif)
La razón principal por la que «[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)» se usa para establecer el fondo de las imágenes transparentes es que esto hace que «magick montage» quede bien cuando se le da un conjunto aleatorio de imágenes que podrían contener transparencias, con ajustes mínimos por parte del usuario. |
magick montage star.gif -frame 6 -geometry '64x64+5+5>' star_montage.gif
![[IM Output]](../static/img/misc/star_montage.gif)
Si se conservara la transparencia, los resultados de «magick montage» de arriba no se verían ni de lejos tan bien. Eso no significa que no puedas conservar la transparencia de las imágenes al usar los operadores «[-border](https://imagemagick.org/command-line-options/#border)» o «[-frame](https://imagemagick.org/command-line-options/#splice)». Solo significa que necesitas proporcionar un ajuste «[-compose](https://imagemagick.org/command-line-options/#compose)» adicional para indicarle a IM que conserve la transparencia. |
magick star.gif -bordercolor LimeGreen \
-compose Copy -border 10 star_border_copy.gif
magick montage star.gif -bordercolor LimeGreen \
-compose Copy -background None -frame 6 \
-geometry '64x64+0+0>' star_montage_copy.gif
![[IM Output]](../static/img/misc/star_border_copy.gif)
![[IM Output]](../static/img/misc/star_montage_copy.gif)
Para más información sobre cómo conservar el fondo transparente de una imagen al añadir un «[-border](https://imagemagick.org/command-line-options/#border)» o «[-frame](https://imagemagick.org/command-line-options/#splice)», véase añadir bordes, y para «magick montage», véase ejemplos de manejo del fondo y la transparencia en montage. Una alternativa que se ha sugerido era establecer el fondo del área de la imagen en estos operadores al color «[-background](https://imagemagick.org/command-line-options/#background)», pero esto interfiere con su uso en «magick montage». Por supuesto, siempre puedes eliminar la transparencia de la imagen tú mismo antes de añadir cualquier marco o borde adicional. En ese caso, el uso de «-compose Copy» se vuelve irrelevante. |
magick montage star.gif -background Gold -alpha remove \
-frame 6 -geometry '64x64+5+5>' -size 16x16 \
-bordercolor LimeGreen -background SeaGreen \
star_montage_texture.gif
![[IM Output]](../static/img/misc/star_montage_texture.gif)
Es mucho más fácil usar un ajuste «[-compose](https://imagemagick.org/command-line-options/#compose)» para conservar la transparencia, en lugar de que el borde la conserve y cause otros problemas. Puede que no resulte obvio para los usuarios nuevos, pero de eso tratan precisamente estas páginas de ejemplos.
Prueba de operadores de lista
Todos los comandos siguientes deberían producir exactamente la misma imagen, pero todas las imágenes se producen de formas ligeramente distintas, lo que demuestra los nuevos operadores de lista de imágenes de la versión 6 de IM. |
magick eye.gif news.gif storm.gif +append list_test_01.gif
magick \( \) eye.gif news.gif storm.gif +append list_test_02.gif
magick eye.gif news.gif storm.gif \( \) +append list_test_03.gif
magick \( eye.gif news.gif storm.gif \) +append list_test_04.gif
magick \( eye.gif news.gif storm.gif +append \) list_test_05.gif
magick eye.gif \( news.gif storm.gif +append \) +append list_test_06.gif
magick \( eye.gif news.gif +append \) storm.gif +append list_test_07.gif
magick \( storm.gif -flop \) \( news.gif -flop \) \( eye.gif -flop \) \
+append -flop list_test_08.gif
magick \( eye.gif -rotate 90 \) \( news.gif -rotate 90 \) \
\( storm.gif -rotate 90 \) -append -rotate -90 list_test_09.gif
magick eye.gif tree.gif news.gif storm.gif -delete 1 \
+append list_test_10.gif
magick eye.gif tree.gif news.gif storm.gif -delete -3 \
+append list_test_11.gif
magick eye.gif news.gif storm.gif tree.gif +delete \
+append list_test_12.gif
magick news.gif storm.gif eye.gif +insert +append list_test_13.gif
magick eye.gif storm.gif news.gif -insert 1 +append list_test_14.gif
magick news.gif eye.gif storm.gif -swap 0,1 +append list_test_15.gif
magick storm.gif news.gif eye.gif -swap 0 +append list_test_16.gif
magick eye.gif storm.gif news.gif +swap +append list_test_17.gif
magick eye.gif storm.gif news.gif \( -clone 1 \) \
-delete 1 +append list_test_18.gif
magick eye.gif -negate \( +clone -negate \) news.gif storm.gif \
-delete 0 +append list_test_19.gif
magick storm.gif news.gif eye.gif \( -clone 2,1,0 \) \
-delete 2,1,0 +append list_test_20.gif
magick storm.gif news.gif eye.gif \( -clone 2-0 \) \
-delete 0-2 +append list_test_21.gif
magick {balloon,medical,present,shading}.gif -delete 0--1 \
{eye,news,storm}.gif +append list_test_22.gif
magick balloon.gif -delete 0,0,0,0,0,0,0,0,0 \
eye.gif news.gif storm.gif +append list_test_23.gif
magick eye.gif balloon.gif news.gif storm.gif \
-delete 1,1,1,1,1 +append list_test_24.gif
magick {balloon,medical,present,shading}.gif {eye,news,storm}.gif \
-delete 0--4 +append list_test_25.gif
magick eye.gif news.gif storm.gif \
-delete 0--4 +append list_test_26.gif
magick storm.gif news.gif eye.gif -reverse +append list_test_27.gif
![[IM Output]](../static/img/misc/ip_color_integer.jpg)
![[IM Output]](../static/img/misc/ip_color_nearest.jpg)
![[IM Output]](../static/img/misc/ip_color_blend.jpg)
![[IM Output]](../static/img/misc/ip_color_average.jpg)
![[IM Output]](../static/img/misc/ip_color_average9.jpg)
![[IM Output]](../static/img/misc/ip_color_average16.jpg)
![[IM Output]](../static/img/misc/interpolate_bilinear.jpg)
![[IM Output]](../static/img/misc/interpolate_catrom_edge.jpg)
![[IM Output]](../static/img/misc/interpolate_catrom_white.jpg)
![[IM Output]](../static/img/misc/interpolate_catrom_black.jpg)
![[IM Output]](../static/img/misc/interpolate_spline_edge.jpg)
![[IM Output]](../static/img/misc/interpolate_spline_white.jpg)
![[IM Output]](../static/img/misc/interpolate_spline_black.jpg)
![[IM Output]](../static/img/misc/ip_area_bilinear_white.jpg)
![[IM Output]](../static/img/misc/ip_area_mesh_white.jpg)
![[IM Output]](../static/img/misc/ip_area_catrom_white.jpg)
![[IM Output]](../static/img/misc/ip_area_spline_white.jpg)
![[IM Output]](../static/img/misc/ip_area_bilinear_black.jpg)
![[IM Output]](../static/img/misc/ip_area_mesh_black.jpg)
![[IM Output]](../static/img/misc/ip_area_catrom_black.jpg)
![[IM Output]](../static/img/misc/ip_area_spline_black.jpg)
![[IM Output]](../static/img/misc/virtual_white.gif)
![[IM Output]](../static/img/misc/virtual_gray.gif)
![[IM Output]](../static/img/misc/virtual_bgnd.gif)
![[IM Output]](../static/img/misc/virtual_checker_2.gif)
![[IM Output]](../static/img/misc/perspective_dither.gif)
![[IM Output]](../static/img/misc/vp_blur.png)
![[IM Output]](../static/img/misc/vp_blur_4.png)
![[IM Output]](../static/img/misc/vp_motion.png)
![[IM Output]](../static/img/misc/vp_motion_2.png)
![[IM Output]](../static/img/misc/vp_motion_3.png)
![[IM Output]](../static/img/misc/implode_edge_2.gif)
![[IM Output]](../static/img/misc/implode_tile_2.gif)
![[IM Output]](../static/img/misc/implode_mirror_2.gif)
![[IM Output]](../static/img/misc/implode_dither_2.gif)
![[IM Output]](../static/img/misc/implode_random_2.gif)
![[IM Output]](../static/img/misc/implode_gray_2.gif)
![[IM Output]](../static/img/misc/implode_edge_5.gif)
![[IM Output]](../static/img/misc/implode_tile_5.gif)
![[IM Output]](../static/img/misc/implode_mirror_5.gif)
![[IM Output]](../static/img/misc/implode_dither_5.gif)
![[IM Output]](../static/img/misc/implode_random_5.gif)
![[IM Output]](../static/img/misc/implode_gray_5.gif)
![[IM Output]](../static/img/misc/implode_edge_10.gif)
![[IM Output]](../static/img/misc/implode_tile_10.gif)
![[IM Output]](../static/img/misc/implode_mirror_10.gif)
![[IM Output]](../static/img/misc/implode_dither_10.gif)
![[IM Output]](../static/img/misc/implode_random_10.gif)
![[IM Output]](../static/img/misc/implode_gray_10.gif)
![[IM Output]](../static/img/misc/implode_edge_50.gif)
![[IM Output]](../static/img/misc/implode_tile_50.gif)
![[IM Output]](../static/img/misc/implode_mirror_50.gif)
![[IM Output]](../static/img/misc/implode_dither_50.gif)
![[IM Output]](../static/img/misc/implode_random_50.gif)
![[IM Output]](../static/img/misc/implode_gray_50.gif)
![[IM Output]](../static/img/misc/implode_edge_500.gif)
![[IM Output]](../static/img/misc/implode_tile_500.gif)
![[IM Output]](../static/img/misc/implode_mirror_500.gif)
![[IM Output]](../static/img/misc/implode_dither_500.gif)
![[IM Output]](../static/img/misc/implode_random_500.gif)
![[IM Output]](../static/img/misc/implode_gray_500.gif)
![[IM Output]](../static/img/misc/spot2_edge.gif)
![[IM Output]](../static/img/misc/spot2_mirror.gif)
![[IM Output]](../static/img/misc/spot2_tile.gif)
![[IM Output]](../static/img/misc/spot2_white.gif)
![[IM Output]](../static/img/misc/spot2_black.gif)
![[IM Output]](../static/img/misc/spot3_edge.gif)
![[IM Output]](../static/img/misc/spot3_mirror.gif)
![[IM Output]](../static/img/misc/spot3_tile.gif)
![[IM Output]](../static/img/misc/spot3_white.gif)
![[IM Output]](../static/img/misc/spot3_black.gif)
![[IM Output]](../static/img/misc/spot4_edge.gif)
![[IM Output]](../static/img/misc/spot4_mirror.gif)
![[IM Output]](../static/img/misc/spot4_tile.gif)
![[IM Output]](../static/img/misc/spot4_white.gif)
![[IM Output]](../static/img/misc/spot4_black.gif)
![[IM Output]](../static/img/misc/spot5_edge.gif)
![[IM Output]](../static/img/misc/spot5_mirror.gif)
![[IM Output]](../static/img/misc/spot5_tile.gif)
![[IM Output]](../static/img/misc/spot5_white.gif)
![[IM Output]](../static/img/misc/spot5_black.gif)
![[IM Output]](../static/img/misc/spot_RGB_edge.gif)
![[IM Output]](../static/img/misc/spot_RGB_mirror.gif)
![[IM Output]](../static/img/misc/spot_RGB_tile.gif)
![[IM Output]](../static/img/misc/spot_RGB_white.gif)
![[IM Output]](../static/img/misc/spot_RGB_black.gif)
![[IM Output]](../static/img/misc/spot_YIQ_edge.gif)
![[IM Output]](../static/img/misc/spot_YIQ_mirror.gif)
![[IM Output]](../static/img/misc/spot_YIQ_tile.gif)
![[IM Output]](../static/img/misc/spot_YIQ_white.gif)
![[IM Output]](../static/img/misc/spot_YIQ_black.gif)
![[IM Output]](../static/img/misc/spot_HSL_edge.gif)
![[IM Output]](../static/img/misc/spot_HSL_mirror.gif)
![[IM Output]](../static/img/misc/spot_HSL_tile.gif)
![[IM Output]](../static/img/misc/spot_HSL_white.gif)
![[IM Output]](../static/img/misc/spot_HSL_black.gif)
![[IM Output]](../static/img/misc/spot_XYZ_edge.gif)
![[IM Output]](../static/img/misc/spot_XYZ_mirror.gif)
![[IM Output]](../static/img/misc/spot_XYZ_tile.gif)
![[IM Output]](../static/img/misc/spot_XYZ_white.gif)
![[IM Output]](../static/img/misc/spot_XYZ_black.gif)
![[IM Output]](../static/img/misc/spot_OHTA_edge.gif)
![[IM Output]](../static/img/misc/spot_OHTA_mirror.gif)
![[IM Output]](../static/img/misc/spot_OHTA_tile.gif)
![[IM Output]](../static/img/misc/spot_OHTA_white.gif)
![[IM Output]](../static/img/misc/spot_OHTA_black.gif)
![[IM Output]](../static/img/misc/annotate_source.jpg)
![[IM Output]](../static/img/misc/annotate_montage.jpg)
![[IM Output]](../static/img/misc/list_test_01.gif)
![[IM Output]](../static/img/misc/list_test_02.gif)
![[IM Output]](../static/img/misc/list_test_03.gif)
![[IM Output]](../static/img/misc/list_test_04.gif)
![[IM Output]](../static/img/misc/list_test_05.gif)
![[IM Output]](../static/img/misc/list_test_06.gif)
![[IM Output]](../static/img/misc/list_test_07.gif)
![[IM Output]](../static/img/misc/list_test_08.gif)
![[IM Output]](../static/img/misc/list_test_09.gif)
![[IM Output]](../static/img/misc/list_test_10.gif)
![[IM Output]](../static/img/misc/list_test_11.gif)
![[IM Output]](../static/img/misc/list_test_12.gif)
![[IM Output]](../static/img/misc/list_test_13.gif)
![[IM Output]](../static/img/misc/list_test_14.gif)
![[IM Output]](../static/img/misc/list_test_15.gif)
![[IM Output]](../static/img/misc/list_test_16.gif)
![[IM Output]](../static/img/misc/list_test_17.gif)
![[IM Output]](../static/img/misc/list_test_18.gif)
![[IM Output]](../static/img/misc/list_test_19.gif)
![[IM Output]](../static/img/misc/list_test_20.gif)
![[IM Output]](../static/img/misc/list_test_21.gif)
![[IM Output]](../static/img/misc/list_test_22.gif)
![[IM Output]](../static/img/misc/list_test_23.gif)
![[IM Output]](../static/img/misc/list_test_24.gif)
![[IM Output]](../static/img/misc/list_test_25.gif)
![[IM Output]](../static/img/misc/list_test_26.gif)
![[IM Output]](../static/img/misc/list_test_27.gif)