⚠️ Este es un sitio de traducción no oficial, sin relación con ImageMagick Studio LLC. Para información autorizada, consulte la página original (https://usage.imagemagick.org/masking/index.html).

ImageMagick Ejemplos -- Máscaras

ImageMagick Ejemplos: prefacio e índice
Canal alfa (mate)

(En construcción) En estos ejemplos veremos el tratamiento especial de la transparencia, el canal de transparencia, el uso de máscaras y, en última instancia, la eliminación de fondos no deseados u otros elementos como carteles, texto o spam.


Canal alfa

El canal de transparencia (alfa) de una imagen es completamente opcional y a menudo requiere un tratamiento especial, aparte de los canales de "color" normales. Véase Espacio de color de la imagen más arriba. La existencia de un canal de transparencia también puede afectar a cómo los distintos operadores tratan los demás canales de color, generalmente porque un color totalmente transparente debería ignorarse por completo en una operación. Si no fuera así, obtendrías "halos negros" alrededor de las imágenes, como ocurría en los errores importantes de IM en los primeros días de IM v6. Por ejemplo, el Resize Halo Bug y el Blur with Transparency Bug. Para colmo, a este canal también se le llama a veces el canal de "transparencia" o de "opacidad" de la imagen, o incluso la "máscara" de la imagen. Sin embargo, todos se refieren al mismo cuarto canal especial de la imagen. [IM Output] Para explicar la diferencia necesitamos una imagen de ejemplo con la que trabajar, y para ello usaré una imagen PNG de una "luna creciente" (de un ejemplo de composición CopyOpacity). Como puedes ver, esta imagen tiene muchas zonas completamente transparentes. No solo eso, sino que tuve que guardar la imagen con el formato 'PNG', uno de los pocos formatos de imagen que entiende y maneja correctamente los colores transparentes y semitransparentes. Puedo demostrar esta transparencia superponiendo la imagen sobre el patrón de tablero de ajedrez integrado en IM, usando composición alfa. |

    magick composite -compose Dst_Over -tile pattern:checkerboard \
              moon.png  moon_background.jpg

[IM Output]

Canal alfa interno

Internamente, IM v7 almacena la información de transparencia en un canal "alfa", que, al igual que el canal de color, no es más que una imagen en escala de grises cuyos valores van del blanco, para totalmente transparente (o claro), al negro, para totalmente opaco. Es algo parecido a lo que obtendrías si miraras la silueta de la imagen original. Los operadores de bajo nivel como "[-level](https://imagemagick.org/command-line-options/#level)" y "[-threshold](https://imagemagick.org/command-line-options/#threshold)" tratan los datos como alfa. Consulta la referencia oficial de opciones si tienes dudas.


Creado: 10 de diciembre de 2003 (originalmente 'channels')
Actualizado: 2 de octubre de 2018
Autor: Anthony Thyssen, Anthony.Thyssen@gmail.com
Ejemplos generados con: [version image]
URL: https://usage.imagemagick.org/masking/

A continuación se muestra una forma muy antigua de extraer los valores de transparencia "alfa" de una imagen. Guarda el canal de transparencia como un archivo en formato de imagen "alfa", y requería dos pasos separados, además de comandos para definir el formato de archivo de imagen correcto. | |

  magick moon.png alpha:moon.matte

  magick MIFF:moon.alpha moon_matte2.png

  # También puedes unir esos dos pasos en una sola tubería…
  magick moon.png alpha:- | magick - moon_matte3.png

[IM Output]
Esta técnica para extraer el "alfa" de una imagen era habitual cuando se usaba IM v5. Básicamente, era el único método disponible para acceder a la transparencia de una imagen. Hoy en día se usa muy raramente.

Controlar la transparencia de la imagen

Hay dos operadores que te dan control de bajo nivel sobre el canal de transparencia de una imagen en memoria. Los métodos del operador más reciente "[-alpha](https://imagemagick.org/command-line-options/#alpha)" son ahora el método de control recomendado, aunque muchos IM Examples todavía muestran y usan el operador más antiguo "-matte". Una imagen no solo puede tener datos en el canal alfa, sino que también dispone de un "interruptor" que define si los datos del canal son visibles o válidos. Esto significa que las imágenes pueden tener tres estados respecto al canal alfa. Interruptor Datos del canal
alpha off sin datos alfa (no se ha reservado memoria)
alpha deactivate datos alfa antiguos presentes (pero sin uso)
alpha on datos alfa actualmente en uso
Hay que recordar esto, porque el comportamiento de los distintos métodos depende de en cuál de esos tres estados se encontrara la imagen. Si el "interruptor" está apagado, los operadores no tocarán los datos alfa, ya que en realidad podrían no existir en absoluto. En ese caso, podría quedar alfa antiguo, sin modificar y, por tanto, desactualizado. Como verás, esto en realidad resulta útil en algunas situaciones. Ten en cuenta, no obstante, que algunos operadores pueden activar o desactivar automáticamente el interruptor alfa por una u otra razón. Por ejemplo, "-compose CopyOpacity -composite" siempre activará el canal alfa en la imagen resultante, ya que la función del operador es copiar datos en un canal alfa. Por tanto, debe existir en el resultado final. Sin embargo, su existencia en los datos de entrada puede tener otras consecuencias. Véase Método de composición Copy_Opacity para más detalles. De forma similar, crear un lienzo con el color "None" también creará y habilitará automáticamente el canal de transparencia, para asegurar que la imagen en blanco sea realmente transparente. En cambio, crear un lienzo con cualquier otro nombre de color generalmente no creará ningún canal de transparencia, ya que las imágenes son opacas por defecto.
A continuación se muestran los distintos métodos de "[-alpha](https://imagemagick.org/command-line-options/#alpha)" y ejemplos de cómo afectan a las imágenes y a su transparencia.

Alpha Off o "-alpha off"

Esto es simplemente un interruptor en la imagen que desactiva cualquier efecto que la transparencia tenga sobre ella. En realidad no elimina ni destruye el canal alfa asociado a la imagen, solo anula cualquier efecto que ese canal tenga sobre la imagen. Del mismo modo, ningún operador afectará al canal alfa asociado mientras esté desactivado. Por ejemplo, usemos la imagen de la "luna creciente" (de un ejemplo de composición CopyOpacity) y simplemente desactivemos el canal alfa de la imagen.

  magick moon.png  -alpha off     alpha_off.png

[IM Output] [IM Output]

Observa que la forma de la luna desapareció por completo al desactivar la transparencia, aunque en realidad eso rara vez ocurre. Básicamente, incluso las zonas "transparentes" tienen color, que normalmente no es visible; en este caso, el color oculto era la imagen de lienzo fractal que se usó para crear la imagen de la luna. Este color oculto puede ser cualquier cosa, desde un simple color de transparencia GIF, que el formato GIF usa para representar la transparencia en su tabla de colores, hasta colores basura que quedaron durante la creación de la imagen, como aquí. Lo más típico es que el color de transparencia sea simplemente negro puro para cualquier píxel que fuera totalmente transparente. Ten en cuenta que los píxeles cercanos al borde pueden ser semitransparentes y, por tanto, conservar un color válido que solo es parcialmente visible. La operación "[-alpha](https://imagemagick.org/command-line-options/#alpha) Off" anterior se limitará a "desactivar" o "apagar" el canal. Los datos de transparencia en sí no se han borrado ni eliminado de los datos de imagen almacenados en memoria. Siguen presentes, solo que no disponibles por el momento. Pero… Si la imagen se guarda mientras los datos de transparencia están desactivados, ninguno de esos datos se guardará en el archivo de imagen. Por tanto, los datos alfa desactivados no estarán presentes en la copia guardada de la imagen, aunque sí lo estén (solo que desactivados) en la versión en memoria. Además, como muchos formatos de archivo no admiten transparencia (como JPEG), esos formatos hacen automáticamente el equivalente a un "[-alpha](https://imagemagick.org/command-line-options/#alpha) Off" al guardar la imagen (sin hacerlo realmente). Por lo general, esto hace que todas las zonas transparentes se vuelvan negras al guardarlas como imagen JPEG. Véase Alpha Remove: eliminar la transparencia más abajo para conocer la forma correcta de eliminar la transparencia antes de guardar en formato JPEG. El operador "[+alpha](https://imagemagick.org/command-line-options/#alpha)" es un comando más antiguo que hace exactamente lo mismo que "-alpha Off". Es decir, simplemente desactiva el canal de transparencia. Ten en cuenta que desactivar el alfa suele ser necesario antes de usar una imagen de máscara en escala de grises con el método de composición alfa CopyOpacity. Si no lo haces, el operador de composición copiará la transparencia activada (canal de opacidad) en lugar de usar los colores en escala de grises previstos.

Alpha Set o "-alpha set"

El método alfa "Set" es igual que la opción más antigua "[-alpha on](https://imagemagick.org/command-line-options/#alpha)". Garantiza que la imagen tenga un canal de "transparencia" o alfa, pero si no estaba presente o estaba desactivado, lo inicializa como totalmente opaco (véase el método Alpha Opaque más abajo). Sin embargo, si la imagen ya tiene un canal alfa presente y activado, no hará nada. Dicho de otro modo, este operador garantiza que haya un canal alfa presente, sin modificar el aspecto de la imagen tal como está actualmente en memoria. Por eso, por sí solo, este operador no muestra ningún cambio en la imagen, pero tiene efectos reales cuando se combina con otros operadores. Así, si desactivas el canal alfa con Alpha Off y luego lo vuelves a habilitar con Alpha Set, la imagen tendrá un canal alfa, pero será totalmente opaco, tal como se veía la imagen cuando se solicitó la operación "Set". |

  magick moon.png  -alpha off    -alpha set    alpha_set.png

[IM Output]
Si se aplica a una imagen que ya tiene un canal alfa activado, no se realiza ningún cambio. |

  magick moon.png  -alpha set    alpha_noset.png

[IM Output]
En resumen, este operador nunca debería cambiar el aspecto de la imagen en el momento en que se aplica. Solo garantiza que el canal alfa quede configurado de modo que la imagen permanezca tal cual. Se usa normalmente después de leer imágenes desde un formato de archivo o una fuente de entrada desconocidos, que pueden tener o no un canal alfa presente. Este operador asegura entonces que la imagen tenga un canal alfa (para formatos como JPEG), pero dejando intacto cualquier canal alfa existente y activado (como en los formatos GIF o PNG). Esta es la forma recomendada de garantizar que una imagen tenga un canal alfa tras leerla en memoria o, más importante aún, después de procesar una imagen cuando quieres volver a habilitar un canal alfa limpio.

Alpha On

El método "[-alpha](https://imagemagick.org/command-line-options/#alpha) On" es exactamente lo contrario del método Alpha Off visto antes. Normalmente es demasiado simplista para lo que buscas y, por tanto, debería usarse muy RARA vez. En casi todos los casos deberías usar "[-alpha Set](#alpha_set)". Básicamente, el método "On" solo cambia el interruptor para que los datos de transparencia de la imagen vuelvan a ser visibles. Los datos de transparencia existentes no se modifican, así que si la imagen en memoria todavía tiene datos alfa antiguos, esos datos volverán a hacerse visibles de repente. Por ejemplo, aquí desactivamos "Off" los datos de transparencia y luego los reactivamos de inmediato "On", reproduciendo la imagen original. |

  magick moon.png  -alpha off  -alpha on    alpha_on.png

[IM Output]
Sin embargo, si la imagen no tiene (todavía) datos alfa previos, los inicializará como totalmente opacos. Que es lo lógico. Por tanto, para imágenes nuevas recién leídas en memoria, equivale a Alpha Set, pero no debería usarse con ese fin. El único momento en que debería usarse Alpha On es cuando previamente, y deliberadamente, desactivaste el alfa por algún motivo y ahora deseas restaurar esos datos. Por ejemplo, desactivar y luego reactivar el canal alfa puede servir para preservar los datos del canal alfa antes de aplicar ciertos operadores muy específicos, como "[-shade](https://imagemagick.org/command-line-options/#shade)". Para ver un ejemplo de este uso especial, consulta Imágenes de formas sombreadas.

Alpha Activate/Deactivate

habilita y deshabilita el canal alfa, respectivamente, de forma persistente. Es como on/off en Imagemagick 6. En Imagemagick 7, -alpha off eliminará el canal alfa de forma permanente, de modo que -alpha on no podrá volver a habilitarlo.

Alpha Discrete

trata el canal alfa de forma independiente (no lo mezcla).

Alpha Opaque

Este método no solo garantiza que el canal alfa esté "activo", sino que además sea completamente opaco, independientemente de que la imagen tuviera la transparencia "activada/on" o "desactivada/off". Por ejemplo…

|

  magick moon.png  -alpha opaque    alpha_opaque.png

[IM Output]
En versiones más antiguas de IM, esto equivalía a usar tanto "[-alpha off](https://imagemagick.org/command-line-options/#alph)" para desactivar el canal alfa como "[-alpha on](https://imagemagick.org/command-line-options/#alpha)" para volver a activarlo, restableciéndolo como opaco. |

  magick moon.png  -alpha off -alpha on  alpha_opaque_matte.png

[IM Output]
La "forma" original de la imagen ya no puede recuperarse tras esta operación, porque los datos del canal alfa original se han sobrescrito. Por supuesto, eso también equivale a usar "-alpha off -alpha set", aunque en ese caso bien podrías usar simplemente "-alpha opaque".

Alpha Transparent

De forma similar, esto garantiza que el canal alfa esté "activo", pero además totalmente transparente. |

  magick moon.png  -alpha transparent    alpha_transparent.png

[IM Output]
Los datos de color de la imagen siguen presentes, así que desactivar la transparencia después volverá a mostrar los colores existentes de la imagen. |

  magick moon.png  -alpha transparent  -alpha off  alpha_transparent_off.png

[IM Output]
Por supuesto, la "forma" original de la imagen quedó destruida, así que ya no puede recuperarse tras esta operación. En Lienzo transparente se presentan otras formas de hacer que una imagen sea totalmente transparente.

Alpha Extract

El método "Extract" simplemente copia la máscara "alfa" de la imagen como una máscara de canal en escala de grises.

  magick moon.png  -alpha extract    alpha_extract.png

[IM Output] [IM Output]

Observa que totalmente opaco es blanco, mientras que totalmente transparente es negro puro. Como la imagen contenía algunos píxeles semitransparentes a lo largo de los bordes (para el suavizado, que da a la forma de la imagen un aspecto más uniforme), esta imagen no es blanco y negro puro, sino que también contiene algunos píxeles de color gris alrededor de los bordes. Si tu ImageMagick es una versión antigua de IMv7, esta es una técnica (casi) equivalente, que usa la extracción de canal.

  magick moon.png  -channel a -separate +channel -negate alpha_extract.png

El método "[Extract](#alpha_extract)" también desactivará "[Off](#alpha_extract)" el alfa, pero no lo borra, así que volver a activar "[On](#alpha_extract)" el canal alfa recreará una máscara de forma de la imagen original. |

  magick moon.png  -alpha extract -alpha on   alpha_extract_on.png

[IM Output]
Observa que todos los colores originales se habrán reemplazado por blanco, con distintos tonos de gris alrededor de los bordes. Podemos verlo si eliminamos la transparencia con un fondo blanco (véase el método Alpha Remove más abajo). |

  magick alpha_extract_on.png -background white -alpha remove alpha_edge.png

[IM Output]
Estos píxeles "grises" se aprovechan, de hecho, en Contornos de borde a partir de formas suavizadas para generar un borde o contorno suave a partir de la forma de una imagen. Este efecto secundario de guardar el canal alfa tiene ventajas particulares al usar el operador Shade, que no entiende ni usa el canal alfa de una imagen. Véase la subsección Enmascarar formas sombreadas.

Alpha Copy

El método "Copy" es lo contrario de "[Extract](#alpha_extract)" y básicamente realiza una CopyOpacity contra sí mismo. Es decir, convierte una imagen en escala de grises (tenga o no habilitado su canal alfa) en una imagen de máscara de forma.

  magick alpha_extract.png  -alpha copy   alpha_copy.png

[IM Output] [IM Output]

No importa si la imagen tenía o no un canal alfa existente; lo único que hace es crear la transparencia de la imagen a partir de los valores en escala de grises de la imagen. Una vez que tienes una máscara de forma, puedes usar varios métodos de tinte de color o de composición alfa Duff-Porter para colorearla. Para ver ejemplos del uso de una máscara de forma, consulta Máscaras como formas de color.

Alpha Shape

Para facilitar el uso de una imagen en escala de grises, el método "Shape" no solo crea una máscara de forma (igual que Alpha Extract), sino que además la colorea con el color de fondo actual.

  magick alpha_extract.png -background Yellow -alpha shape   alpha_shape.png

[IM Output] [IM Output]

Esto significa que puedes colorear muy rápidamente una máscara en escala de grises con solo dar forma a la imagen y luego aplanarla sobre un color de fondo distinto. |

  magick alpha_extract.png -background Yellow -alpha shape \
                            -background Blue   -alpha remove alpha_colormask.png

[IM Output]
| En realidad, el color de fondo no es el color adecuado para esta operación de coloreado de "shape". Debería usar el color de "relleno" (fill) para establecer el color de primer plano de la forma. Por eso, es probable que cambie qué color se usa. Aquí se usa el de fondo solo por dificultades internas para acceder al color de relleno actual. Es probable que este cambio se produzca como parte de IMv7.
---|---
Por supuesto, una forma más rápida y mejor de asignar una imagen en blanco y negro directamente a colores específicos es usar el más especializado Ajuste de niveles por color. Esto evita la necesidad de habilitar o siquiera modificar el canal de transparencia existente de la imagen. |

  magick alpha_extract.png  +level-colors Blue,Yellow   level_color.png

[IM Output]
| Lo anterior asignará los colores usando un espacio de color lineal, y puede que en algún momento necesites convertirlo a sRGB para obtener un degradado de colores más correcto visualmente.
---|---

Alpha Remove

El método "[-alpha](https://imagemagick.org/command-line-options/#alpha) **Remove**" (añadido en IMv6.7.5) está diseñado para eliminar la transparencia de una imagen, usando el "[-background](https://imagemagick.org/command-line-options/#background)" actual. |

  magick moon.png  -background tan  -alpha remove  alpha_remove.png

[IM Output]
Observa que, aunque la transparencia se "elimina", el canal alfa permanecerá activado, pero ahora será totalmente opaco. Si ya no necesitas el canal alfa, puedes usar Alpha Off para desactivarlo. Esta operación es simple y rápida, y hace su trabajo sin necesitar memoria adicional ni otros efectos secundarios que puedan asociarse a técnicas alternativas de eliminación de transparencia. Por eso es la forma preferida de eliminar la transparencia de una imagen. Para otras técnicas, o si tu ImageMagick es anterior a la v6.7.5, consulta la explicación más amplia de Eliminar la transparencia de las imágenes) más abajo.

Alpha Background

A partir de IM v6.5.2-10, se introdujo un método "Background" que establece el color oculto de los píxeles totalmente transparentes al color de fondo actual. Normalmente este color es irrelevante, ya que solo puede verse si el canal alfa está desactivado. Sin embargo, el color de los píxeles totalmente transparentes se guarda en el formato de imagen PNG, y para imágenes grandes, tener colores totalmente transparentes aleatorios y desconocidos puede afectar significativamente al manejo de su compresión. Véase PNG con mejor compresión y la discusión del foro de IM Eliminating alpha channel garbage para más detalles. Ten en cuenta que no se aplica ninguna mezcla de colores, solo una asignación directa de color a cualquier color totalmente transparente. Sin embargo, los píxeles seguirán siendo totalmente transparentes, así que no verás ningún cambio en la imagen. Por ejemplo, aquí lo uso para fijar todos los píxeles totalmente transparentes a "HotPink". |

  magick moon.png -background HotPink -alpha Background moon_hotpink.png

[IM Output]
Como puedes ver, esto no cambió en absoluto el aspecto real de la imagen. Para ver el cambio, ahora desactivaremos el canal alfa. |

  magick moon_hotpink.png -alpha off moon_hotpink_off.png

[IM Output]

Esto no es lo mismo queEliminar la transparencia

Los bordes de la forma habrán hecho opacos todos los píxeles semitransparentes y, como resultado, habrán producido fuertes efectos de aliasing (bordes en escalera). Ten en cuenta que incluso el formato PNG24, normalmente solo opaco, puede guardar transparencia booleana si todos los colores totalmente transparentes son iguales. Para más detalles, consulta el ejemplo en Subformatos de PNG. Este proceso de reemplazo de colores es, en realidad, casi lo mismo que hacer un "-channel RGB -fill _color_ -opaque None +channel". Véase Reemplazo directo de color. Ten en cuenta que muchos otros operadores de procesamiento de imagen también convertirán cualquier píxel totalmente transparente a negro totalmente transparente (color "None"), ya que es el equivalente en color de un cero matemático. A continuación se resumen algunas operaciones de imagen que se sabe que hacen esto, aunque ninguna es tan directa ni tan rápida como usar este operador.

  magick moon.png \( +clone -alpha off \) \
                        -compose SrcIn   -composite   moon_black.png
  magick moon.png -channel RGBA  -blur 1x.000000001  moon_black.png
  magick moon.png -channel RGBA   -gaussian 1x0      moon_black.png
  magick moon.png -fuzz 0% -transparent none         moon_black.png

Ese último método (véase Factor de difuminado y colores transparentes) es especialmente útil, porque no solo puedes fijar todos los colores transparentes a negro totalmente transparente ("None"), sino también todos los colores casi totalmente transparentes (que, por lo demás, tienen un color válido pero prácticamente invisible), con solo especificar un factor de difuminado. Producirá cierta pérdida de datos, pero puede mejorar la compresión en imágenes con muchos colores casi totalmente transparentes. A menudo estos píxeles casi totalmente transparentes tienen colores muy raros o erróneos, y este método te permite eliminar esos píxeles extraños antes de que causen otros problemas.

Eliminar la transparencia de las imágenes

Mientras que Alpha Off simplemente acciona un interruptor y desactiva el canal de transparencia, también puedes conseguir el mismo efecto si intentas guardar la imagen en un formato de archivo que no admita el uso de transparencia. Por ejemplo, guardando en JPEG…

  magick -size 70x60 xc:none -font Candice -pointsize 50 \
          -fill Black -annotate +10+45 'A' -channel RGBA  -blur 0x5 \
          -fill white -stroke black -draw "text 5,40 'A'"   a.png

  magick a.png  a.jpg

[IM Output] [IM Output]

Recuerda que el formato de archivo JPEG no guarda el canal alfa (transparencia) y, por tanto, simplemente lo desactivó. En este caso, las partes transparentes simplemente se volvieron negras (un resultado típico). Pero, según el origen de la imagen, las zonas transparentes podrían haberse vuelto fácilmente de algún otro color aleatorio o inapropiado. Además, en muchos casos los píxeles semitransparentes pueden tener colores muy raros que normalmente no se ven porque son casi completamente transparentes. Con solo desactivar la transparencia, estos píxeles destacarán como un grano en la nariz, haciendo que el resultado se vea aún peor de lo que cabría esperar. Mira, por ejemplo, los bordes superior izquierdo de la 'A' de arriba. En cualquier caso, simplemente desactivar la transparencia NO suele ser lo que se quiere. La mejor solución es usar el método Alpha Remove para reemplazar de forma rápida y sencilla la transparencia por un color de fondo de base… |

  magick a.png   -background skyblue  -alpha remove -alpha off a_remove.jpg

[IM Output]
Estrictamente hablando, Alpha Off no es necesario en este caso, ya que guardar en JPEG lo hace automáticamente.
Otras técnicas para eliminar la transparencia consisten en generar de algún modo una nueva imagen de "fondo" o "lienzo" y componer con Over tu imagen sobre ese fondo, de modo que la transparencia se reemplace. Preferiblemente, conservando los metadatos de la imagen original, como perfiles, etiquetas, leyendas y comentarios que pueda contener. En Crear lienzos de imagen del mismo tamaño se muestran métodos para generar dicho lienzo. Aquí tienes uno de esos métodos… |

  magick a.png \( +clone -alpha opaque -fill SkyBlue -colorize 100% \) \
          +swap -geometry +0+0 -compose Over -composite  \
          -alpha off  a_compose.jpg

[IM Output]
Otras formas más sencillas de hacerlo son usar una operación que cree internamente un "lienzo de fondo clonado" por ti, generándolo como parte de la operación de procesamiento de imagen más amplia que realiza el operador. El método más común es Aplanar la imagen. Este operador se usa tan a menudo con este propósito que al proceso de eliminar la transparencia se le ha llamado erróneamente "aplanar". Por ejemplo… |

  magick a.png   -background skyblue -flatten  -alpha off  a_flatten.jpg

[IM Output]
Sin embargo, esto no funcionará con "[mogrify](basics.html#mogrify)" ni con una secuencia de varias imágenes, básicamente porque el operador "[-flatten](https://imagemagick.org/command-line-options/#flatten)" está realmente diseñado para fusionar varias imágenes en una sola. El otro método común que sí funciona con varias imágenes es dar a la imagen un borde de tamaño cero con el "[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)" adecuado. Por ejemplo… |

  magick a.png   -bordercolor skyblue -border 0  -alpha off  a_border.jpg

[IM Output]
Otros operadores de procesamiento de imagen muy relacionados con los métodos anteriores también pueden eliminar la transparencia de una imagen. Entre ellos: Mosaic, Merge y Frame. El operador Extent también puede usarse, y te permite expandir o recortar imágenes al mismo tiempo que eliminas la transparencia, pero solo si conoces el tamaño de la imagen final que deseas. No tienes por qué reemplazar la transparencia con un color sólido. Si usas una composición casera (como se mostró antes), puedes usar cualquier imagen como fondo de reemplazo. Un ejemplo sencillo de esto es usar el comando "[composite](basics.html#composite)" para embaldosar una imagen "debajo" de la original (usando Dst_Over). Este método de composición garantiza que se conserven los metadatos y el tamaño de la imagen original. |

  magick composite -compose Dst_Over -tile pattern:checkerboard \
                                               a.png  a_undertile.jpg

[IM Output]
| _Muchos de los métodos anteriores se ven afectados por la información del lienzo virtual que pueda tener una imagen, o pueden destruirla, como parte de su procesamiento. Cuando interviene el lienzo virtual, puede que necesites examinar más de cerca los detalles de cada operador. En muchos casos, los efectos del lienzo virtual pueden ser útiles para tu procesamiento de imagen en conjunto.

_
---|---

Transparencia alfa booleana

Para algunos formatos de archivo de imagen no necesitas eliminar por completo el canal alfa, sino solo permitir una transparencia puramente on/off o booleana. Los formatos de archivo de imagen indexados (paleta), como GIF y PNG8, son típicos de esto. Por ahora estos ejemplos se tratan en Transparencia booleana de GIF, pero con el tiempo deberían trasladarse aquí.

Transparencia de contorno o halo

A veces querrás añadir un contorno alrededor de una imagen que contiene transparencia. Una forma es usar Morfología EdgeOut para obtener rápidamente todos los píxeles vecinos a la imagen original, colorearlos y luego componer por debajo (DstOver) con la imagen original.

  magick knight.png \( +clone \
             -channel A -morphology EdgeOut Diamond +channel \
             +level-colors red \
           \) -compose DstOver -composite    knight_outlined.png

[IM Output] [IM Output]

Esto puede ser especialmente útil al crear imágenes en formato GIF a partir de imágenes PNG que contienen píxeles de borde semitransparentes. Proporciona una cantidad mínima de color de fondo, pero deja el resto de la imagen totalmente transparente. Véase GIFs sobre un patrón de fondo para más información sobre este problema. Un método alternativo es generar un halo suave y semitransparente alrededor de la forma. Para ello, desenfocamos y recoloreamos la imagen, y luego volvemos a componerla por debajo (DstOver) con la original. |

    magick knight.png \(  +clone \
              -channel A  -blur 0x2.5 -level 0,50% +channel \
              +level-colors red \
            \) -compose DstOver  -composite    knight_halo.png

[IM Output]
Esto último es, en realidad, parecido a usar un efecto de fuente compuesta de contorno suave, pero usando una imagen con forma en lugar de texto anotado.


Usar máscaras con imágenes

Enmascarar una imagen

Como se mostró antes, hay un par de formas de enmascarar una imagen para hacer transparente parte de ella. Y el método que elijas depende de si tu máscara de imagen es una máscara en escala de grises o una máscara de forma.

Editar una máscara de imagen

La máscara de una imagen es algo muy útil. Por ejemplo, podemos borrar partes de una imagen muy fácilmente modificando una máscara de la imagen original. Recuerda que el operador "[-draw](https://imagemagick.org/command-line-options/#draw)" no puede dibujar nada y actualmente no tiene una opción de borrado. Aquí creamos una imagen y luego, extrayendo y modificando su máscara, la restauramos en la imagen original.

  magick -size 100x100 xc:none   -stroke black  -fill steelblue \
          -strokewidth 1   -draw "circle 60,60 35,35" \
          -strokewidth 2   -draw "line 10,55 85,10"      drawn.png

  magick drawn.png -alpha extract  mask.png

  magick mask.png -fill black -draw "circle 40,80 60,60" mask_bite.png

  magick drawn.png mask_bite.png \
          -alpha Off -compose CopyOpacity -composite \
          drawn_bite.png

[IM Output] [IM Output] [IM Output] [IM Output]

Recuerda que "negro" en una máscara es transparente, mientras que blanco es opaco, así que lo único que necesitamos hacer es dibujar negro sobre todo lo que no queramos que sea visible. No olvides la operación "-alpha Off" anterior, ya que es vital para garantizar que la imagen en escala de grises no contenga un canal de transparencia innecesario. Y voilà, le dimos un mordisco a la imagen original. También podemos volver a añadir una parte de la imagen que eliminamos. Por ejemplo, aquí vuelvo a añadir parte del "mordisco" que quité de la imagen original, dibujando una zona blanca sobre la máscara. La máscara se devuelve entonces de nuevo a la imagen original usando Composición de canal CopyOpacity.

  magick mask_bite.png -fill white \
          -draw "circle 50,70 60,60" \
          -draw "roundRectangle  78,5 98,25 5,5" \
          -alpha off  mask_bite2.png
  magick composite -compose CopyOpacity mask_bite2.png drawn.png drawn_bite2.png

[IM Output] [IM Output] [IM Output]

Solo una advertencia sobre volver a añadir partes. Normalmente, ImageMagick reemplaza cualquier color totalmente transparente por negro, por lo general porque así funcionan las matemáticas que hay detrás de los operadores. Al fin y al cabo, es totalmente transparente y, por tanto, su color no debería importar normalmente. Eso significa que si hacemos opaca una parte de la imagen que no habíamos dibujado antes, generalmente será negra, ya que ese es el color que hay bajo la transparencia de la imagen. Sin embargo, en el ejemplo anterior habrás notado que el formato de archivo de imagen PNG conservó correctamente el color original (hecho transparente) de la imagen. Por eso el color de la parte vuelta a añadir mantuvo el color "SteelBlue" original de la imagen. No deberías contar con esto si la imagen se guardó en algún otro formato de archivo o se modificó posteriormente.
Aquí tienes un método alternativo para borrar partes de una imagen pero, en lugar de extraer y modificar una máscara en escala de grises, usamos una máscara de forma como una especie de herramienta de "borrado", usando el Método de composición DstOut.

  magick -size 100x100 xc:none -draw "circle 40,80 60,60" mask_shape.png

  magick drawn.png mask_shape.png -compose DstOut -composite drawn_bite3.png

[IM Output] [IM Output] [IM Output]

Como puedes ver, a veces las máscaras de forma son más fáciles de manejar, ya que evitas la necesidad de extraer y restaurar el canal alfa. Sin embargo, los Métodos de composición alfa Duff-Porter, que es lo que estoy usando, nunca te permitirán restaurar colores que se hayan hecho transparentes. Con estos métodos, cualquier cosa que se haya hecho transparente (y por tanto con color indefinido) permanece transparente. De hecho, borrar partes de una imagen usando Métodos de composición alfa destruirá el color subyacente de los píxeles totalmente transparentes. No lo conservará. Al fin y al cabo, ¡un color transparente no es realmente un color!

Máscaras como formas de color

Una alternativa a usar la máscara solo para añadir o volver a añadir transparencia a una imagen es combinar realmente la máscara directamente con las imágenes de diversas formas. Por ejemplo, supongamos que solo queremos usar una máscara como un símbolo o forma que queremos superponer sobre una imagen en distintos colores. Para esto necesitamos una máscara, que extraeré de una fuente especial de "símbolos". |

  magick -font WebDings -pointsize 24 label:Y \
          +trim +repage  -negate   heart_mask.gif

[IM Output]
Observa que negué la imagen de la etiqueta para convertirla en una imagen de máscara adecuada, formada por un primer plano blanco (opaco) sobre un fondo negro (transparente). A partir de IM v6.4.3-7, la forma más sencilla de convertir una máscara en escala de grises en una forma de color es usar el operador Alpha Shape. Es exactamente como Alpha Copy, pero con un paso adicional para colorear la forma final. |

  magick heart_mask.gif  -background Red -alpha Shape  heart_red.png

[IM Output]
| Observa el uso del formato de imagen 'PNG' para la imagen con forma generada, en lugar de GIF, para evitar problemas con laTransparencia booleana de GIF.
---|---
Antes de esto, la solución más sencilla era negar la máscara alfa convirtiéndola en una imagen de canal mate y luego usar Combine para generar la imagen con forma. |

  magick heart_mask.gif -negate  \
          -background Gold  -channel A  -combine   heart_gold.png

[IM Output]
El color de la máscara con forma en este caso lo define el color "[-background](https://imagemagick.org/command-line-options/#background)" que Combine usó para rellenar los canales indefinidos de la nueva imagen. Una forma más antigua pero más complicada es usar el método de composición "[CopyOpacity](compose.html#copyopacity)" para establecer la transparencia de una imagen según la máscara dada, y luego usar Tinte de color uniforme para colorear la forma resultante. Esto funciona y, durante mucho tiempo, fue la mejor técnica que usar, pero ya no se recomienda. |

  magick heart_mask.gif \( +clone \) -alpha off \
          -compose CopyOpacity  -composite \
          -fill HotPink  -colorize 100%    heart_hotpink.png

[IM Output]
Ahora que tienes una imagen "con forma", puedes simplemente superponerla sobre cualquier fondo que quieras, como la imagen de la rosa integrada, usando una de las muchas técnicas de capas de imagen y métodos de composición alfa. |

  magick rose: -page +2+2  heart_gold.png \
                 \( +clone -repage +7+29 \)  \
                 \( +clone -repage +52+14 \)  \
          -flatten       rose_with_love.gif

[IM Output]
Esto está bien si queremos todos nuestros símbolos del mismo color, pero requeriría varias imágenes intermedias si quisiéramos usar varios colores, lo que lo hace poco práctico para superponer muchos símbolos con muchos colores diferentes. Una forma de crear superposiciones multicolor es recolorear la imagen con forma inmediatamente después de leer la imagen. |

  magick rose: \(  heart_gold.png           -repage +2+2   \) \
          \( +clone -fill Red     -colorize 100% -repage +7+29 \) \
          \( +clone -fill HotPink -colorize 100% -repage +52+14 \) \
          -flatten      rose_colored_love.gif

[IM Output]
Observa que solo leemos una imagen con forma y luego recoloreamos un clon de esa imagen por cada nueva "capa" que se vaya a superponer. Para más ejemplos de recoloreado de una imagen base, consulta toda la sección sobre Modificaciones de color. Véase también Dibujar símbolos para un método alternativo de marcar ubicaciones específicas en una imagen. Así como un ejemplo de capas con chinchetas de mapa para técnicas de capas más automatizadas.

Composición matemática

En lugar de superponer la máscara sobre algún fondo, puede que solo te interese colorear la imagen únicamente con las partes blancas o negras de la propia máscara. Esto es relativamente sencillo: basta con usar algunos métodos de composición alfa matemáticos para cambiar el color de la máscara y que coincida con un color, un mosaico u otra imagen. Por ejemplo, el método de composición "[Multiply](compose.html#multiply)" reemplazará las zonas blancas (valor de multiplicación 1) con la imagen superpuesta, dejando las zonas negras (valor de multiplicación 0) en negro. El operador "[Screen](compose.html#screen)" es exactamente igual que "[Multiply](compose.html#multiply)", pero con las imágenes negadas, de modo que en la práctica reemplaza las zonas negras de la imagen. Por ejemplo, usemos la imagen de máscara más grande de antes para superponer una imagen mayor generada con un patrón de mosaico.

  magick mask_bite.png -size 100x100   tile:tile_disks.jpg \
                        -compose Multiply  -composite   compose_multiply.png
  magick mask_bite.png -size 100x100   tile:tile_water.jpg  \
                        -compose Screen    -composite   compose_screen.png

[IM Output] [IM Output] [IM Output]

El método de composición alfa "[Multiply](compose.html#multiply)" es especialmente útil para reemplazar el fondo de imágenes de texto (es decir, texto negro sobre fondo blanco), como las imágenes generadas a partir de documentos PostScript.

Composición alfa con máscara

La forma especial de tres imágenes de la Composición alfa con máscara te permite usar la misma máscara para fusionar directamente dos imágenes. |

  magick -size 100x100   tile:tile_water.jpg  tile:tile_disks.jpg \
           mask_bite.png    -composite   compose_masked.png

[IM Output]
La primera imagen reemplazará las partes negras del fondo de la máscara, mientras que la segunda imagen reemplaza las partes blancas del primer plano de la máscara. La máscara en sí se da como tercera imagen. La máscara se usa para seleccionar y mezclar dos imágenes distintas y generar el resultado final. En realidad, es bastante parecido a una mezcla (Blend) mapeada de las dos imágenes. Recuerda que el tamaño final y los metadatos de la imagen resultante provendrán de la primera imagen de "fondo" de la operación anterior (partes negras), así que intercambia las imágenes y niega la máscara si lo quieres al revés. Y, por último, recuerda que si usas el comando "[composite](basics.html#composite)" en lugar de "[convert](basics.html#convert)", la imagen de "superposición" (partes blancas) se da primero y la imagen de "fondo" (partes negras) en segundo lugar. Dicho de otro modo, las dos primeras imágenes deben intercambiarse para ese comando.

Alinear dos imágenes con máscara

En construcción

Sobre alinear dos imágenes con máscara…

Si tus máscaras son puramente booleanas, no deberías tener problemas, las
apliques como las apliques.  Sin embargo, las máscaras con bordes "suavizados",
"grises" o "semitransparentes" para darles un "aspecto suave" pueden ser un grave
dolor de cabeza si no las manejas correctamente y con cuidado.

El resto de esta explicación trata sobre las máscaras "suavizadas".

Las máscaras suavizadas que se unen vienen en dos estilos…

 * Las que encajan entre sí como piezas de un rompecabezas O
   como una clavija con forma en un agujero con forma (frontera compartida)

 * Máscaras que están pensadas para superponerse sobre una zona sólida (en capas)

Esta última es fácil de manejar y es el efecto normal que obtienes cuando
superpones alguna forma de color sobre una imagen totalmente opaca.  En esencia,
usarías la composición 'over' para componer la forma.

Las máscaras tipo 'rompecabezas' anteriores, en cambio, son más difíciles.  Esas
máscaras no están pensadas para solaparse ni para quedarse cortas entre sí.  Y
sin embargo, si intentas unirlas usando la composición 'over' obvia y normal,
acabarás con una unión semitransparente donde se fusionan los 'bordes suavizados'.

_Ejemplo de una mala unión de 'máscara de rompecabezas' (over)_

La forma correcta de unir máscaras e imágenes 'de rompecabezas' con forma es usar
la composición **Plus** para 'sumar' las imágenes, con un fondo
negro o totalmente transparente.

_Ejemplo de una unión correcta de 'máscara de rompecabezas' (plus)_


Para ver otro ejemplo de unión casera de imágenes, usando composición 'Dst-In',
'Dst-Out' y 'Plus', consulta los ejemplos en…
  https://usage.imagemagick.org/compose/#dstin

También repaso este detalle de la unión en el informe de error de la composición
alfa de 3 imágenes [Composite Mask Bug
- Fixed](https://usage.imagemagick.org/bugs/composite_mask/#correct).

Para más información sobre la diferencia entre 'over' y 'plus', consulta ['Blend' (plus) vs 'Dissolve' (over)](compose.html#blend_dissolve)

En [Cubos 3D - Afín](distorts.html#cube3d), y de nuevo en [Cajas 3D - Perspectiva](distorts.html#box3d),
se muestran ejemplos de unión correcta de piezas alineadas por los bordes,
y también en Cubo isométrico mediante cizallas
  https://usage.imagemagick.org/warping/#sheared_cube

El mayor problema en estos ejemplos es que las piezas individuales NO se
generaron usando la misma máscara, sino que se distorsionaron hasta sus
posiciones finales.  Por eso no encajan del todo bien al unirse.

Estos ejemplos deben actualizarse para usar un método de composición 'Plus'.  Para
generar mejores resultados, aunque incluso entonces probablemente sigan sin quedar
del todo 'bien', ya que las máscaras no 'encajan' exactamente entre sí.

Generar máscaras alineadas por los bordes correctas

La mejor idea es usar la misma máscara (negada) para AMBAS piezas, en lugar de
intentar dibujar las dos máscaras por separado. De lo contrario, las dos máscaras
se solapan, O dejan un hueco, exactamente como has visto.

Métodos correctos de unión de máscaras…

    * usa la máscara para fijar la transparencia de una pieza
      usa la máscara negada para fijar la transparencia de la otra pieza
      'suma' (Plus) las dos piezas.

    * Usa la máscara para añadir transparencia a una sola pieza, y luego
      compón con 'Over' esa pieza sobre una imagen completa.

    * usa una composición con máscara de tres imágenes
      consulta https://usage.imagemagick.org/compose/#mask
      y https://usage.imagemagick.org/masking/#masked_compose
      que usa la máscara para seleccionar resultados de dos imágenes distintas.

Recuerda que 'Over' solo necesita que se enmascare la imagen 'fuente' o 'de
superposición'; la imagen de fondo no debería tener bordes semitransparentes
alineados.  Pero una composición 'plus' necesita que ambas imágenes se enmascaren
con una máscara exactamente negativa la una de la otra para alinear el borde de unión.

ADVERTENCIA:  ¡¡¡¡Draw NO permite actualmente generar dos formas que encajen
correctamente entre sí sin solaparse!!!!

Consulta [Draw Fill Bounds](draw.html#bounds) para más detalles.

No he comprobado si SVG tiene el mismo problema.

Máscaras de imagen especiales

Máscaras de escritura: proteger píxeles de cambios

Una máscara de 'escritura' o 'clip-mask' es una imagen especial en escala de grises que se añade a una imagen existente del mismo tamaño. Define zonas de la imagen que la mayoría de los operadores de procesamiento de imagen deben tratar como 'inmutables' o 'no escribibles'. El operador "[-mask](https://imagemagick.org/command-line-options/#mask)" toma una imagen externa para vincularla a las imágenes en memoria. La forma 'plus' del operador "[+mask](https://imagemagick.org/command-line-options/#mask)" elimina la máscara de la imagen. Por ejemplo, aquí uso una 'máscara de escritura' para proteger los píxeles del fondo de que se escriba sobre ellos, mientras roto los tonos para recolorear la rosa roja del primer plano y convertirla en una rosa azul.

  magick rose: -mask rose_bg_mask.png \
          -modulate 110,100,33.3  +mask rose_blue.png

[IM Output] [IM Output] [IM Output]

La máscara es un poco tosca, pero funcionó bien. Solo recuerda que una 'máscara de escritura' se usa para especificar la parte que se va a proteger o preservar. Recuerda, en IMv7…

El operador "[-mask](https://imagemagick.org/command-line-options/#mask)" define una máscara de 'protección contra escritura'

Para un ejemplo más avanzado, consulta Enmascarado por croma (Chroma Key), que trata más sobre generar la máscara que sobre aplicarla como máscara de escritura. Las máscaras de escritura o de recorte están diseñadas para funcionar cuando los píxeles de una imagen se modifican directamente. Por ejemplo: negate, level, tinte de color, modulate, dibujo, composite, morfología, convoluciones. Para los operadores que generan imágenes NUEVAS (resize, distorsiones, extent, etc.) no logrará preservar los píxeles originales, ya que la máscara no podrá corresponder al nuevo tamaño de la imagen. Esas operaciones también tendrán el efecto secundario de eliminar o anular la 'máscara de escritura' de la imagen. Aquí tienes otro ejemplo…

  magick -size 70x70 xc:red  red_image.png
  magick -size 70x70 xc: -draw 'circle 35,35 30,5'  write_mask.png

  magick red_image.png  -mask write_mask.png \
          -fill blue -opaque red   +mask    masked_color_replace.png

[IM Output] [IM Output] [IM Output]

Observa que los bordes tanto de la máscara como de la imagen resultante son suaves (suavizados); eso se debe a que la máscara no es simplemente una máscara booleana, sino una máscara de mezcla. La 'máscara de escritura' es una máscara de mezcla en el sentido de que los píxeles 'grises' de la máscara producirán una mezcla de los nuevos píxeles con los valores antiguos de la imagen, según la cantidad de gris presente. Esto produce bordes muy suaves y además te permite generar un degradado a lo largo de la imagen entre las zonas modificadas y las no modificadas. Sin embargo, una máscara de mezcla, aunque adecuada para una sola operación, puede no ser buena cuando se usa para varias operaciones, ya que su efecto de mezcla se aplicará entonces varias veces. Este problema es especialmente frecuente en una operación en bucle como la morfología. Pero solo si usas una máscara de mezcla no booleana. Si esto supone un problema, probablemente sea mejor realizar simplemente todas las operaciones contra una copia de la imagen y luego usar Composición alfa con máscara contra la imagen original. Se recomienda precaución.
¡Este uso del enmascarado es, en realidad, exactamente cómo funciona el Enmascarado de composición! Pero solo mientras se aplica el operador de composición.

  magick -size 70x70 xc:green  green_image.png

  magick red_image.png  green_image.png  write_mask.png \
          -composite    masked_composite.png

[IM Output] [IM Output] [IM Output] [IM Output]

Es equivalente (con una máscara negada) a… |

  magick write_mask.png  -negate -write MPR:mask +delete \
          red_image.png -mask MPR:mask \
          green_image.png  -composite  +mask  masked_composite_equiv.png

[IM Output]
Es decir, la máscara se niega y luego se aplica a la primera imagen 'de destino'. La segunda se compone entonces sobre la primera imagen, modificando solo las zonas 'blancas' de la imagen de máscara original.

Una operación "[-composite](https://imagemagick.org/command-line-options/#composite)" de tres imágenes usa una máscara de 'escritura'

En morfología, las máscaras de escritura se usan normalmente para generar una forma de Morfología condicional o restringida de una operación. Uno de esos ejemplos se trató en el foro de discusión de IM, Cleaning up noise around text, para limitar los efectos de una dilatación. NOTA: -crop debería poder preservar la máscara de imagen de las imágenes individuales, recortando también la máscara y asignándola a las nuevas imágenes. Sin embargo, esto no se hace actualmente.

Máscara de recorte y trazados de recorte

La forma "[-clip-mask](https://imagemagick.org/command-line-options/#clip-mask)" de este operador es casi exactamente igual que la anterior, pero solo proporciona un estilo de enmascarado booleano (todo o nada). Por ello, no puedes lograr un resultado 'mezclado' o suavizado. Por ejemplo… |

  magick red_image.png  -clip-mask write_mask.png \
          -fill blue -opaque red   +clip-mask    clipped_modulate.png

[IM Output]
Como puedes ver, el resultado tiene mucho aliasing (con bordes en escalera), ya que una "[-clip-mask](https://imagemagick.org/command-line-options/#clip-mask)" no produce un resultado mezclado como sí lo hace "[-mask](https://imagemagick.org/command-line-options/#mask)". Lo único bueno de esto es que es ligeramente más rápido (aunque no mucho). Se proporcionó originalmente para permitir el manejo de trazados de recorte en archivos de imagen TIFF y es un operador muy antiguo (IMv5). En su lugar debería usarse el operador más reciente "[-mask](https://imagemagick.org/command-line-options/#mask)". | _En IMv7, una 'máscara de escritura' y una 'máscara de recorte' se implementan en paralelo, aunque técnicamente realizan exactamente la misma función. Por eso podrías aplicar ambas máscaras simultáneamente.

Sin embargo, usar ambas al mismo tiempo no se recomienda, y los resultados no están definidos. Además, esta forma de 'máscara booleana' se ha eliminado de IMv7.

_
---|---

Trazados de recorte para imágenes TIFF

Un 'trazado de recorte' es parte del formato de archivo de imagen TIFF y define un trazado vectorial que se usa para definir una 'zona con forma' dentro de la imagen TIFF. En IM, los operadores "[-clip](https://imagemagick.org/command-line-options/#clip)" y "[-clip-path](https://imagemagick.org/command-line-options/#clip-path)" leen este 'clip-path' y lo convierten en una máscara de recorte (más arriba). Por tanto, define una 'máscara de escritura' que protegerá la forma de modificaciones. Un trazado de recorte almacenado en la imagen TIFF se define como un Dibujo de trazado SVG, que puedes extraer de un archivo de imagen TIFF usando…

  magick identify -format '%[8BIM:1999,2998:#1]' image_clip.tiff

El mayor problema que suele tener la gente es hacer transparente todo lo que no está recortado. ¡Lo que requiere que escribas las zonas que la máscara protege contra escritura! Esta es una solución, que convierte toda la imagen en transparente, luego activa el 'trazado de recorte' y después vuelve a hacer opacas (visibles) las partes ahora escribibles.

  magick input.tiff -alpha transparent -clip -alpha opaque -strip out.tiff

El operador "[+clip](https://imagemagick.org/command-line-options/#clip)" también desactiva y elimina la máscara de recorte (igual que hace "[+clip_mask](https://imagemagick.org/command-line-options/#clip_mask)"). Sin embargo, ningún formato de archivo guarda la máscara de recorte actual con la imagen para ningún formato de archivo de imagen. (Al menos en IMv7)

Máscaras de lectura: ignorar la entrada de píxeles

Es importante señalar que una máscara de escritura limitará qué píxeles se escribirán en una imagen. Sin embargo, no limita qué píxeles se 'leen' como parte de la operación que se realiza para crear los nuevos datos de píxel que se van a escribir. Esto significa, básicamente, que si usas un operador de tipo 'efecto de área' o 'de vecindad', como desenfoques, morfología o convolución, entonces los 'píxeles escribibles' cercanos al borde pueden incluir valores de color de la zona enmascarada o no escribible. Por ejemplo, aquí protegemos contra escritura la rosa del primer plano antes de desenfocar la imagen. Es decir, queremos desenfocar solo la parte del fondo de la imagen, bastante intensamente en este caso.

  magick rose: -mask rose_fg_mask.png \
            -blur 0x8   +mask  rose_bg_blur_fail.png

[IM Output] [IM Output] [IM Output]
El resultado usa una máscara de protección contra escritura y no es lo que se buscaba.

Como puedes ver, aunque los colores del primer plano estaban protegidos por la máscara, dichos colores se usaron igualmente como parte del desenfoque del fondo alrededor de la rosa. Por ello, el fondo desenfocado cercano al primer plano tiene un tinte o halo rojizo evidente. Dicho de otro modo, los colores del primer plano se 'filtraron' al fondo circundante. Esto generalmente no es lo que la gente pretende cuando quiere desenfocar el fondo de una imagen, como parte de un efecto de enfoque de lente. Lo que la gente realmente quiere es que el desenfoque 'ignore' por completo los píxeles del primer plano y solo permita que los colores del fondo formen parte del proceso de desenfoque. Es decir, querían impedir que el desenfoque 'leyera' los píxeles del primer plano.

Solución de máscara de lectura para IMv7

En IMv7, la única forma de hacer ilegible el color de un píxel es hacer el píxel transparente. Los píxeles transparentes no tienen color por definición y, por tanto, el 'color oculto' no forma parte de los cálculos que hace la operación de desenfoque. Esto nos da un 'truco'. Hacer transparentes los píxeles del primer plano, aplicar la operación de desenfoque (u otra) y desactivar la transparencia (en este caso, en realidad no se quiere). Luego podemos restaurar la parte del primer plano de la imagen. Si suena complejo, lo es. Aquí están los pasos involucrados, mostrando imágenes intermedias para intentar dejar clara la técnica…

  magick rose: rose_bg_mask.png -alpha off \
          -compose CopyOpacity -composite   +compose  rose_bg_only.png
  magick rose_bg_only.png  -channel RGBA -blur 0x8   rose_bg_blurred.png
  magick rose_bg_blurred.png      -alpha off         rose_bg_blur_opaque.png
  magick rose_bg_blur_opaque.png \
                rose: rose_fg_mask.png -composite    rose_bg_blur_good.png

[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

El resultado es la eliminación del efecto de halo rojo que antes se 'filtraba' al fondo desenfocado. Aquí tienes una comparación lado a lado de las versiones del desenfoque de fondo con máscara de escritura y con máscara de lectura, para que veas claramente cómo eliminamos la 'filtración' del color del primer plano hacia el fondo. [IM Output]
Escritura | [IM Output]
Lectura
---|---
Diferencias entre los métodos de enmascarado
El ejemplo anterior asume que la imagen original no tiene alfa. Si una imagen también contiene un canal alfa, entonces necesitas separar y procesar el alfa por separado, lo que duplica el esfuerzo. Un ejemplo de esto se muestra en una discusión sobre 'distort resize', que quería ignorar los píxeles virtuales que rodean la imagen que se redimensiona usando distort. Véase Redimensionado correcto (usando distorsiones) para más detalles. Ten en cuenta que lo anterior también está muy relacionado con una técnica de relleno de huecos con desenfoque. La única diferencia es que es el fondo lo que se preserva de la modificación, no el primer plano. Lo que lo hace un poco más sencillo. Las verdaderas 'máscaras de lectura' deberían estar disponibles en IMv7 para que lo anterior consista simplemente en añadir tanto una 'máscara de lectura' como, opcionalmente, una 'máscara de escritura'.


Regiones y subimágenes de región

Las regiones son otra forma de limitar los efectos de las operaciones a una zona más pequeña de una imagen. Por ejemplo, aquí aplico un tinte rojo a toda la región rectangular… |

  magick koala.gif  -region 40x33+15+5 -fill red -colorize 50% \
          koala_region_red.gif

[IM Output]
También puedes hacer transparente una región… |

  magick koala.gif -alpha set \
          -region 40x33+15+5 -alpha transparent   koala_region_trans.gif

[IM Output]
Observa que necesité asegurarme de que la imagen original tuviera un canal alfa habilitado antes de hacer transparente la 'imagen de región'. Si no se hubiera hecho, IM habría hecho que cualquier transparencia de la 'imagen de región' fuera transparente hacia el original, y no verías ningún cambio. Véase Cómo funcionan las regiones más abajo para más detalles. | Antes de IM v6.6.9-5, la preservación de la transparencia estaba rota, y el resultado de la transparencia en una región siempre era "ver a través hasta el original". Por eso el resultado de lo anterior no incluiría ningún píxel transparente, aunque la imagen permitiera el uso de transparencia.
---|---
Las mayores razones para usar regiones son que no solo limitan su efecto a una zona pequeña, sino que en realidad extraen esa zona rectangular de la imagen y aplican todas las operaciones simples que siguen a esa zona más pequeña. Esto significa que si solo modificas una zona muy pequeña de una imagen muy grande, por ejemplo eliminando los ojos rojos, no solo limitas el alcance de las operaciones a esa zona, sino que también las realizas mucho más rápido, y la imagen de región extraída es en sí misma más pequeña. En resumen… Una máscara de escritura realizará las operaciones sobre toda la imagen, pero limitará qué píxeles cambian realmente, mientras que las regiones usan una subimagen extraída más pequeña. Ten en cuenta que nada te impide usar ambos métodos a la vez. Aunque si aplicas una máscara de recorte a una región, la máscara de recorte debería coincidir con el tamaño de la imagen de región que se extrajo.

Deformar una región local

Como una 'región de imagen' en realidad extrae una 'pequeña subimagen' del original para procesarla, puedes aprovechar las distorsiones circulares especiales 'localizadas' para deformar regiones pequeñas de la imagen original. Por ejemplo, aquí tenemos una línea de franjas.

  magick -size 600x70 xc:darkred \
          -fill white -draw 'roundrectangle 5,5  595,65 5,5' \
          -fill black -draw 'rectangle 5,25 595,31' \
          -fill red -draw 'rectangle 5,39 595,45' \
          lines.gif

[IM Output]

Ahora, definiendo regiones, podemos distorsionar la línea de distintas maneras en distintas zonas.

  magick lines.gif \
          -region 90x70+10+0    -swirl  400  \
          -region 90x70+100+0   -swirl  400 \
          -region 90x70+190+0   -swirl -400 \
          -region 120x70+280+0  -implode 1.5 \
          -region 100x70+380+0  -implode -7  \
          -region 101x70+480+0  -wave 10x50 -crop 0x70+0+10\! \
          +region lines_regions.gif

[IM Output]

Observa que "-implode" y "-swirl" encajan muy bien con el uso de regiones, ya que tienen la propiedad de que el borde exterior de la imagen distorsionada coincide con el resto de la imagen fuera de la región definida. Es decir, en realidad están diseñados para realizar una 'deformación de imagen localizada'. Observa que cuando usé la distorsión Wave, tuve que recortar el tamaño de la imagen 'wave' resultante para que volviera a encajar en la zona original de la que se extrajo. Recuerda que las regiones solo funcionan cuando se usan con operadores de procesamiento de imagen simples. Cualquier otro operador, incluido otro operador "-region", cancelará el procesamiento de la región antes de que se aplique esa operación.

Cómo funcionan las regiones y sus problemas

En realidad, la forma en que funcionan las regiones es…

  • Extraer de la imagen una imagen más pequeña según el operador "-region", usando un simple recorte con el argumento de la región.
  • Aplicar a la imagen más pequeña cualquier operador de procesamiento de imagen simple que siga.
  • Cuando se ve un operador de imagen no simple, O se encuentra otro operador "-region", O se desactiva la región con "+region", entonces la región extraída se superpone sobre la imagen original en su ubicación de extracción.

Las regiones funcionan de una forma similar a usar operadores de pila de imágenes, aunque existían en ImageMagick mucho antes que esos operadores. Por ejemplo, eran parte integral de la versión 5 de IM. Por ejemplo, si tienes esta operación de región

  ... -region WxH+X+Y  ...operadores-simples... +region ...

el resultado es equivalente a esto (para una sola imagen)…

  ... \( +clone -crop WxH+X+Y ...operadores-simples... \
         \) -geometry +X+Y -composite   ...

O a esto (para varias imágenes)…

  ... \( -clone 0--1 -crop WxH+X+Y ...operadores-simples... \
         null: +insert \) -geometry +X+Y -layer composite ...

La forma en que la 'imagen de región' se superpone realmente sobre la 'imagen original' es un poco delicada… Si la imagen original no tiene habilitado el canal de transparencia, la 'imagen de región' se compone usando composición Over. Eso significa que las zonas transparentes de la imagen de región se volverán transparentes, dejándote ver la imagen original detrás. Por ejemplo, aquí desactivé deliberadamente la transparencia en la imagen original, pero luego roté la región para producir algunas zonas de transparencia en las esquinas. |

  magick koala.gif -alpha off -region 30x30+10+10 \
          -alpha on -background None  -rotate 30  koala_region_rotate_1.gif

[IM Output]
Como puedes ver, las esquinas de la zona rotada (que eran transparentes en la 'imagen de región') muestran la 'imagen original'. Básicamente, como la imagen original no puede manejar la transparencia, la imagen de región simplemente se superpone, con esquinas transparentes. Si la imagen original sí contiene transparencia activa, entonces la transparencia de la imagen de región modificada también puede modificarse, así que la transparencia simplemente se 'copia' tal cual. |

  magick koala.gif -alpha set  -region 30x30+10+10 \
          -background None  -rotate 30    koala_region_rotate_2.gif

[IM Output]
Como puedes ver, IM usa una composición Copy, de modo que cualquier transparencia que exista en la imagen de región también se copiará a la imagen original. Si por alguna razón quieres que la imagen original conserve su transparencia original, desactiva el alfa primero y luego, después de que se haya restaurado la imagen de región, actívalo de nuevo para restaurarla.
Las imágenes de región que se amplían o reducen pueden no 'encajar' de nuevo en el original. Por ejemplo, aquí redimensiono (y coloreo) la imagen de región para que se haga más pequeña… |

  magick koala.gif  -region 30x30+10+10 \
          -resize 75% -fill red -colorize 30%  koala_region_shrink.gif

[IM Output]
Como puedes ver, la región original no quedó cubierta por la imagen de región que se restauró. Por eso, las partes no cubiertas no se reemplazaron. De forma similar, si la región se hace más grande, más parte de la imagen original puede quedar cubierta por la imagen de región superpuesta. |

  magick koala.gif  -region 30x30+10+10 \
          -resize 150% -fill red -colorize 30%  koala_region_enlarge.gif

[IM Output]
En ambos casos, el desplazamiento superior izquierdo de la región no se mueve. No puedes simplemente reducir una imagen de región y centrarla dentro de la zona de la región, ni puedes colocar la imagen de región en otra posición. Hay que tener cuidado para evitar que las imágenes de región cambien de tamaño. Aunque en algunas circunstancias especiales todavía puedes manejar una región redimensionada. Para ver un ejemplo de esto, mira el ejemplo de 'distorsión wave' anterior. | _Al igual que con "[mogrify](basics.html#mogrify)", no puedes fusionar varias subimágenes, ya que eso requiere el uso de una operación de imagen no simple. Sin embargo, puedes usar "[-draw](https://imagemagick.org/command-line-options/#draw)" como método de composición alternativo. Véase Composición alfa en Mogrify para un ejemplo.

_
---|---
| _En el momento de escribir esto, la 'imagen de región' todavía contiene eldesplazamiento del lienzo virtual de recorte de su extracción de la imagen original. Esto puede considerarse o no un error, según te resulte útil esta información o no. El desplazamiento no se usa actualmente cuando se restaura una imagen de región.

Si el desplazamiento no se desea (porque interfiere con un operador como Distort), sigue la opción "[-region](https://imagemagick.org/command-line-options/#region)" con un operador "[+repage](https://imagemagick.org/command-line-options/#repage)" para eliminar el desplazamiento de las imágenes de región. Su eliminación o modificación no afectará a su restauración de vuelta sobre la imagen original.

_
---|---


Eliminación del fondo

Uno de los problemas más comunes en el procesamiento de imágenes es generar una máscara a partir de una imagen existente totalmente opaca. Esas imágenes se descargan habitualmente de la World Wide Web, o las generan programas, o vienen en formatos de imagen que no ofrecen ninguna forma de transparencia. También puede ser que tengas una foto de algún objeto y quieras eliminar el fondo. Recuerda que las fotos no tienen ninguna noción de transparencia, así que tienes que eliminar tú mismo las partes no deseadas. Por desgracia, no existe una solución general a este problema, especialmente cuando además quieres conservar cualquier borde semitransparente de la imagen. En consecuencia, hay cientos de formas y variaciones de hacer esta tarea, todas dependientes de la situación exacta. Muy relacionados con el enmascarado de imágenes están los ajustes de transparencia para que coincidan con el fondo sobre el que se va a superponer una imagen. Esto se trata en detalle como parte de guardar en el formato de archivo de imagen GIF, que solo admite transparencia booleana.

Enmascarar fondos simples (relleno por inundación)

Cuando el fondo de una imagen es un solo color sólido simple, a menudo puedes generar máscaras simples (y eliminar el fondo) con solo reemplazar colores en imágenes. Por ejemplo, aquí tienes un enmascarado directo por relleno por inundación de una imagen con un fondo de color sólido. |

  magick cyclops.png -alpha set -channel RGBA \
          -fuzz 1% -fill none -floodfill +0+0 white \
          cyclops_flood_1.png

[IM Output]
Pues bien, eso no funcionó, ya que el punto 'semilla' del relleno por inundación en la esquina superior derecha ¡en realidad no llega a todas las partes de la imagen! La solución a esto es ampliar la imagen ligeramente, para proporcionar un camino por el que el relleno por inundación pueda alcanzar todos los bordes exteriores de la imagen. Sin embargo, para esto necesitas conocer el color del fondo. |

  magick cyclops.png -bordercolor white -border 1x1 \
          -alpha set -channel RGBA -fuzz 1% \
          -fill none -floodfill +0+0 white \
          -shave 1x1    cyclops_flood_2.png

[IM Output]
Por supuesto, no especificamos un factor de difuminado muy bueno. El problema con esto es que obtienes un halo alrededor del objeto dentro de la imagen. Esto se debe a que la mayoría de las imágenes contienen píxeles especiales a lo largo de los bordes que suavizan el aspecto de la imagen. Sin embargo, como esta imagen tiene un buen borde negro, en relación con el fondo, usar un valor de difuminado bien grande puede servir para separar bien la imagen del fondo. |

  magick cyclops.png -bordercolor white -border 1x1 \
          -alpha set -channel RGBA -fuzz 20% \
          -fill none -floodfill +0+0 white \
          -shave 1x1    cyclops_flood_3.png

[IM Output]
Esta técnica tiene algunos problemas. Primero, es un enmascarado de todo o nada de la imagen, que produce bordes con aliasing, en escalera y a menudo de aspecto horrible. Esto está bien para el limitado formato de archivo de imagen GIF, pero no muy bien si piensas superponer esa imagen sobre otro fondo. También es muy, muy difícil capturar todos los píxeles de borde suavizados. Por eso, si superpongo la imagen anterior sobre un fondo negro, puede que veas algunos píxeles mucho más blancos de lo normal. |

  magick cyclops_flood_3.png -background black -flatten \
          cyclops_flood_3_over.png

[IM Output]
Además, si logras usar un factor de difuminado suficientemente alto, es probable que tengas el problema de quedarte con muy pocos píxeles de borde, o de que se 'filtre' hacia el centro de la imagen. Por último, un relleno por inundación directo como este no funciona para un fondo que no sea un único color sólido simple.

Recortar objetos con borde

Las imágenes con un borde de un solo color tienen una clara ventaja para estos métodos de eliminación del fondo, ya que el borde proporciona una frontera definida entre lo que está 'dentro' y lo que está 'fuera' de la imagen, y eso, a su vez, permite usar un método mejor para especificar la frontera de la imagen de fondo. Es decir, en lugar de especificar qué colores deben considerarse fondo, podemos especificar qué colores marcan el borde del objeto que se va a enmascarar. Es más, como se conoce el color del borde, solo se habrán mezclado dos colores específicos alrededor de los bordes de la imagen. Es decir, ambos colores son conocidos, y por tanto también se sabe muy bien cómo de transparentes deben ser los bordes.

En construcción

Eliminar un fondo conocido

Mientras que eliminar un fondo simple a una máscara 'booleana' es relativamente sencillo, las cosas se complican cuando el fondo no es tan simple. Sin embargo, si el propio fondo es conocido, puedes usarlo para ayudar en su eliminación de otras imágenes. A partir de IM v6.3.4 se añadió un método especial de composición alfa llamado "[ChangeMask](compose.html#changemask)" que permite eliminar directamente un fondo conocido de una imagen. Por ejemplo, aquí tenemos una imagen de fondo sin alterar y otra que ha sido superpuesta por una imagen GIF con una simple transparencia booleana (puro on/off). Usando "[ChangeMask](compose.html#changemask)" podemos recuperar esa imagen superpuesta original (si es muy diferente del fondo).

  magick overlay_figure.gif   overlay_bgnd.gif  \
            -compose ChangeMask  -composite  overlay_removed.png

[IM Output] [IM Output] [IM Output]

Básicamente, lo que hace esto es determinar cómo de 'diferentes' son los píxeles de una imagen respecto a la otra y, si la diferencia es menor que el factor de difuminado actual, hacer ese píxel transparente. Solo se añaden a la imagen píxeles totalmente transparentes; por lo demás, la imagen original se deja tal cual, con transparencia y todo. Podemos simular el operador usando el método de composición más antiguo "[Difference](compose.html#difference)" para generar una imagen de diferencia de comparación

  magick composite overlay_figure.gif   overlay_bgnd.gif  \
            -compose Difference     overlay_difference.png

[IM Output] [IM Output] [IM Output]

Como puedes ver, la imagen de diferencia es negra en todas las partes sin cambios y una mezcla de colores en las partes que han cambiado. Separando y sumando los canales de color individuales y aplicando un umbral, obtenemos una máscara de cualquier diferencia en cualquier canal entre las dos imágenes. |

  magick overlay_difference.png -channel RGB -separate +channel \
          -evaluate-sequence add  -threshold 0   overlay_mask.png

[IM Output]
Usando esta máscara podemos hacer transparente todo lo que no haya cambiado. |

  magick overlay_figure.gif overlay_mask.png \
          -alpha off -compose CopyOpacity -composite \
          overlay_removed.png

[IM Output]
Como puedes ver, el método de composición "[ChangeMask](compose.html#changemask)" hace este proceso mucho más fácil. Sin embargo, esto solo presenta un estilo de enmascarado de fondo 'on/off'. No admite bordes difusos ni suavizados, ni un difuminado transparente del resultado.

Enmascarado por imagen de diferencia y difuminado

Lo anterior puede llevarse más allá, a imágenes que tienen bordes con aliasing, así como a fondos no simples. Por ejemplo, aquí tenemos un 'Cíclope' sobre un fondo blanco que queremos extraer. Luego generamos una imagen en escala de grises de las diferencias entre esta imagen y el color de fondo (definido por el píxel superior izquierdo). |

  magick cyclops.png \( +clone -fx 'p{0,0}' \) \
          -compose Difference  -composite  \
          -modulate 100,0  -alpha off  difference.png

[IM Output] [IM Output]
Por supuesto, esta imagen de diferencia no sirve directamente como máscara. Si la usaras, harías en la práctica que la mayor parte de tu imagen fuera semitransparente, en lugar de solo el fondo circundante. Sin embargo, a partir de esta imagen de diferencia se pueden crear un enorme número de máscaras de transparencia distintas, según lo que estés intentando lograr exactamente. Podemos ajustar la imagen de diferencia anterior para producir una máscara de todos los píxeles que sean siquiera mínimamente diferentes del color de fondo. |

  magick difference.png  -threshold 0  boolean_mask.png
  magick cyclops.png  boolean_mask.png \
          -alpha off -compose CopyOpacity -composite \
          cyclops_boolean.png

[IM Output] [IM Output]
Como puedes ver, una máscara booleana de 'cualquier diferencia' hizo que se incluyera una buena cantidad del fondo original. Esto se debe a que la imagen original está, o bien 'suavizada', o bien ligeramente desenfocada con el fondo (en este caso lo causó que la imagen original se redimensionara a partir de una imagen en formato JPEG). Esto no sería un problema si la imagen original fuera en sí misma una superposición booleana (por ejemplo, una imagen en formato GIF, superpuesta sobre un fondo). En ese caso tu resultado sería perfecto (véase el ejemplo de 'ChangeMask' anterior). Variando el "[-threshold](https://imagemagick.org/command-line-options/#threshold)" puedes añadir un 'factor de difuminado' a la máscara booleana (solo on/off), para acercar más la máscara a la imagen propiamente dicha. |

  magick difference.png  -threshold 15%  threshold_mask.png
  magick cyclops.png  threshold_mask.png \
          -alpha Off -compose CopyOpacity -composite \
          cyclops_threshold.png

[IM Output] [IM Output]
¡Observa que el ojo del cíclope ahora también se considera un hueco transparente! Este 'hueco' pone de manifiesto el mayor inconveniente de toda esta técnica. Las partes del objeto de la imagen que estén cerca del color de fondo, o peor aún, que coincidan exactamente con el fondo, se considerarán iguales al fondo. Por supuesto, esto puede ser deseable en imágenes de objetos 'con agujeros', como una rosquilla, pero para nuestro cíclope, un 'ojo con agujero' es sin duda un error. El efecto 'halo' original también puede ser deseable para algunas cosas, como el texto, para hacerlo más legible cuando quieres volver a superponerlo sobre algún otro fondo 'ruidoso'. Puedes realzar el efecto de halo desenfocando la máscara un poco antes de aplicarla, de modo que el 'halo' resultante se atenúe con la distancia. |

  magick difference.png -bordercolor black -border 5 \
          -threshold 10%  -blur 0x3  halo_mask.png
  magick cyclops.png -bordercolor white -border 5   halo_mask.png \
          -alpha Off -compose CopyOpacity -composite  cyclops_halo.png

[IM Output] [IM Output]
El efecto 'halo' resultante puede modificarse aún más usando más ajustes de histograma sobre la imagen de máscara, lo que te da un control muy preciso de los resultados para imágenes específicas. Con los parámetros adecuados puedes ajustar el halo circundante hasta que sea prácticamente inexistente, aunque eliminarlo por completo de este modo es difícil. Consulta la siguiente sección para una técnica mejorada. En realidad, se recomienda una pequeña cantidad de desenfoque (digamos "-blur 0x0.707", o raíz cuadrada de 2) al generar el enmascarado por umbral, solo para suavizar los bordes de la máscara. Por supuesto, el resultado no será booleano, así que no intentes guardarlo en un archivo de imagen en formato GIF. Esto también es un ejemplo de difuminado por desenfoque. Pero ten cuidado, porque no es exactamente lo mismo que el verdadero difuminado de formas usando la distancia. Sin embargo, cuando se trabaja con 'mapas de bits' o 'máscaras de umbral' como las que creamos antes, una pequeña cantidad de difuminado por desenfoque, seguida de una cantidad mayor de difuminado por distancia, probablemente dará el mejor resultado global.

Recuperar bordes semitransparentes

La técnica de enmascarado por diferencia que usamos antes puede combinarse con la técnica anterior de enmascarado por relleno por inundación para resolver la mayoría de los problemas que hemos visto con las técnicas de enmascarado más simples. Aquí veremos una técnica de enmascarado en varias capas, pero una que debería producir una eliminación casi ideal del fondo de la imagen, conservando a la vez los píxeles de sombreado suavizado a lo largo del borde. Sin embargo, esto se limita a imágenes sobre un fondo conocido y que tengan un buen 'borde' contrastado con los píxeles del primer plano. Para este ejemplo decidí usar algo que era muy difícil de separar, pero que mostraba MUCHOS más píxeles sombreados alrededor de los bordes de los que normalmente tendrías con fines de suavizado. Una forma con un efecto de sombra. |

  magick -size 70x60 xc:none -font Candice -pointsize 50 -stroke black \
          -fill black          -annotate +12+42 'A' -channel RGBA  -blur 0x3 \
          -fill tile_disks.jpg -annotate +10+40 'A' \
          tile_water.jpg  -compose DstOver -composite letter.png

[IM Output]
Primero necesitaremos generar una imagen de diferencia y, por suerte para nosotros, sí sabemos cuál es la imagen de fondo. Por supuesto, funcionará igual de bien para un fondo de color plano, siempre que haya un buen contraste que nos permita generar dos máscaras. Básicamente, usando una imagen de diferencia podemos eliminar cualquier influencia de la imagen de fondo y, a partir de ahí, generar las máscaras que usaremos. |

  magick letter.png  tile_water.jpg \
          -compose Difference -composite \
          -modulate 100,0 -channel B -evaluate set 0 \
          -alpha Off  diff_mask.png

[IM Output]
Observa que esta vez procesé ligeramente la imagen de diferencia en escala de grises, limitándola a los canales rojo y verde y vaciando el canal azul, lo que produce una imagen de diferencia negro-amarilla. Esto es ingenioso, ya que libera el canal 'azul' para permitir la generación de una máscara de relleno por inundación limpia, separada de la propia imagen de diferencia. Técnicamente podría vaciar también el canal verde para poder usarlo en la segunda máscara. Pero no nos adelantemos. Ahora necesitamos dos máscaras: una máscara exterior, que defina todas las zonas que serán definitivamente transparentes, y una máscara que defina el interior del objeto de la imagen, sin generar 'agujeros' no deseados. Así que rellenemos por inundación la imagen desde fuera hacia dentro, usando varios factores de difuminado distintos, para poder elegir las dos máscaras interior y exterior que usaremos.

  for fuzz in 01 03 06   28 32 34; do \
    magick diff_mask.png -fill blue -fuzz $fuzz% \
            -bordercolor black -border 1x1 -floodfill +0+0 black \
            -shave 1x1 diff_mask_$fuzz.png; \
  done

[IM Output]
-fuzz 1% | [IM Output]
-fuzz 3% | [IM Output]
-fuzz 6% | | [IM Output]
-fuzz 28% | [IM Output]
-fuzz 32% | [IM Output]
-fuzz 34%
---|---|---|---|---|---|---

Las zonas azules de las imágenes anteriores son la zona que se está enmascarando. Recuerda que vaciamos el canal azul con este propósito. La primera máscara debería enmascarar las zonas de la imagen que definitivamente queremos hacer totalmente transparentes. Es decir, las partes que con seguridad esperamos que sean totalmente transparentes en la imagen final. La zona dentro de la máscara debería seguir conteniendo la mayor parte de la sombra de halo negra de la imagen. En este caso tenemos mucha interacción entre la imagen propiamente dicha y el resto del fondo, así que elegí un factor de difuminado del '1%', que aún contenía una gran zona alrededor de la imagen. En un caso más típico sin sombra, esta zona puede ser incluso más pequeña, hasta un valor no porcentual como 5 o 10. La segunda máscara debería tener un 'difuminado' suficientemente grande como para devorar todos los píxeles semitransparentes presentes. Es decir, justo hasta el borde de la imagen, y preferiblemente adentrándose en él, sin eliminar por completo el borde ni 'filtrarse' hacia la imagen propiamente dicha (véase la última imagen de arriba). El negativo de esta máscara representará en realidad todos los píxeles que serán totalmente opacos (y por tanto representan el interior) en la imagen final. Esta selección puede ser difícil y puede requerir mucho ensayo y error para averiguar el mejor valor que usar. Para esta imagen se pudo elegir un difuminado muy alto del '32%' sin grandes problemas. Básicamente, quieres intentar que sea lo bastante alto para que la imagen final no contenga ninguno de los píxeles del 'fondo' original, pero sin que la máscara devore (o se filtre hacia) el interior de la imagen. Incluso puede requerir un poco de edición manual para dejar la máscara justo a punto cuando hay un hueco en el color del 'borde' circundante. Ahora podemos usar esta máscara para extraer el 'núcleo' o interior de nuestra imagen. Es decir, las partes que tenemos la certeza de que no contienen ninguna semitransparencia hacia el patrón de fondo que estamos eliminando. |

  magick diff_mask_32.png -channel blue -separate +channel -negate \
          letter.png +swap -alpha Off -compose CopyOpacity -composite \
          letter_inside.png

[IM Output]
Observa cómo extraje la máscara azul de las imágenes con máscara rellenadas por inundación. Además, debido a la naturaleza de todo o nada del relleno por inundación, la máscara mostrará fuertes efectos de escalera o aliasing alrededor de los bordes. Este es el problema que la segunda máscara nos permitirá corregir. Recuerda que esta imagen es solo de los píxeles que sabemos que no interactúan con el fondo original, y que se dejarán tal cual en la imagen final. No incluye ninguno de los efectos de sombra ni los píxeles de suavizado que estoy intentando recuperar específicamente. Recuperar esos píxeles es donde reside el verdadero trabajo. Negando y restando (multiplicando) las máscaras, podemos generar una nueva máscara que defina la zona donde queremos extraer los píxeles de borde o sombra semitransparentes… |

  magick diff_mask_01.png -negate diff_mask_32.png \
          -channel blue -separate +channel -compose multiply -composite \
          mask_aliasing_area.png

[IM Output]
Esta zona se usa luego para extraer los píxeles de suavizado de la máscara de diferencia, que define cómo de transparentes deberían ser los píxeles. Normalizamos esos píxeles para obtener una transición suave de opaco a transparente. |

  magick diff_mask.png -channel red -separate +channel \
          mask_aliasing_area.png -alpha Off -compose CopyOpacity -composite \
          -background gray30 -compose Over -flatten -normalize \
          mask_antialiased_pixels.png

[IM Output]
Cuanto más claro sea el color en la máscara anterior, más opaco será el píxel. De forma similar, cuanto más oscuro sea el color, más transparente será. Observa que aquí usé un fondo gris para asegurar que los colores transparentes presentes en la imagen no interfieran con la normalización de la imagen. Sin esto, esta normalización fallaría. El propio color gris plano no es importante, ya que está fuera de la zona de la máscara, así que se ignorará después. Ahora que tenemos el nivel de transparencia correcto, necesitamos saber qué color debe usarse para estos píxeles semitransparentes. Este color suele ser el mismo que el color del borde de la imagen, en este caso simplemente negro. Sin embargo, debido a la interacción del fondo original, decidí optar por un color gris oscuro para la sombra. | _Tendrás que averiguar de algún modo qué color deberían tener los píxeles semitransparentes, para poder fijar el color correcto de los píxeles de suavizado.

Esto podría ser_

  1. Un color de borde fijo (por ejemplo: casi negro, como en este ejemplo)
  2. Usar el color de los píxeles de borde totalmente opacos más cercanos (usando morfología. VéaseColor disperso como operador de relleno
  3. Calculado: una vez que conoces el alfa y el color de fondo, puedes restar el color de fondo para corregir el color del píxel. VéaseEliminación del fondo usando dos fondos más abajo.

Básicamente, depende de tu imagen.
---|---
Ya que estamos, volvamos a enmascarar la imagen para dejar solo estos píxeles de borde especiales. |

  magick mask_antialiased_pixels.png mask_aliasing_area.png \
          -compose multiply -composite -negate \
          -background '#444' -channel A  -combine letter_edging.png

[IM Output]
Todo lo que falta ahora es superponer en capas el 'núcleo' interior de la imagen con los píxeles de borde semitransparentes. |

  magick letter_inside.png letter_edging.png \
          -background none  -flatten    letter_recovered.png

[IM Output]
Y voilà, tenemos una imagen con el fondo eliminado para producir una imagen suavizada perfecta, con los bordes y las sombras semitransparentes correctamente recuperados. Incluso puedes superponerla sobre un fondo completamente distinto. |

  magick letter_recovered.png tile_aqua.jpg \
          -background none -compose DstOver -flatten    letter_on_aqua.png

[IM Output]
La imagen que usé para este ejemplo es muy difícil, con una gran zona de 'borde'. La mayoría de las imágenes no son ni de lejos tan malas, pero este método es probablemente la mejor técnica de eliminación de fondo y la más universal. Esto se ha incorporado ahora a un script de shell llamado "**[bg_removal](../static/img/scripts/bg_removal)**", que usa un único comando, sin archivos temporales, y tiene varias opciones adicionales sobre los métodos por los que se realiza el enmascarado.

Eliminación del fondo usando dos fondos

El mayor problema con las técnicas anteriores es que en realidad no tienes suficiente información para recuperar por completo toda la información sobre el objeto del primer plano. Realmente necesitas recuperar dos datos: cómo de transparente es cada píxel del objeto del primer plano y cuál es su color original. Y no puedes recuperar perfectamente ambos datos a partir de una sola imagen. Incluso cuando sabes exactamente qué aspecto tiene la imagen de fondo, no puedes simplemente restarla del objeto del primer plano, a menos que ambos sean colores muy diferentes y conocidos. El problema es que sencillamente no puedes estar seguro de si el color que es visible es realmente el color dado (opaco), o si es alguna mezcla de otro color y el fondo (semitransparente). No puedes separar el color original del valor alfa necesario, a menos que dispongas de alguna fuente de información adicional. La única situación en la que puedes recuperar por completo todos los detalles de un objeto del primer plano es cuando tienes dos imágenes que contienen dos colores de fondo muy diferentes pero completamente conocidos. En esa situación sí tienes suficiente información para recuperar tanto el color como la transparencia del objeto del primer plano, para una eliminación perfecta del fondo. El factor importante al seleccionar las dos imágenes es que los colores de fondo sean lo más diferentes posible en toda la imagen. Es decir, que los colores no solo sean complementarios, sino negativos en intensidad en todos los canales. Por ejemplo…

[IM Input] [IM Input]

Aunque se usa un color de fondo distinto, ambas imágenes contienen exactamente el mismo objeto. El objeto mostrado no es simple, sino que contiene muchos colores semitransparentes. Puedes verlo en cómo el fondo azul oscuro es visible en las llamas de la imagen, aunque esta transparencia es prácticamente invisible en el fondo amarillo más claro. Al usar dos colores, los píxeles semitransparentes del objeto superpuesto se mezclarán con dos colores muy diferentes y, como resultado, tendrán colores ligeramente distintos en las dos imágenes. Midiendo cómo de diferente es cada píxel, puedes determinar exactamente qué píxeles son semitransparentes, y en qué medida. En esencia, hay suficiente información para permitirte recuperar perfectamente la transparencia del objeto superpuesto. Recuperar la transparencia o 'máscara' es, por supuesto, el primer paso, y en realidad es un paso muy sencillo. Genera una imagen de diferencia y luego fusiona y maximiza las diferencias encontradas en cada canal. |

  magick match_navy.gif match_gold.gif \
          -compose difference -composite -separate \
          -evaluate-sequence max -auto-level -negate \
          match_alpha.png

[IM Output]
La imagen resultante es un mapa perfecto de cómo de transparente es cada píxel. Es, en esencia, la 'máscara alfa' del objeto original en las imágenes fuente. Sin embargo, solo funcionará si la imagen superpuesta contiene tanto zonas de total transparencia como de total opacidad. Si no es así, en lugar del paso de normalización ("-evaluate-sequence max -auto-level") anterior, necesitarás dividir cada canal por la diferencia de los dos colores de fondo. Es decir, dividir por un valor entre 0.0 y 1.0; cuanto mayor sea la diferencia, mejor. Si los dos colores de fondo son negro puro y blanco puro, entonces no se necesita normalización, solo la diferencia de las dos imágenes. La diferencia se niega luego para que una diferencia máxima produzca alfa cero, o total transparencia, y ninguna diferencia produzca alfa máximo, o total opacidad. La siguiente tarea es más difícil, ya que como los colores de cada píxel semitransparente están modificados por el fondo, no puedes simplemente usar la máscara alfa para extraer el objeto de una de las imágenes fuente. Por ejemplo… |

  magick match_navy.gif match_alpha.png \
          -alpha Off -compose Copy_Opacity -composite \
          match_bad_colors.png

[IM Output]
Básicamente, lo que obtuvimos fue un horrible halo del color de fondo en la 'llama' semitransparente de la imagen. Un resultado nada agradable. Esto se conoce como 'derrame de color' (un término de Enmascarado por croma, también conocido como técnica de pantalla azul o verde) y puede ser un gran problema. Lo que necesitamos hacer es eliminar el color de fondo de los píxeles semitransparentes. Sin embargo, como ya hemos recuperado el canal alfa de la imagen original, sabemos exactamente cuánto color hay que eliminar de cada píxel para restaurar el color original superpuesto. Para hacer esto no solo necesitamos una de las imágenes fuente y el canal alfa que acabamos de extraer, sino que también necesitamos conocer el color exacto del fondo en esa imagen fuente. Un problema relativamente fácil al usar un fondo de color sólido, como en estos ejemplos. Por ejemplo, aquí restauro los colores originales… |

  magick match_navy.gif match_alpha.png -alpha Off \
          -fx "v==0 ? 0 : u/v - u.p{0,0}/v + u.p{0,0}" \
          match_alpha.png -compose Copy_Opacity -composite \
          match_recovered.png

[IM Output]
Usé el píxel de la esquina superior izquierda (fórmula FX 'u.p{0,0}') de la imagen fuente como el color de fondo que eliminar de los píxeles semitransparentes. Ajusta esto o sustituye directamente el color que eliminar si es necesario. La clave de la restauración del color es la compleja operación de resta mezclada FX anterior. Esta realzará el color original ('u') de la imagen fuente según la máscara alfa ('v') y luego restará el color de fondo (u.p{0,0} o el píxel de la esquina superior izquierda) del resultado final. La fórmula no es sencilla, y un gran agradecimiento a HugoRune, en la discusión del foro de IM Undo a Composite -dissolve, por determinar las matemáticas necesarias. La discusión también explica exactamente cómo funcionan todos los pasos, cómo se dedujeron, e incluso cómo puedes extraer la superposición a partir de dos patrones de fondo conocidos pero diferentes. Aquí está toda la secuencia en un único comando. |

  magick match_gold.gif match_navy.gif -alpha off \
          \( -clone 0,1 -compose difference -composite \
             -separate -evaluate-sequence max -auto-level -negate \) \
          \( -clone 0,2 -fx "v==0?0:u/v-u.p{0,0}/v+u.p{0,0}" \) \
          -delete 0,1 +swap -compose Copy_Opacity -composite \
          match_recovered_2.png

[IM Output]
| _En IM v6.6.8-3, si FX hace referencia a un píxel transparente usando 'p{}', obtiene valores cero en lugar de los valores reales del color totalmente transparente. Esto es un error y se informó y corrigió en IM v6.6.8-5. No se sabe cuándo se introdujo el error.

Esto solo era un problema si decidías fusionar primero la imagen alfa en la imagen fuente y luego intentabas corregir los colores semitransparentes o de 'derrame' usando el color de fondo conocido._
---|---
Esta vez se usó la imagen de fondo 'gold' para la extracción del color, y se seleccionó mediante el '0' en la segunda operación "[-clone](https://imagemagick.org/command-line-options/#clone)", pero podría haberse usado cualquiera de las imágenes fuente. Solo una advertencia. Lo anterior asume que el píxel superior izquierdo es el color de fondo sin adulterar. Si no lo es, puede que tengas que modificar el comando para especificar un color de píxel concreto, o usar una tercera imagen que sí contenga la información correcta del color de fondo. Este último método es vital si el color de fondo no es constante en toda la imagen, aunque incluso esa complicación puede resolverse. Aquí está la secuencia más simple para imágenes superpuestas sobre un fondo negro puro y blanco puro. En este caso, los colores se recuperan siempre de la imagen de fondo negro, ya que es solo una simple división y, por tanto, se puede usar una composición Divide más rápida en lugar del dolorosamente lento operador casero FX.

  magick match_black.gif match_white.gif -alpha off \
          \( -clone 0,1 -compose difference -composite -negate \) \
          \( -clone 0,2 +swap -compose divide -composite \) \
          -delete 0,1 +swap -compose Copy_Opacity -composite \
          match_recovered_3.png

[IM Input] [IM Input] [IM Output]

Fotos de estudio para recuperar el fondo Los fondos ideales son un negro mate (no reflectante) y un blanco puro (no reflectante) sencillo. El fondo también debería ser de un tono lo más liso e invariable posible. Para hacer fotos específicamente para la eliminación del fondo, usar dos colores complementarios puede funcionar mejor. Por ejemplo, tomar fotos con un telón de fondo verde y magenta. Básicamente, tendrás que reemplazar de algún modo la pantalla de color de fondo antes de tomar la segunda foto. Ten en cuenta que el orden de las dos fotos no importa en la eliminación del fondo, pero deberían ser lo más limpias y uniformes posible, y el objeto principal y la cámara deben permanecer perfectamente quietos y fijos. Un método mejor puede ser simplemente colocar una pantalla blanca bien alejada detrás del objeto e iluminar uniformemente esa pantalla usando dos lámparas de colores diferentes, para no producir sombras del objeto. Con esta técnica puedes cambiar al otro color de fondo sin necesitar ningún cambio físico en el estudio para tomar dos fotos con dos fondos diferentes. Estas técnicas de dos colores de fondo deberían funcionar bien para objetos transparentes, pero los reflejos, o la deformación del fondo o los efectos de 'lente' del objeto fotografiado, no serán registrados por la técnica, solo su transparencia. Por otro lado, ¡los reflejos de una fuente de luz constante sobre el objeto sí se conservarán! Si pruebas esto, háznoslo saber y danos un ejemplo de tus fotos fuente y resultados para incluirlos aquí. Se te nombrará con un enlace a tu sitio para que la gente lo vea.
Recuperación del fondo en vídeo Si tienes una serie suficientemente grande de imágenes con fondos muchos y diferentes pero complejos (como un vídeo), puedes intentar tomar el valor mínimo y máximo de todas las imágenes para generar una imagen de fondo casi negro puro y blanco puro que usar. Cuantas más imágenes, mejor funciona esto. Con esas dos imágenes se puede extraer cualquier logotipo constante y su semitransparencia, y luego se puede usar la misma técnica para eliminarlo de todos los fotogramas. Sin embargo, solo funcionará para una superposición semitransparente constante, y puede que no funcione para logotipos que usen distorsiones de color o de tono, ni siquiera para un logotipo de color sólido. Pero al menos te permitirá determinar la forma exacta del logotipo. Para logotipos que son totalmente opacos o más difíciles, se puede usar el relleno de huecos (véase a continuación) para rellenar el detalle que falta a partir de los colores circundantes. Véase la discusión del foro de IM para más detalles.


Relleno de huecos

Aunque el enmascarado, añadir transparencia y eliminar el fondo ofrecen una forma de lidiar con elementos no deseados, a menudo un 'hueco' no es realmente lo que quieres como resultado. Claro que puedes superponer imágenes con huecos sobre otras imágenes para rellenarlos, pero eso puede no dar un resultado sin costuras. Para borrar elementos de una imagen, no quieres solo recortarlos, sino reemplazarlos por colores, sombras y texturas de las partes que rodean el hueco. A continuación hay varias técnicas para determinar qué usar para rellenar ese hueco.

Crear un hueco para rellenar

Supongamos que tenemos una imagen con algún texto feo… |

  magick zelda_tn.gif -gravity Southwest -annotate +8+20 Zelda zelda_text.jpg

Pues bien, lo que realmente queremos hacer es eliminar ese texto, y la forma más sencilla es enmascararlo, para dejar un 'hueco' donde estaba el texto. Esto simplifica el problema, ya que deja de importar qué se eliminó. Simplemente tenemos un hueco que rellenar. [IM Output]
Para este caso, sin embargo, crearé una máscara usando una línea dibujada que cubre el 'texto feo', como si un usuario hubiera usado rápidamente un editor de imágenes. |

  magick -size 120x90 xc:black  -stroke white  -strokewidth 7 \
          -draw 'stroke-linecap round line 9,62 36,63' \
          -threshold 10%  zelda_text_mask.gif

[IM Output]
La mera creación del 'hueco' en sí puede ser un asunto delicado, y una solución automatizada puede depender de qué estés intentando eliminar exactamente, o incluso implicar comparar cientos de imágenes con el mismo 'texto' o 'logotipo' para localizarlo con exactitud. Ten en cuenta que cuanto más pequeño sea el hueco, mejor será el resultado final. Cuanta más información pueda preservarse de la imagen original, mejor será el resultado. Un hueco tosco y de forma irregular también es mejor que un hueco de contorno muy suave. Así que tomarte tu tiempo para hacer el hueco más pequeño que elimine todos los efectos no deseados puede marcar una gran diferencia. Ahora usemos la máscara para recortar un hueco en la imagen, lo que también comprobará que cubre todas las partes no deseadas. |

  magick zelda_text.jpg \( zelda_text_mask.gif -negate \) \
          -compose CopyOpacity -composite   zelda_text_hole.png

Así que aquí tenemos una imagen con un 'hueco' que hay que rellenar. [IM Output]

Relleno con desenfoque

Así que tenemos un hueco que hay que rellenar con algún color. Algo que no parezca que en realidad hemos eliminado algo de la imagen. Uno de los métodos más simples es simplemente desenfocar la imagen, permitiendo que los colores alrededor del hueco se 'extiendan' hacia él, y luego eliminar la transparencia. |

  magick zelda_text_hole.png -blur 0x1 -alpha off zelda_text_fill.png

La cantidad de desenfoque que uses depende del tamaño del hueco usado. [IM Output]
Ahora veamos cómo podemos poner debajo esta imagen desenfocada para 'rellenar el hueco' que hicimos antes…

  magick zelda_text_hole.png zelda_text_fill.png \
          -compose Dst_Over  -composite   zelda_text_removed.png

[IM Output] [IM Output] [IM Output] [IM Output]

Y el texto ha sido eliminado. Esto no es perfecto, ya que el desenfoque de los colores en esa zona deja claro que se eliminó algo. Por ejemplo, si miras de cerca el marco de la ventana junto a la cabeza de Zelda, puedes ver los efectos del desenfoque. Además, la zona se ve 'más suave' que el resto de la imagen, lo que se nota especialmente en las fotos. Pero es una técnica muy extendida y rápida, y a menudo la verás en vídeos, donde han intentado eliminar los logotipos que alguna cadena de televisión había añadido como método de prevención de copia. Una alternativa a intentar ocultar la eliminación es hacer que la eliminación en sí sea perceptible. Por ejemplo, si quieres proteger el anonimato de alguien.

En construcción

Enlaces a otros métodos. Método de relleno de huecos por desenfoque con redimensionado… Color disperso, método de Shepard (rápido). Véase también snibgo, Filling holes Desenfocar solo los píxeles de borde…Color disperso como operador de relleno. Véase también snibgo, Filling holes in priority order Me gustaría usar un operador de morfología que fije el color en los canales de color mientras calcula la distancia en un canal de fondo oculto. Esto debería generar un relleno tipo Shepard muy rápido y sin filtraciones, conocido como 'difusión de color'. Véase el artículo Diffusion Curves, que hace un uso intensivo de esta técnica. Una discusión grande y antigua sobre el relleno de huecos (eliminación de texto) está en los foros de usuarios de IM Text Removal Discussion. Una discusión más reciente es Fill area with nearest colour from boundary, que trata más sobre rellenar sin desenfocar. En Stack Overflow, Remove text from jpeg se muestran algunos otros métodos no relacionados con IM para 'rellenar huecos' y borrar partes de imágenes. Por ejemplo, usando Python Skimage. O usando Python OpenCV inpainting