⚠️ Este é um site de tradução não oficial, sem relação com a ImageMagick Studio LLC. Para informações oficiais, consulte a página original (https://usage.imagemagick.org/masking/index.html).

Exemplos do ImageMagick -- Máscaras

Prefácio e Índice dos Exemplos do ImageMagick
Canal Alfa (Matte)

(Em Construção) Nestes exemplos, examinamos o tratamento especial da transparência, o canal de transparência, o uso de máscaras e, por fim, a remoção de fundos indesejados ou de outros elementos, como sinais, texto e spam.


Canal Alfa

O canal de transparência (alfa) de uma imagem é totalmente opcional e muitas vezes exige um tratamento especial, separado dos canais de 'cor' normais. Veja Espaço de Cor da Imagem acima. A existência de um canal de transparência também pode afetar como os vários operadores tratam os demais canais de cor, geralmente porque uma cor totalmente transparente deve, com frequência, ser completamente ignorada por uma operação. Se não fosse assim, surgiriam 'halos pretos' ao redor das imagens, como se viu em bugs importantes do IM nos primeiros tempos do IM v6. Por exemplo, o Resize Halo Bug e o Blur with Transparency Bug. Para piorar, esse canal também é às vezes chamado de canal de 'transparência' ou de 'opacidade' da imagem, ou até de 'máscara' da imagem. Todos, porém, referem-se ao mesmo quarto canal especial da imagem. [IM Output] Para explicar a diferença, precisamos de uma imagem de exemplo e, para isso, usarei uma imagem PNG de uma 'lua crescente' (de um exemplo de Composição CopyOpacity). Como se pode ver, essa imagem tem muitas áreas totalmente transparentes. Além disso, foi preciso salvá-la no formato de imagem 'PNG', que é um dos poucos formatos que entende e trata corretamente cores transparentes e semitransparentes. Posso demonstrar essa transparência sobrepondo a imagem ao padrão de tabuleiro de xadrez embutido do IM, usando Composição Alfa. |

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

[IM Output]

Canal Alfa Interno

Internamente, o IM v7 armazena a informação de transparência em um canal 'alfa' que, assim como o canal de cor, é apenas uma imagem simples em tons de cinza com valores que vão do branco, para totalmente transparente (ou seja, claro), ao preto, para totalmente opaco. É mais ou menos o que se obteria ao observar uma silhueta da imagem original. Operadores de baixo nível como "[-level](https://imagemagick.org/command-line-options/#level)" e "[-threshold](https://imagemagick.org/command-line-options/#threshold)" tratam os dados como alfa. Consulte a Referência Oficial de Opções se estiver em dúvida.


Criado: 10 de dezembro de 2003 (originalmente 'channels')
Atualizado: 2 de outubro de 2018
Autor: Anthony Thyssen, Anthony.Thyssen@gmail.com
Exemplos gerados com: [version image]
URL: https://usage.imagemagick.org/masking/

Aqui está uma maneira muito antiga de extrair os valores de transparência 'alfa' de uma imagem. Ela salva o canal de transparência em um formato de arquivo de imagem 'alfa' e exigia duas etapas separadas, além de comandos para definir o formato de arquivo de imagem correto. | |

  magick moon.png alpha:moon.matte

  magick MIFF:moon.alpha moon_matte2.png

  # You can join those two steps in a pipeline as well...
  magick moon.png alpha:- | magick - moon_matte3.png

[IM Output]
Esta técnica de extrair o 'alfa' de uma imagem era comum quando o IM v5 estava em uso. Basicamente, era o único método disponível para acessar a transparência de uma imagem. Hoje é usado muito raramente.

Controlando a Transparência da Imagem

Há dois operadores que dão controle de baixo nível sobre o canal de transparência de uma imagem em memória. Os métodos do operador mais recente "[-alpha](https://imagemagick.org/command-line-options/#alpha)" são agora o método de controle recomendado, embora muitos Exemplos do IM ainda mostrem e usem o operador mais antigo "-matte". Uma imagem não só pode ter dados de canal alfa, mas também tem um 'interruptor' que define se os dados do canal são visíveis ou válidos. Isso significa que as imagens podem ter três estados em relação ao canal alfa. Interruptor Dados do Canal
alpha off sem dados alfa (nenhuma memória foi alocada)
alpha deactivate dados alfa antigos presentes (mas não em uso)
alpha on dados alfa atualmente em uso
Isso precisa ser lembrado, pois o comportamento dos vários métodos depende de qual dos três estados acima a imagem estava. Se o 'interruptor' estiver desligado, os operadores não tocarão nos dados alfa, pois eles podem nem existir de fato. Nesse caso, um alfa antigo ainda poderia estar presente, sem modificação e, portanto, desatualizado. Como você verá, isso às vezes é útil em algumas situações. Observe, porém, que alguns operadores podem ligar ou desligar automaticamente o interruptor alfa por um motivo ou outro. Por exemplo, "-compose CopyOpacity -composite" sempre ligará o canal alfa na imagem resultante, pois é função do operador copiar dados para um canal alfa. Assim, ele deve existir no resultado final. Contudo, sua existência nos dados de entrada pode ter outras consequências. Veja Método de Composição Copy_Opacity para mais detalhes. De modo similar, criar uma tela com a cor 'None' também criará e ativará automaticamente o canal de transparência, para garantir que a imagem em branco seja realmente transparente. Por outro lado, criar uma tela usando algum outro Nome de Cor geralmente não criará nenhum canal de transparência, pois as imagens são opacas por padrão.
Aqui estão os vários métodos "[-alpha](https://imagemagick.org/command-line-options/#alpha)" e exemplos de como eles afetam as imagens e sua transparência.

Alpha Off ou "-alpha off"

Isto é apenas um simples interruptor na imagem, que desliga qualquer efeito que a transparência tenha sobre ela. Na verdade, não exclui nem destrói o canal alfa anexado à imagem; apenas desliga qualquer efeito que esse canal tenha sobre a imagem. De modo semelhante, nenhum operador afetará o canal alfa anexado enquanto ele estiver desligado. Por exemplo, vamos usar a imagem da 'lua crescente' (de um exemplo de Composição CopyOpacity) e simplesmente desligar o canal alfa da imagem.

  magick moon.png  -alpha off     alpha_off.png

[IM Output] [IM Output]

Observe que a forma da lua desapareceu completamente quando a transparência foi desligada, embora isso, na verdade, raramente aconteça. Basicamente, mesmo as áreas 'transparentes' têm cor, que apenas normalmente não é visível; neste caso, a cor oculta era a imagem de tela fractal usada para criar a imagem da lua. Essa cor oculta poderia ser qualquer coisa, desde uma simples Cor de Transparência GIF, que o formato GIF usa para representar a transparência em sua tabela de cores, até cores de lixo deixadas para trás durante a criação da imagem, como acima. Mais tipicamente, a cor de transparência é simplesmente preto puro para qualquer pixel que fosse totalmente transparente. Observe que pixels próximos à borda podem ser semitransparentes e, assim, ainda ter uma cor válida que é apenas parcialmente visível. A operação "[-alpha](https://imagemagick.org/command-line-options/#alpha) Off" acima simplesmente 'desativou' ou 'desligou' o canal. Os próprios dados de transparência não foram apagados nem removidos dos dados da imagem armazenados em memória. Eles ainda estão presentes, apenas indisponíveis no momento. Mas... Se a imagem for salva enquanto os dados de transparência estiverem desligados, nenhum dos dados de transparência será salvo no formato de arquivo de imagem. Assim, os dados alfa desligados não estão presentes na cópia salva da imagem, embora estejam presentes (apenas desligados) na versão em memória. Além disso, como muitos formatos de arquivo não permitem transparência (como o JPEG), esses formatos fazem automaticamente o equivalente a um "[-alpha](https://imagemagick.org/command-line-options/#alpha) Off" quando a imagem é salva (sem de fato executá-lo). Geralmente, isso faz com que todas as áreas transparentes normalmente fiquem pretas quando salvas como uma imagem JPEG. Veja Alpha Remove - Removendo a Transparência abaixo para a maneira correta de remover a transparência antes de salvar em um formato de arquivo JPEG. O operador "[+alpha](https://imagemagick.org/command-line-options/#alpha)" é um comando mais antigo que é exatamente igual a "-alpha Off". Ou seja, ele apenas desliga o canal de transparência. Observe que desligar o alfa é frequentemente necessário antes de usar uma imagem de máscara em tons de cinza com o método de composição alfa CopyOpacity. Se você não fizer isso, o operador de composição copiará a transparência ativada (canal de opacidade) em vez de usar as cores em tons de cinza pretendidas.

Alpha Set ou "-alpha set"

O método alfa 'Set' é o mesmo que a antiga opção "[-alpha on](https://imagemagick.org/command-line-options/#alpha)". Ele garante que a imagem tenha um canal de 'transparência' ou alfa, mas, se ele não estiver presente ou estiver desligado, é inicializado como totalmente opaco (veja o método Alpha Opaque abaixo). Contudo, se a imagem já tiver um canal alfa presente e ativado, ele não fará nada. Em outras palavras, este operador garante que um canal alfa esteja presente, sem modificar a aparência da imagem como ela está atualmente em memória. Assim, por si só, este operador não mostra nenhuma mudança na imagem, mas tem efeitos reais quando combinado com outros operadores. Portanto, se você desligar o canal alfa usando Alpha Off e depois reativá-lo usando Alpha Set, a imagem terá um canal alfa, mas ele será totalmente opaco, exatamente como a imagem estava quando a operação 'Set' foi solicitada. |

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

[IM Output]
Se aplicado a uma imagem que já tem um canal alfa ativado, nenhuma mudança é feita. |

  magick moon.png  -alpha set    alpha_noset.png

[IM Output]
Em resumo, este operador nunca deve mudar a aparência da imagem no momento em que é aplicado. Ele apenas garante que o canal alfa seja configurado de modo que a imagem permaneça como está. Isso é normalmente usado após ler imagens de um formato de arquivo de imagem ou fonte de entrada desconhecidos, que podem ou não ter um canal alfa presente. Este operador então garantirá que a imagem tenha um canal alfa (para formatos como JPEG), mas deixando intacto qualquer canal alfa existente e ativado (como nos formatos GIF ou PNG). Esta é a maneira recomendada de garantir que uma imagem tenha um canal alfa após lê-la para a memória ou, mais importante, depois que uma imagem foi processada e você deseja reativar um canal alfa limpo.

Alpha On

O "[-alpha](https://imagemagick.org/command-line-options/#alpha) On" é o exato oposto do método Alpha Off visto anteriormente. Normalmente, isso é simplista demais para o objetivo desejado e, por isso, deve ser usado muito RARAMENTE. Você deve usar "[-alpha Set](#alpha_set)" em quase todos os casos. Basicamente, o método 'On' apenas aciona o interruptor para que os dados de transparência da imagem fiquem visíveis novamente. Nenhum dado de transparência existente é modificado, portanto, se a imagem em memória ainda tiver dados antigos de canal alfa, esses dados voltarão a ficar visíveis de repente. Por exemplo, aqui desligamos ('Off') os dados de transparência e, em seguida, imediatamente os ligamos de volta ('On'), reproduzindo a imagem original. |

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

[IM Output]
Contudo, se a imagem (ainda) não tiver nenhum dado alfa anterior, ele será inicializado como totalmente opaco. O que é a coisa lógica a se fazer. Assim, para imagens novas recém-lidas na memória, equivale a Alpha Set, mas não deve ser usado para esse fim. A única situação em que Alpha On deve ser usado é quando você anteriormente, e de propósito desligou o alfa por algum motivo, e agora deseja restaurar esses dados. Por exemplo, desligar e depois ligar o canal alfa pode ser usado para preservar os dados do canal alfa antes de aplicar certos operadores muito específicos, como "[-shade](https://imagemagick.org/command-line-options/#shade)". Para um exemplo desse uso especial, veja Imagens de Forma Sombreada.

Alpha Activate/Deactivate

ativa e desativa o canal alfa, respectivamente, de forma persistente. Isso é como o on/off no Imagemagick 6. No Imagemagick 7, -alpha off removerá o canal alfa permanentemente, de modo que -alpha on não o reativará.

Alpha Discrete

trata o canal alfa de forma independente (não mistura).

Alpha Opaque

Este método não só garante que o canal alfa esteja 'ativo', mas também que seja completamente opaco, independentemente de a imagem ter a transparência 'ativada/ligada' ou 'desativada/desligada'. Por exemplo...

|

  magick moon.png  -alpha opaque    alpha_opaque.png

[IM Output]
Em versões mais antigas do IM, isso equivalia a usar "[-alpha off](https://imagemagick.org/command-line-options/#alph)" para desligar o canal alfa e depois "[-alpha on](https://imagemagick.org/command-line-options/#alpha)" para ligá-lo, redefinindo-o como opaco. |

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

[IM Output]
A 'forma' original da imagem não pode mais ser recuperada após esta operação, pois os dados originais do canal alfa foram sobrescritos. Claro que isso também equivale a usar "-alpha off -alpha set", embora, nesse caso, seja melhor usar "-alpha opaque".

Alpha Transparent

De modo semelhante, isso garante que o canal alfa esteja 'ativo', mas também totalmente transparente. |

  magick moon.png  -alpha transparent    alpha_transparent.png

[IM Output]
Os dados de cor da imagem ainda estão presentes, então desligar a transparência em seguida mostrará novamente as cores existentes da imagem. |

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

[IM Output]
Claro que a 'forma' original da imagem foi de fato destruída, portanto não pode mais ser recuperada após esta operação. Outras maneiras de tornar uma imagem totalmente transparente são apresentadas em Tela Transparente.

Alpha Extract

O método 'Extract' simplesmente copia a máscara 'alfa' da imagem como uma máscara de canal em tons de cinza.

  magick moon.png  -alpha extract    alpha_extract.png

[IM Output] [IM Output]

Observe que totalmente opaco é branco, enquanto totalmente transparente é preto puro. Como a imagem continha alguns pixels semitransparentes ao longo das bordas (para a suavização de serrilhado, dando à forma da imagem uma aparência mais lisa), esta imagem não é preto e branco puro, mas também contém alguns pixels de cor cinza ao redor das bordas. Se o seu ImageMagick for uma versão IMv7 antiga, esta é uma técnica (quase) equivalente, usando extração de canal.

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

O método '[Extract](#alpha_extract)' também desligará ('[Off](#alpha_extract)') o alfa, mas ele não é apagado, então ligar o canal alfa novamente ('[On](#alpha_extract)') recriará uma máscara de forma da imagem original. |

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

[IM Output]
Observe que todas as cores originais terão sido substituídas por branco, com vários tons de cinza ao redor das bordas. Podemos ver isso se removermos a transparência com um fundo branco (veja o método Alpha Remove abaixo). |

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

[IM Output]
Esses pixels 'cinza' são, na verdade, bem aproveitados em Contornos de Borda a partir de Formas Suavizadas para gerar uma borda ou contorno liso a partir da forma de uma imagem. Esse efeito colateral de salvar o canal alfa tem benefícios específicos ao usar o Operador Shade, que não entende nem usa o canal alfa de uma imagem. Veja a subseção Mascarando Formas Sombreadas.

Alpha Copy

O método 'Copy' é o inverso de '[Extract](#alpha_extract)' e, essencialmente, executa um CopyOpacity contra si mesmo. Ou seja, ele transforma uma imagem em tons de cinza (independentemente de seu canal alfa estar ativado ou não) em uma imagem de máscara de forma.

  magick alpha_extract.png  -alpha copy   alpha_copy.png

[IM Output] [IM Output]

Não importa se a imagem tinha ou não um canal alfa existente; tudo o que ele faz é criar a transparência da imagem a partir dos valores em tons de cinza da imagem. Uma vez que você tenha uma máscara de forma, pode usar vários métodos de Coloração ou de composição alfa Duff-Porter para colori-la. Para exemplos de uso de uma máscara de forma, veja Máscaras como Formas Coloridas.

Alpha Shape

Para facilitar o uso de uma imagem em tons de cinza, o método 'Shape' não só cria uma máscara de forma (como em Alpha Extract), mas também a colore usando a cor de fundo atual.

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

[IM Output] [IM Output]

Isso significa que você pode colorir muito rapidamente uma máscara em tons de cinza simplesmente moldando a imagem e depois achatando-a sobre uma cor de fundo diferente |

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

[IM Output]
| Background não é, na verdade, a cor correta a ser usada para esta operação de coloração de 'forma'. Deveria usar a cor 'fill' para definir a cor de primeiro plano da forma. Portanto, é provável que a cor a ser usada mude. Background só é usada devido a dificuldades internas em acessar a cor de preenchimento atual. Essa mudança provavelmente ocorrerá como parte do IMv7.
---|---
Claro que uma maneira mais rápida e melhor de mapear uma imagem em preto e branco diretamente para cores específicas é usar o mais especializado Ajuste de Nível por Cor. Isso evitará a necessidade de ativar ou mesmo modificar o canal de transparência existente da imagem. |

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

[IM Output]
| O comando acima mapeará as cores usando um espaço de cor linear e pode precisar ser convertido para sRGB em algum momento para obter um gradiente de cores visualmente mais correto.
---|---

Alpha Remove

O método "[-alpha](https://imagemagick.org/command-line-options/#alpha) **Remove**" (adicionado no IMv6.7.5) foi projetado para remover a transparência de uma imagem, usando o "[-background](https://imagemagick.org/command-line-options/#background)" atual. |

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

[IM Output]
Observe que, embora a transparência seja 'removida', o canal alfa permanecerá ligado, mas agora será totalmente opaco. Se você não precisar mais do canal alfa, poderá usar Alpha Off para desativá-lo. Esta operação é simples e rápida e faz o trabalho sem precisar de uso extra de memória nem de outros efeitos colaterais que possam estar associados a técnicas alternativas de remoção de transparência. É, portanto, a maneira preferida de remover a transparência de uma imagem. Para outras técnicas, ou se o seu ImageMagick for anterior à v6.7.5, veja a discussão mais ampla Removendo a Transparência das Imagens abaixo.

Alpha Background

A partir do IM v6.5.2-10, foi disponibilizado um método 'Background' que define a cor oculta dos pixels totalmente transparentes com a cor de fundo atual. Normalmente essa cor não tem importância, pois só pode ser vista se o canal alfa for desligado. No entanto, a cor dos pixels totalmente transparentes é salva no formato de arquivo de imagem PNG e, para imagens grandes, ter cores totalmente transparentes aleatórias e desconhecidas pode afetar significativamente o tratamento de sua compressão. Veja PNG com Melhor Compressão e a Discussão do Fórum do IM Eliminating alpha channel garbage para mais detalhes. Observe que nenhuma mistura de cores é aplicada, apenas uma atribuição direta de cor a qualquer cor totalmente transparente. Os pixels, porém, permanecerão totalmente transparentes e, por isso, você não verá nenhuma mudança na imagem. Por exemplo, aqui eu o uso para definir todos os pixels totalmente transparentes como 'HotPink'. |

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

[IM Output]
Como você pode ver, isso não fez nenhuma mudança na aparência real da imagem. Para ver a mudança, vamos agora desligar o canal alfa. |

  magick moon_hotpink.png -alpha off moon_hotpink_off.png

[IM Output]

Isto não é o mesmo queRemover a Transparência

As bordas da forma terão tornado opacos todos os pixels semitransparentes e, como resultado, produziram efeitos de borda com forte serrilhado (em escada). Observe que até o formato PNG24, normalmente apenas opaco, ainda pode salvar transparência booleana se todas as cores totalmente transparentes forem iguais. Para detalhes, veja o exemplo em Sub-Formatos PNG. Esse processo de substituir as cores é, na verdade, quase o mesmo que fazer um "-channel RGB -fill _color_ -opaque None +channel". Veja Substituição Direta de Cor. Observe que muitos outros operadores de processamento de imagem também converterão quaisquer pixels totalmente transparentes em preto totalmente transparente (cor 'None'), pois essa é a cor equivalente a um zero matemático. Aqui está um resumo de algumas operações de imagem conhecidas por fazer isso, embora nenhuma seja tão direta ou rápida quanto 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

Esse último método (veja Fator de Fuzz e cores Transparentes) é particularmente útil, pois você pode definir não só todas as cores transparentes como preto totalmente transparente ('None'), mas também todas as cores quase totalmente transparentes (que, de outro modo, têm uma cor válida, mas praticamente invisível), simplesmente especificando um fator de fuzz. Ele produzirá alguma perda de dados, mas pode melhorar a compressão em imagens com muitas cores quase totalmente transparentes. Muitas vezes, esses pixels quase totalmente transparentes podem ter cores muito estranhas ou erradas, e este método permitirá que você remova esses pixels estranhos antes que causem outros problemas.

Removendo a Transparência das Imagens

Enquanto o Alpha Off simplesmente aciona um interruptor e desliga o canal de transparência, você também pode obter o mesmo efeito ao tentar salvar a imagem em um formato de arquivo que não permite o uso de transparência. Por exemplo, salvando em 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]

Lembre-se de que o Formato de Arquivo JPEG não salva o canal alfa (transparência) e, por isso, simplesmente o desligou. Neste caso, as partes transparentes ficaram pretas (um resultado típico). Mas, dependendo da origem da imagem, as áreas transparentes poderiam facilmente ter ficado com alguma outra cor aleatória ou inadequada. Além disso, em muitos casos, pixels semitransparentes podem ter cores muito estranhas que normalmente não são visíveis porque estão quase completamente transparentes. Simplesmente desligar a transparência fará esses pixels se destacarem de forma gritante, deixando o resultado ainda pior do que você poderia esperar. Veja, por exemplo, as bordas superior-esquerdas do 'A' acima. Em qualquer caso, simplesmente desligar a transparência normalmente NÃO é o desejado. A melhor solução é usar o método Alpha Remove para substituir de forma rápida e simples a transparência por uma base de cor de fundo... |

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

[IM Output]
A rigor, o Alpha Off não é necessário neste caso, pois salvar em JPEG faz isso automaticamente.
Técnicas alternativas de remoção de transparência consistem em, de algum modo, gerar uma nova imagem de 'fundo' ou 'tela' e usar Over Compose para compor a sua imagem sobre esse fundo, de modo que a transparência seja substituída. De preferência, preservando os metadados da imagem original, como perfis, rótulos, legendas e comentários que possam estar presentes. Métodos para gerar tal tela são exemplificados em Criando Telas de Imagem do Mesmo Tamanho. Aqui está um desses 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]
Outras maneiras mais simples de fazer isso consistem em usar uma operação que internamente cria uma 'tela de fundo clonada ' para você, gerando-a como parte da operação de processamento de imagem maior que o operador está executando. O método mais comum é Achatar a imagem. Esse operador é usado tão frequentemente para esse fim que o processo de remover a transparência muitas vezes é chamado erroneamente de 'achatamento'. Por exemplo... |

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

[IM Output]
Contudo, isso não funcionará com "[mogrify](basics.html#mogrify)" nem com uma sequência de várias imagens, basicamente porque o operador "[-flatten](https://imagemagick.org/command-line-options/#flatten)" foi realmente projetado para mesclar várias imagens em uma única imagem. O outro método comum que funciona com várias imagens é dar à imagem uma Borda de tamanho zero com o "[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)" apropriado. Por exemplo... |

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

[IM Output]
Outros operadores de processamento de imagem que estão intimamente relacionados aos métodos acima também podem remover a transparência de uma imagem. Entre eles: Mosaic, Merge e Frame. O operador Extent também pode ser usado e permite expandir ou recortar imagens ao mesmo tempo em que se remove a transparência, mas apenas se você souber o tamanho da imagem final desejada. Você não precisa substituir a transparência por uma cor sólida. Se usar uma composição manual (como mostrado acima), pode usar qualquer imagem como fundo de substituição. Um exemplo simples disso é usar o comando "[composite](basics.html#composite)" para dispor lado a lado (Tile) uma imagem 'sob' a original (usando Dst_Over). Esse método de composição garante que os metadados e o tamanho da imagem original sejam preservados. |

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

[IM Output]
| _Muitos dos métodos acima ou são afetados pela informação de tela virtual que uma imagem possa ter, ou podem destruí-la, como parte de seu processamento. Quando a tela virtual está envolvida, pode ser preciso examinar mais de perto os detalhes de cada operador. Em muitos casos, os efeitos da tela virtual podem ser úteis para o seu processamento de imagem em geral.

_
---|---

Transparência Alfa Booleana

Para alguns formatos de arquivo de imagem, você não precisa remover completamente o canal alfa, mas apenas permitir transparência pura ligado/desligado, ou seja, booleana. Formatos de arquivo de imagem indexados (com paleta), como GIF e PNG8, são típicos disso. Exemplos são vistos, no momento, em Transparência Booleana GIF, mas devem, eventualmente, ser movidos para cá.

Transparência de Contorno ou Halo

Às vezes, você vai querer adicionar um contorno ao redor de uma imagem que contém transparência. Uma maneira é usar Morfologia EdgeOut para obter rapidamente todos os pixels vizinhos da imagem original, colori-los e, em seguida, usar Composição Under (DstOver) com a imagem original.

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

[IM Output] [IM Output]

Isso pode ser particularmente útil ao criar imagens no formato GIF a partir de imagens PNG que contêm pixels de borda semitransparentes. Ele fornece uma quantidade mínima de cor de fundo, mas deixa o resto da imagem totalmente transparente. Veja GIFs sobre um Padrão de Fundo para mais sobre esse problema. Um método alternativo é gerar um halo suave semitransparente ao redor da forma. Para isso, aplicamos Desfoque e recolorimos a imagem, e então novamente usamos Composição Under (DstOver) com a 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]
Este último é, na verdade, semelhante a usar um efeito de Fonte Composta de Contorno Suave, mas usando uma imagem com forma em vez de texto anotado.


Usando Máscaras com Imagens

Mascarando uma Imagem

Como mostrado anteriormente, há algumas maneiras de mascarar uma imagem, de modo a tornar parte dela transparente. E o método que você escolhe depende de sua máscara de imagem ser uma máscara em tons de cinza ou uma máscara de forma.

Editando a Máscara de uma Imagem

A máscara de uma imagem é algo realmente útil de se ter. Podemos, por exemplo, apagar partes de uma imagem com muita facilidade modificando uma máscara da imagem original. Lembre-se de que o operador "[-draw](https://imagemagick.org/command-line-options/#draw)" não pode desenhar o nada e, atualmente, não tem opção de apagar. Aqui criamos uma imagem e, em seguida, extraímos e modificamos sua máscara, antes de restaurá-la à imagem 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]

Lembre-se de que "preto" em uma máscara é transparente, enquanto branco é opaco, então tudo o que precisamos fazer é desenhar preto sobre tudo o que não queremos visível. Não se esqueça da operação "-alpha Off" acima, pois ela é vital para garantir que a imagem em tons de cinza não contenha um canal transparente desnecessário. E, pronto, arrancamos uma mordida da imagem original. Também podemos readicionar uma parte da imagem que removemos. Por exemplo, aqui readiciono parte da 'mordida' que removi da imagem original, desenhando uma área branca sobre a máscara. A máscara é então novamente devolvida à imagem original usando Composição 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]

Apenas uma palavra de aviso sobre readicionar partes. Normalmente, o ImageMagick substitui qualquer cor totalmente transparente por preto, geralmente porque é assim que funciona a matemática por trás dos operadores. Afinal, ela é totalmente transparente e, portanto, sua cor normalmente não deveria importar. Isso significa que, se tornarmos opaca uma parte da imagem que não desenhamos antes, ela geralmente ficará preta, pois essa é a cor sob a transparência da imagem. Contudo, no exemplo acima, você deve ter notado que o formato de arquivo de imagem PNG preservou corretamente a cor original (tornada transparente) da imagem. Assim, a cor da parte readicionada permaneceu a cor original 'SteelBlue' da imagem original. Você não deve contar com isso se a imagem for salva em algum outro formato de arquivo ou modificada posteriormente.
Aqui está um método alternativo de apagar partes de uma imagem, mas, em vez de extrair e modificar uma Máscara em Tons de Cinza, usamos uma máscara de Forma como uma espécie de ferramenta de 'apagar', empregando o Método de Composição 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 você pode ver, às vezes as Máscaras de Forma são mais fáceis de lidar, pois você evita a necessidade de extrair e restaurar o canal alfa. Contudo, os Métodos de Composição Alfa Duff-Porter, que é o que estou usando, nunca permitirão restaurar cores que foram tornadas transparentes. Com esses métodos, tudo o que foi tornado transparente (e, portanto, com cor indefinida) permanece transparente. Na verdade, apagar partes de uma imagem usando os Métodos de Composição Alfa destruirá de fato a cor subjacente dos pixels totalmente transparentes. Não a preservará. Afinal, uma cor transparente não é, na verdade, uma cor real!

Máscaras como Formas Coloridas

Uma alternativa a apenas usar a máscara para adicionar ou readicionar transparência a uma imagem é, de fato, combinar a máscara diretamente com as imagens de várias maneiras. Por exemplo, suponha que só queiramos usar uma máscara como um símbolo ou forma que desejamos sobrepor a uma imagem em várias cores. Para isso, precisamos de uma máscara, que extrairei de uma fonte especial de 'símbolos'. |

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

[IM Output]
Observe que neguei a imagem do rótulo para torná-la uma imagem de máscara adequada, consistindo em um primeiro plano branco (opaco) sobre um fundo preto (transparente). A partir do IM v6.4.3-7, a maneira mais simples de converter uma máscara em tons de cinza em uma forma colorida é usar o operador Alpha Shape. Isso é exatamente como Alpha Copy, mas com uma etapa extra para colorir a forma final. |

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

[IM Output]
| Observe o uso do formato de imagem 'PNG' para a imagem com forma gerada, em vez de GIF, para evitar problemas com aTransparência Booleana GIF.
---|---
Antes disso, a solução mais simples era negar a máscara alfa em uma Imagem de Canal matte e depois usar Combine para gerar a imagem com forma. |

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

[IM Output]
A cor da máscara com forma, neste caso, é definida pela cor "[-background](https://imagemagick.org/command-line-options/#background)" que o Combine usou para preencher os canais indefinidos da nova imagem. Uma maneira mais antiga, porém mais complicada, é usar o método de composição '[CopyOpacity](compose.html#copyopacity)' para definir a transparência de uma imagem com a máscara fornecida e, em seguida, usar Coloração Uniforme para colorir a forma resultante. Isso funciona e, por muito tempo, foi a melhor técnica a se usar, mas não é mais recomendada. |

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

[IM Output]
Agora que você tem uma imagem com 'forma', pode simplesmente sobrepô-la a qualquer fundo que quisermos, como a imagem de rosa embutida, usando uma das muitas Técnicas de Sobreposição de Imagens e Métodos de Composição Alfa. |

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

[IM Output]
Isso é adequado se quisermos todos os nossos símbolos da mesma cor, mas exigiria várias imagens intermediárias se quiséssemos usar múltiplas cores, tornando-o impraticável para sobrepor muitos símbolos com muitas cores diferentes. Uma forma de fazer sobreposições multicoloridas é recolorir a imagem com forma imediatamente após ler a imagem. |

  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]
Observe que lemos apenas uma imagem com forma e depois recolorimos um Clone dessa imagem para cada nova 'camada' a ser sobreposta. Para mais exemplos de recolorir uma imagem base, veja toda a seção sobre Modificações de Cor. Veja também Desenhando Símbolos para um método alternativo de marcar locais específicos em uma imagem. Assim como um Exemplo de Sobreposição para Fixar Mapas para técnicas de sobreposição mais automatizadas.

Composição Matemática

Em vez de sobrepor a máscara a algum fundo, você pode estar interessado apenas em colorir a imagem usando somente as partes brancas ou pretas da própria máscara. Isso é relativamente simples, bastando usar alguns Métodos de Composição Alfa Matemáticos para mudar a cor da máscara de forma a corresponder a uma cor, ladrilho ou outra imagem. Por exemplo, o método de composição '[Multiply](compose.html#multiply)' substituirá as áreas brancas (valor de multiplicação 1) pela imagem sobreposta, deixando as áreas pretas (valor de multiplicação 0) pretas. O operador '[Screen](compose.html#screen)' é exatamente igual a '[Multiply](compose.html#multiply)', mas com as imagens negadas, de modo que efetivamente substitui as áreas pretas da imagem. Por exemplo, vamos usar a imagem de máscara maior acima para sobrepor uma imagem maior gerada com um padrão de ladrilho.

  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]

O método de composição alfa '[Multiply](compose.html#multiply)' é especialmente útil para substituir o fundo de imagens de texto (isto é: texto preto sobre fundo branco), como imagens geradas a partir de Documentos PostScript.

Composição Alfa com Máscara

A forma especial de três imagens da Composição Alfa com Máscara permite usar a mesma máscara para mesclar diretamente duas imagens. |

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

[IM Output]
A primeira imagem substituirá as partes de fundo preto da máscara, enquanto a segunda imagem substitui as partes de primeiro plano branco da máscara. A própria máscara é fornecida como a terceira imagem. A máscara é usada para selecionar e misturar duas imagens diferentes de modo a gerar o resultado final. É, na verdade, algo como uma Mistura (Blend) mapeada das duas imagens. Lembre-se de que o tamanho final e os metadados da imagem resultante virão da primeira imagem de 'fundo' da operação acima (partes pretas), então troque as imagens e use Negate na máscara se quiser o contrário. E, por fim, lembre-se de que, se você usar o comando "[composite](basics.html#composite)" em vez de "[convert](basics.html#convert)", a imagem de 'sobreposição' (partes brancas) é fornecida primeiro, com a imagem de 'fundo' (partes pretas) em segundo. Em outras palavras, as duas primeiras imagens precisam ser trocadas para esse comando.

Alinhando Duas Imagens com Máscara

Em Construção

Sobre alinhar duas imagens com máscara...

Se suas máscaras forem puramente booleanas, você não deverá ter problemas, seja como for que
as aplique.  Contudo, máscaras que contenham bordas 'suavizadas', 'cinza' ou
'semitransparentes' para deixá-las com 'aparência lisa' podem ser uma séria
dor de cabeça se você não as tratar de forma adequada e com cuidado.

O restante desta discussão é sobre máscaras 'suavizadas'.

As máscaras suavizadas que se unem vêm em dois estilos...

 * As que se encaixam como peças de quebra-cabeça OU
   como um pino com forma em um buraco com forma (fronteira compartilhada)

 * Máscaras destinadas a sobrepor uma área sólida (em camadas)

A segunda é fácil de lidar e é o efeito normal que se obtém ao sobrepor
alguma forma colorida sobre uma imagem totalmente opaca.  Essencialmente, você usaria
a composição 'over' para compor a forma.

As primeiras, as máscaras 'quebra-cabeça', porém, são mais difíceis.  Tais máscaras não devem
se sobrepor nem se subpor umas às outras.  E, ainda assim, se você tentar uni-las
usando a composição 'over' óbvia e normal, você acabará com uma
junção semitransparente onde as 'bordas suavizadas' são mescladas.

_Exemplo de uma junção ruim de 'máscara quebra-cabeça' (over)_

A maneira correta de unir máscaras e imagens 'quebra-cabeça' com forma é usar
a composição **Plus** para 'somar' as imagens, com um fundo
preto ou totalmente transparente.

_Exemplo de uma junção correta de 'máscara quebra-cabeça' (plus)_


Para outro exemplo de junção manual de imagens, usando 'Dst-In', 'Dst-Out' e
composição 'Plus', veja exemplos em...
  https://usage.imagemagick.org/compose/#dstin

Também abordo esse detalhe de junção no relatório de bug de composição alfa de 3
imagens [Composite Mask Bug
- Fixed](https://usage.imagemagick.org/bugs/composite_mask/#correct).

Para mais sobre a diferença entre 'over' e 'plus', veja ['Blend' (plus) vs 'Dissolve' (over)](compose.html#blend_dissolve)

Exemplos de junção correta de peças alinhadas pelas bordas são mostrados em
[Cubos 3d - Afim](distorts.html#cube3d) e, novamente, em [Caixas 3d - Perspectiva](distorts.html#box3d)
e no Cubo Isométrico usando Cisalhamentos
  https://usage.imagemagick.org/warping/#sheared_cube

Os principais problemas nesses exemplos são que as partes individuais NÃO foram
geradas usando a mesma máscara, mas distorcidas até suas posições finais.
Assim, elas não se encaixam nem se unem perfeitamente.

Esses exemplos precisam ser atualizados para usar um método de composição 'Plus'.  Para
gerar resultados melhores, mas, mesmo assim, provavelmente ainda não ficarão totalmente
'corretos', pois as máscaras não se 'encaixam' exatamente.

Gerando Máscaras Corretas Alinhadas pelas Bordas

A melhor ideia é usar a mesma máscara (negada) para AMBAS as peças, em vez de
tentar desenhar as duas máscaras separadamente. Caso contrário, as duas máscaras
se sobrepõem OU deixam uma lacuna, exatamente como você viu.

Métodos corretos de junção de máscaras..

    * use a máscara para definir a transparência em uma peça
      use a máscara negada para definir a transparência da outra peça
      some ('Plus') as duas peças.

    * Use a máscara para Adicionar transparência a apenas uma peça e, em seguida,
      use 'Over' para compor essa peça sobre uma imagem completa.

    * use uma composição com máscara de três imagens
      veja https://usage.imagemagick.org/compose/#mask
      e https://usage.imagemagick.org/masking/#masked_compose
      Que usa a máscara para selecionar resultados de duas imagens diferentes.

Lembre-se de que 'Over' só precisa que a imagem de 'origem' ou de 'sobreposição' seja mascarada; a
imagem de fundo não deve ter bordas semitransparentes alinhadas.
Mas uma composição 'plus' precisa que ambas as imagens sejam mascaradas com uma máscara negativa exata
uma da outra, alinhando a borda unida.

AVISO:  O Draw atualmente NÃO permite gerar duas formas que se
encaixem corretamente sem sobreposição!!!!

Veja [Draw Fill Bounds](draw.html#bounds) para detalhes.

Não verifiquei o SVG para ver se ele tem o mesmo problema.

Máscaras de Imagem Especiais

Máscaras de Escrita - Protegendo Pixels contra Alteração

Uma máscara de 'escrita' ou de 'recorte' (clip-mask) é uma imagem especial em tons de cinza que é adicionada a uma imagem existente do mesmo tamanho. Ela define áreas da imagem que devem ser classificadas como 'imutáveis' ou 'não graváveis' pela maioria dos operadores de processamento de imagem. O operador "[-mask](https://imagemagick.org/command-line-options/#mask)" recebe uma imagem externa para ser vinculada às imagens em memória. A forma 'plus' do operador "[+mask](https://imagemagick.org/command-line-options/#mask)" remove a máscara da imagem. Por exemplo, aqui uso uma 'máscara de escrita' para proteger os pixels do fundo contra a escrita, enquanto rotaciono os matizes, para recolorir a rosa vermelha em primeiro plano em uma rosa azul.

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

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

A máscara é um pouco tosca, mas funcionou bem. Apenas lembre-se de que uma 'máscara de escrita' é usada para especificar a parte a ser protegida ou preservada. Lembre-se, no IMv7...

O operador "[-mask](https://imagemagick.org/command-line-options/#mask)" define uma máscara de 'proteção contra escrita'

Para um exemplo mais avançado, veja Mascaramento com Chroma Key, que trata mais de gerar a máscara do que de aplicá-la como uma máscara de escrita. Máscaras de escrita ou de recorte foram projetadas para funcionar quando os pixels de uma imagem estão sendo modificados diretamente. Por exemplo: negate, level, coloração, modulate, desenho, composite, morfologia, convoluções. Para operadores que geram imagens NOVAS (resize, distorts, extent, etc.), ela não conseguirá preservar os pixels originais, pois a máscara não poderá corresponder ao novo tamanho da imagem. Tais operações também terão o efeito colateral de remover ou desativar a 'máscara de escrita' das imagens. Aqui está outro exemplo...

  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]

Observe que as bordas tanto da máscara quanto da imagem resultante são lisas (suavizadas); isso ocorre porque a máscara não é simplesmente uma máscara booleana, mas uma máscara de mistura. A 'máscara de escrita' é uma máscara de mistura no sentido de que os pixels 'cinza' na máscara produzirão uma mistura dos novos pixels com os valores antigos da imagem, conforme a quantidade de cinza presente. Isso produz bordas muito lisas e também permite gerar um gradiente ao longo da imagem entre as áreas modificadas e não modificadas. Contudo, uma máscara de mistura, embora adequada para uma única operação, pode não ser boa quando usada em várias operações, pois seu efeito de mistura será então aplicado várias vezes. Esse problema é especialmente comum em uma operação em laço, como a morfologia. Mas apenas se você usar uma máscara de mistura não booleana. Se isso for um problema, provavelmente será melhor simplesmente fazer todas as operações contra uma cópia da imagem e depois usar Composição Alfa com Máscara contra a imagem original. Recomenda-se cautela.
Esse uso de mascaramento é, na verdade, exatamente como funciona o Mascaramento de Composição! Mas apenas durante a aplicação do operador de composição.

  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]

É equivalente (com uma 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]
Ou seja, a máscara é negada e, em seguida, aplicada à primeira imagem de 'destino'. A segunda é então composta sobre a primeira imagem, modificando apenas as áreas 'brancas' da imagem de máscara original.

Uma operação "[-composite](https://imagemagick.org/command-line-options/#composite)" de três imagens usa uma máscara de 'escrita'

Na morfologia, as máscaras de escrita são normalmente usadas para gerar uma forma de Morfologia Condicional ou Restrita de uma operação. Um exemplo desses foi discutido no fórum de discussão do IM, Cleaning up noise around text, para limitar os efeitos de uma dilatação. NOTA: -crop deveria ser capaz de preservar a máscara de imagem de imagens individuais, recortando também a máscara e atribuindo-a às novas imagens. Isso, porém, atualmente não é feito.

Máscara de Recorte e Caminhos de Recorte

A forma "[-clip-mask](https://imagemagick.org/command-line-options/#clip-mask)" deste operador é quase exatamente igual à anterior, mas fornece apenas um estilo de mascaramento booleano (tudo ou nada). Como resultado, você não consegue obter um resultado 'misturado' ou suavizado. Por exemplo... |

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

[IM Output]
Como você pode ver, o resultado é altamente serrilhado (com bordas em escada), pois um "[-clip-mask](https://imagemagick.org/command-line-options/#clip-mask)" não produz um resultado misturado como o "[-mask](https://imagemagick.org/command-line-options/#mask)" faz. A única coisa boa nisso é que é ligeiramente mais rápido (embora não muito). Ele foi fornecido originalmente para permitir o tratamento de Caminhos de Recorte em arquivos de imagem TIFF e é um operador muito antigo (IMv5). O operador mais recente "[-mask](https://imagemagick.org/command-line-options/#mask)" deve ser usado em seu lugar. | _No IMv7, uma 'máscara de escrita' e uma 'máscara de recorte' são implementadas lado a lado, mesmo que tecnicamente façam exatamente a mesma função. Assim, você poderia aplicar ambas as máscaras simultaneamente.

Contudo, usar ambas ao mesmo tempo não é recomendado, e os resultados não são definidos. Além disso, essa forma de 'máscara booleana' foi removida do IMv7.

_
---|---

Caminhos de Recorte para imagens TIFF

Um 'caminho de recorte' faz parte do formato de arquivo de imagem TIFF e define um caminho vetorial usado para definir uma 'área com forma' dentro da imagem TIFF. No IM, os operadores "[-clip](https://imagemagick.org/command-line-options/#clip)" e "[-clip-path](https://imagemagick.org/command-line-options/#clip-path)" leem esse 'clip-path' e o convertem em uma Máscara de recorte (acima). Assim, ele define uma 'máscara de escrita' que protegerá a forma contra modificação. Um clip-path armazenado na imagem TIFF é definido como um Desenho de Caminho SVG, que você pode extrair de um formato de arquivo de imagem TIFF usando...

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

O maior problema que as pessoas costumam ter é tornar transparente tudo o que não está recortado. O que exige que você escreva nas áreas que a máscara protege contra escrita! Esta é uma solução, que converte a imagem inteira em transparência, depois ativa o 'clip path' e então torna as partes agora graváveis opacas (visíveis) novamente.

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

O operador "[+clip](https://imagemagick.org/command-line-options/#clip)" também desliga e remove a máscara de recorte (assim como "[+clip_mask](https://imagemagick.org/command-line-options/#clip_mask)" faz). Contudo, nenhum formato de arquivo salva a máscara de recorte atual junto com a imagem, para qualquer formato de arquivo de imagem. (Ao menos no IMv7)

Máscaras de Leitura - Ignorar a Entrada de Pixels

É importante notar que uma máscara de escrita limitará quais pixels serão escritos em uma imagem. Ela não limita, porém, quais pixels estão sendo 'lidos' como parte da operação em execução, para criar os novos dados de pixel que estão sendo escritos. Isso basicamente significa que, se você usar um operador do tipo 'efeito de área' ou 'vizinhança', como Desfoques, Morfologia ou Convolução, então os 'pixels graváveis' próximos à borda podem incluir valores de cor da área mascarada, ou não gravável. Por exemplo, aqui protegemos contra escrita a rosa em primeiro plano antes de desfocar a imagem. Ou seja, queremos desfocar apenas a parte do fundo da imagem, de forma bastante intensa neste caso.

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

[IM Output] [IM Output] [IM Output]
O resultado usa uma Máscara de Proteção contra Escrita e não é o que se queria.

Como você pode ver, embora as cores do primeiro plano estivessem protegidas pela máscara, as cores ainda foram usadas como parte do desfoque do fundo ao redor da rosa. Por causa disso, o fundo desfocado próximo ao primeiro plano tem uma tonalidade ou halo avermelhado distinto. Em outras palavras, as cores do primeiro plano 'vazaram' para o fundo ao redor. Isso geralmente não é o que as pessoas pretendem fazer quando querem desfocar o fundo de uma imagem, como parte de um efeito de foco de lente. O que as pessoas realmente querem é fazer o desfoque 'ignorar' completamente os pixels do primeiro plano e permitir que apenas as cores do fundo façam parte do processo de desfoque. Ou seja, elas queriam impedir que o desfoque 'lesse' os pixels do primeiro plano.

Solução de Máscara de Leitura para o IMv7

No IMv7, a única maneira de tornar um pixel ilegível é torná-lo transparente. Pixels transparentes não têm cor, por definição, e por isso a 'cor oculta' não faz parte dos cálculos feitos pela operação de desfoque. Isso nos dá um 'truque'. Torne os pixels do primeiro plano transparentes, aplique a operação de desfoque (ou outra) e desligue a transparência (ela não é realmente desejada neste caso). Então podemos restaurar a parte do primeiro plano da imagem. Se isso parece complexo, é mesmo. Aqui estão as etapas envolvidas, mostrando imagens intermediárias para tentar deixar a técnica clara...

  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]

O resultado é a remoção do efeito de halo vermelho que antes 'vazava' para o fundo desfocado. Aqui está uma comparação lado a lado das versões com máscara de escrita e com máscara de leitura do desfoque de fundo, para que você possa ver claramente como removemos o 'vazamento' da cor do primeiro plano para o fundo. [IM Output]
Escrita | [IM Output]
Leitura
---|---
Diferenças entre os Métodos de Mascaramento
O exemplo acima pressupõe que a imagem original não tem alfa. Se uma imagem também contiver um canal alfa, então você precisa separar e processar o alfa separadamente, dobrando o esforço. Um exemplo disso é mostrado em uma discussão sobre 'distort resize', que queria ignorar os pixels virtuais que cercam a imagem sendo redimensionada com distort. Veja Redimensionamento Correto (usando distorts) para detalhes. Observe que o exemplo acima também está muito relacionado a uma técnica de Preenchimento de Buracos com desfoque. A única diferença é que é o fundo que está sendo preservado de modificação, não o primeiro plano. O que a torna um pouco mais simples. Verdadeiras 'máscaras de leitura' deveriam estar disponíveis no IMv7 para tornar o exemplo acima simplesmente adicionar tanto uma 'máscara de leitura' quanto, opcionalmente, uma 'máscara de escrita'.


Regiões e Sub-Imagens de Região

Regiões são outra maneira de limitar os efeitos das operações a uma área menor de uma imagem. Por exemplo, aqui eu colorizo toda a região retangular de vermelho... |

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

[IM Output]
Você também pode tornar uma região transparente... |

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

[IM Output]
Observe que precisei garantir que a imagem original tivesse um canal alfa ativado antes de tornar a 'imagem de região' transparente. Se isso não fosse feito, o IM tornaria qualquer transparência na 'imagem de região' vazada (see-thru), e você não veria nenhuma mudança. Veja Como as Regiões Funcionam abaixo para detalhes. | Antes do IM v6.6.9-5, a preservação da transparência estava com defeito, e o resultado da transparência em uma região era sempre "vazado para a original". Assim, o resultado do exemplo acima não incluiria nenhum pixel transparente, mesmo que a imagem permitisse o uso de transparência.
---|---
As maiores razões para usar Regiões são que ela não apenas limita seu efeito a uma área pequena, mas na verdade extrai aquela área retangular da imagem e aplica todas as Operações Simples que se seguem a essa área menor. Isso significa que, se você estiver modificando apenas uma área muito pequena de uma imagem muito grande, digamos, por exemplo, fazendo remoção de olhos vermelhos, então você não só limita o escopo das operações a essa área, como também a executa muito mais rápido, e a própria imagem de região extraída é menor. Em resumo... Uma Máscara de Escrita executará operações sobre a imagem inteira, mas limitando quais pixels são de fato alterados, enquanto Regiões usam uma sub-imagem extraída menor. Observe que nada impede você de usar ambos os métodos juntos. Porém, se você aplicar uma máscara de recorte a uma região, a máscara de recorte deve corresponder ao tamanho da imagem de região que foi extraída.

Deformando uma Região Local

Como uma 'região de imagem' de fato extrai uma 'pequena sub-imagem' da original para processamento, você pode aproveitar as Distorções Circulares 'localizadas' especiais para deformar pequenas regiões da imagem original. Por exemplo, aqui temos uma linha de listras.

  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]

Agora, ao definir regiões, podemos distorcer a linha de maneiras diferentes em áreas diferentes.

  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]

Observe que "-implode" e "-swirl" se encaixam muito bem no uso de regiões, pois têm a propriedade de que a borda externa da imagem distorcida coincide com o resto da imagem fora da região definida. Ou seja, elas são de fato projetadas para realizar 'deformação de imagem localizada '. Observe que, quando usei a Distorção Wave, tive de recortar o tamanho da imagem 'wave' resultante para que ela voltasse a caber na área original de onde foi extraída. Lembre-se de que Regiões só funcionam quando usadas com Operadores Simples de Processamento de Imagem. Qualquer outro operador, incluindo outro operador "-region", cancelará o processamento de região antes que essa operação seja aplicada.

Como as Regiões Funcionam, e seus Problemas

Na verdade, a maneira como as regiões funcionam é...

  • Extrai da imagem uma imagem menor de acordo com o operador "-region", usando um simples recorte com o argumento de região.
  • Aplica quaisquer Operadores Simples de Processamento de Imagem que se seguem à imagem menor.
  • Quando um Operador de Imagem não Simples é encontrado, OU outro operador "-region" é encontrado, OU a região é desligada usando "+region", então a região extraída é sobreposta à imagem original em seu local de extração.

A região funciona de uma maneira semelhante ao uso de Operadores de Pilha de Imagens, embora existisse no ImageMagick muito antes desses operadores. Ela era, por exemplo, parte integrante da versão 5 do IM. Por exemplo, se você tiver esta Operação de Região...

  ... -region WxH+X+Y  ...simple-operators... +region ...

o resultado é equivalente a isto (para uma única imagem)...

  ... \( +clone -crop WxH+X+Y ...simple-operators... \
         \) -geometry +X+Y -composite   ...

Ou isto (para várias imagens)...

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

Como a 'imagem de região' é de fato sobreposta à 'imagem original' é um pouco complicado... Se a imagem original não tiver nenhum Canal de Transparência ativado, a 'imagem de região' é composta usando Composição Over. Isso significa que as áreas transparentes na imagem de região ficarão vazadas, permitindo que você veja a imagem original por trás dela. Por exemplo, aqui desliguei propositalmente a transparência na imagem original, mas então Rotacionei a região de modo a produzir algumas áreas de transparência nos cantos. |

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

[IM Output]
Como você pode ver, os cantos da área rotacionada (que era transparente na 'imagem de região') mostram a 'imagem original'. Basicamente, como a imagem original não consegue lidar com transparência, a imagem de região é simplesmente sobreposta, com cantos vazados. Se a imagem original contiver Transparência ativa, então a transparência na imagem de região modificada também pode ser modificada, de modo que a transparência é apenas 'copiada' como está. |

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

[IM Output]
Como você pode ver, o IM usa uma Composição Copy, de modo que qualquer transparência que exista na imagem de região também será copiada para a imagem original. Se, por algum motivo, você quiser que a imagem original preserve sua transparência original, Desligue o Alfa primeiro e, depois que a imagem de região tiver sido restaurada, Ligue-o novamente para restaurá-la.
Imagens de região que são ampliadas ou reduzidas podem não 'caber' de volta na original. Por exemplo, aqui redimensiono (e colorizo) a imagem de região para que ela fique menor... |

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

[IM Output]
Como você pode ver, a região original não foi coberta pela imagem de região que foi restaurada. Assim, as partes não cobertas não foram substituídas. De modo semelhante, se a região ficar maior, mais da imagem original pode ficar coberta pela imagem de região sobreposta. |

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

[IM Output]
Em ambos os casos, o deslocamento superior-esquerdo da região não se move. Você não pode simplesmente reduzir uma imagem de região e centralizá-la dentro da área da região, nem pode posicionar a imagem de região em outra posição. Deve-se ter cautela para evitar que as imagens de região mudem de tamanho. Embora, em algumas circunstâncias especiais, você ainda possa lidar com uma região redimensionada. Para um exemplo disso, veja o exemplo da 'distorção wave' acima. | _Assim como "[mogrify](basics.html#mogrify)", você não pode mesclar várias sub-imagens, pois isso requer o uso de uma operação de imagem não simples. Contudo, você pode usar "[-draw](https://imagemagick.org/command-line-options/#draw)" como um método de composição alternativo. Veja Composição Alfa no Mogrify para um exemplo.

_
---|---
| _No momento em que isto foi escrito, a 'imagem de região' ainda contém oDeslocamento de Tela Virtual do Recorte de sua extração da imagem original. Isso pode, ou não, ser considerado um bug, dependendo de você achar essa informação útil ou não. O deslocamento atualmente não é usado quando uma imagem de região é restaurada.

Se o deslocamento não for desejado (pois interfere em um operador como Distort), siga a opção "[-region](https://imagemagick.org/command-line-options/#region)" com um operador "[+repage](https://imagemagick.org/command-line-options/#repage)" para remover o deslocamento das imagens de região. Sua remoção ou modificação não afetará sua restauração de volta à imagem original.

_
---|---


Remoção de Fundo

Um dos problemas mais comuns no processamento de imagem é gerar uma máscara a partir de uma imagem totalmente opaca existente. Tais imagens são comumente baixadas da World Wide Web, ou geradas por programas, ou estão em formatos de imagem que não fornecem nenhuma forma de transparência. Também pode ser que você tenha uma foto de algum objeto e queira remover o fundo. Lembre-se de que as fotos não têm nenhum entendimento de transparência, então você mesmo precisa remover as partes indesejadas. Infelizmente, não há solução geral para esse problema, especialmente quando você também deseja manter qualquer borda semitransparente da imagem. Consequentemente, há centenas de maneiras e variações de realizar essa tarefa, todas dependentes da situação exata. Intimamente relacionado ao mascaramento de imagens está o ajuste da transparência para corresponder a um fundo sobre o qual uma imagem será sobreposta. Isso é discutido em detalhes como parte da gravação no Formato de Arquivo de Imagem GIF, que só permite transparência booleana.

Mascarando Fundos Simples (floodfill)

Quando o fundo de uma imagem é uma única cor sólida simples, muitas vezes você pode gerar máscaras simples (e a remoção de fundo) apenas fazendo Substituição de Cores em Imagens. Por exemplo, aqui está um mascaramento direto por floodfill de uma imagem com um fundo de cor sólida. |

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

[IM Output]
Bem, isso não funcionou, pois o ponto de 'semente' (seed) do floodfill no canto superior-direito não alcança de fato todas as partes da imagem!!! A solução para isso é ampliar ligeiramente a imagem, de modo a fornecer um caminho para o floodfill alcançar todas as bordas externas da imagem. Contudo, para isso, você precisa saber a cor do fundo. |

  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]
Claro que não especificamos um Fator de Fuzz muito bom. O problema disso é que você obtém um halo ao redor do objeto dentro da imagem. Isso ocorre porque a maioria das imagens contém pixels especiais ao longo das bordas que suavizam a aparência da imagem. Contudo, como esta imagem tem uma boa borda preta, em relação ao fundo, usar um valor de fuzz bem grande pode ser usado para separar bem a imagem do fundo. |

  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 tem alguns problemas. Primeiro, é um mascaramento de tudo ou nada da imagem, produzindo bordas serrilhadas, em escada e muitas vezes de aparência horrível. Isso é adequado para o limitado formato de arquivo de imagem GIF, mas não muito bom se você planeja sobrepor essa imagem a outro fundo. Também é muito, muito difícil obter cada pixel de borda de suavização. Assim, se eu sobrepuser a imagem acima a um fundo preto, você poderá ver alguns pixels que são muito mais brancos do que o normal. |

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

[IM Output]
Além disso, se você conseguir usar um fator de fuzz alto o suficiente, provavelmente terá o problema de sobrarem poucos pixels de borda, ou de 'vazamento' para o centro da imagem. Por fim, um floodfill direto como este não funciona para um fundo que não seja uma única cor sólida simples.

Recortando Objetos com Borda

Imagens com uma borda de cor única existente têm uma vantagem distinta para esses métodos de remoção de fundo, pois a borda fornece um limite definido entre o que é 'interno' e o que é 'externo' à imagem, e isso, por sua vez, permite usar um método melhor de especificar o limite da imagem de fundo. Ou seja, em vez de especificar quais cores devem ser consideradas fundo, podemos, em vez disso, especificar quais cores marcam a borda do objeto que está sendo mascarado. Além disso, como a cor da borda é conhecida, apenas duas cores específicas terão sido misturadas ao redor das bordas da imagem. Ou seja, ambas as cores são conhecidas e, assim, exatamente o quão transparentes as bordas devem ser também é muito bem conhecido.

Em Construção

Removendo um Fundo Conhecido

Embora a remoção de um fundo simples para uma máscara 'Booleana' seja relativamente direta, as coisas ficam mais complicadas quando o fundo não é tão simples. Contudo, se o próprio fundo for conhecido, você pode usá-lo para ajudar em sua remoção de outras imagens. A partir do IM v6.3.4, foi adicionado um método especial de Composição Alfa chamado '[ChangeMask](compose.html#changemask)', que permite a remoção direta de um fundo conhecido de uma imagem. Por exemplo, aqui temos uma imagem de fundo inalterada e outra que foi sobreposta por uma imagem GIF com uma transparência Booleana simples (ligado/desligado direto). Usando '[ChangeMask](compose.html#changemask)', podemos recuperar essa imagem sobreposta original (se ela for muito diferente do fundo).

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

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

Basicamente, o que isso faz é determinar quão 'diferentes' são os pixels de uma imagem para a outra e, se a diferença for menor que o Fator de Fuzz atual, tornar esse pixel transparente. Apenas pixels totalmente transparentes são adicionados à imagem; caso contrário, a imagem original é deixada como está, transparência e tudo mais. Podemos simular o operador usando o antigo método de composição '[Difference](compose.html#difference)' para gerar uma Imagem de Diferença de Comparação...

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

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

Como você pode ver, a imagem de diferença é preta para todas as partes inalteradas e uma mistura de cores para as partes que mudaram. Ao separar e somar os canais de cor individuais e aplicar um limiar, obtemos uma máscara de qualquer diferença em qualquer canal entre as duas imagens. |

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

[IM Output]
Usando esta máscara, podemos definir como transparente tudo o que não mudou. |

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

[IM Output]
Como você pode ver, o método de composição '[ChangeMask](compose.html#changemask)' torna esse processo muito mais fácil. Contudo, isso apresenta apenas um estilo de mascaramento de fundo 'ligado/desligado'. Não permite bordas difusas ou suavizadas, nem uma suavização de bordas transparente do resultado.

Mascaramento por Imagem de Diferença e Suavização de Bordas

O que foi visto acima pode ser levado adiante para imagens que têm bordas serrilhadas, bem como fundos não simples. Por exemplo, aqui temos um 'Ciclope' sobre um fundo branco, que queremos extrair. Geramos então uma imagem em tons de cinza das diferenças entre esta imagem e a cor de fundo (definida pelo pixel mais à esquerda-superior). |

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

[IM Output] [IM Output]
Claro que esta imagem de diferença não serve diretamente como máscara. Se você a usasse, tornaria efetivamente a maior parte da sua imagem semitransparente, em vez de apenas o fundo ao redor. Contudo, a partir desta imagem de diferença, um enorme número de máscaras de transparência diferentes pode ser criado, dependendo exatamente do que você está tentando alcançar. Podemos ajustar a imagem de diferença acima para produzir uma máscara de todos os pixels que sejam, mesmo na menor quantidade, diferentes da cor de fundo. |

  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 você pode ver, um 'qualquer diferença' booleano resultou na inclusão de uma boa parte do fundo original. Isso ocorre porque a imagem original está 'suavizada' ou levemente desfocada com o fundo (neste caso, foi causado pelo redimensionamento da imagem original a partir de uma imagem no formato JPEG). Isso não seria um problema se a própria imagem original fosse uma sobreposição Booleana (por exemplo, uma imagem no formato GIF, sobreposta a um fundo). Nesse caso, o seu resultado será perfeito (veja o exemplo do 'ChangeMask' acima). Variando o "[-threshold](https://imagemagick.org/command-line-options/#threshold)", você pode adicionar um 'fator de fuzz' à máscara booleana (apenas ligado/desligado), de modo a aproximar a máscara da imagem propriamente dita. |

  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]
Observe que o olho da imagem do ciclope agora também é considerado um buraco transparente! Esse 'buraco' destaca a maior desvantagem de toda esta técnica. Partes do objeto da imagem que estão próximas à cor de fundo ou, pior ainda, que correspondem exatamente ao fundo, serão consideradas iguais ao fundo. Claro que isso pode ser desejável em imagens de objetos 'com buracos', como uma rosquinha, mas, para o nosso ciclope, um 'olho com buraco' é definitivamente um erro. O efeito de 'halo' original também pode ser desejável para algumas coisas, como texto, para torná-lo mais legível quando você quiser sobrepô-lo novamente a algum outro fundo 'ruidoso'. Você pode realçar o efeito de halo desfocando um pouco a máscara antes de aplicá-la, de modo que o 'halo' resultante fique diminuído com a distância. |

  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]
O efeito de 'halo' resultante pode ser modificado ainda mais usando mais Ajustes de Histograma na imagem de máscara, dando a você um controle muito preciso dos resultados para imagens específicas. Com os parâmetros certos, você pode ajustar o halo ao redor até que ele seja praticamente inexistente, embora eliminá-lo completamente dessa forma seja difícil. Veja a próxima seção para uma técnica aprimorada. Uma pequena quantidade de desfoque (digamos "-blur 0x0.707", ou raiz quadrada de 2) é, na verdade, recomendada ao gerar mascaramento por limiar, apenas para suavizar as bordas da máscara. Claro que o resultado não será booleano, então não tente salvá-lo em um arquivo de imagem no formato GIF. Este também é um exemplo de Suavização por Desfoque. Mas fique avisado de que não é exatamente o mesmo que a verdadeira Suavização de Formas usando Distância. Contudo, ao lidar com 'máscaras de bitmap' ou 'de limiar', como as que criamos acima, uma pequena quantidade de suavização por desfoque, seguida de uma quantidade maior de suavização por distância, provavelmente resultará no melhor resultado geral.

Recuperando Bordas Semitransparentes

A técnica de Mascaramento por Diferença que usamos acima pode ser usada com a técnica anterior de Mascaramento por FloodFill para resolver a maioria dos problemas que vimos com técnicas de mascaramento mais simples. Aqui examinamos uma técnica de mascaramento em várias camadas, mas que deve produzir uma remoção quase ideal do fundo das imagens, preservando os pixels de sombreamento de suavização ao longo da borda. Contudo, isso é limitado a imagens sobre um fundo conhecido e que tenham uma 'borda' de bom contraste com os pixels do primeiro plano. Para este exemplo, decidi usar algo que era muito difícil de separar, mas que mostrava MUITO mais pixels sombreados ao redor das bordas do que você teria normalmente para fins de suavização. Uma forma com um efeito 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]
Primeiro, precisaremos gerar uma imagem de diferença e, felizmente para nós, sabemos qual é a imagem de fundo. Claro que também funcionará igualmente bem para um fundo de cor simples, desde que haja um bom contraste que nos permita gerar duas máscaras. Basicamente, usando uma imagem de diferença, podemos remover qualquer influência da imagem de fundo e, a partir disso, gerar as 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]
Observe que desta vez processei ligeiramente a imagem de diferença em tons de cinza, limitando-a aos canais vermelho e verde, enquanto zerava o canal azul, produzindo uma imagem de diferença preto-amarela. Isso é engenhoso, pois libera o canal 'azul' para permitir a geração de uma máscara de floodfill limpa, separada da própria imagem de diferença. Tecnicamente, eu poderia zerar também o canal verde para poder usá-lo na segunda máscara. Mas não vamos nos adiantar. Agora precisamos de duas máscaras: uma máscara externa, definindo todas as áreas que definitivamente serão transparentes; e uma máscara que define o interior do objeto na imagem, sem gerar nenhum 'buraco' indesejado. Então, vamos preencher a imagem de fora para dentro, usando vários fatores de fuzz diferentes, para que possamos escolher as duas máscaras, interna e externa, 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%
---|---|---|---|---|---|---

As áreas azuis nas imagens acima são a área que está sendo mascarada. Lembre-se de que zeramos o canal azul para esse fim. A primeira máscara deve mascarar as áreas da imagem que definitivamente queremos tornar totalmente transparentes. Ou seja, as partes que definitivamente esperamos que sejam totalmente transparentes na imagem final. A área dentro da máscara ainda deve conter a maior parte da sombra de halo preto da imagem. Neste caso, temos muita interação entre a imagem propriamente dita e o resto do fundo, então escolhi um Fator de Fuzz de '1%', que ainda continha uma grande área ao redor da imagem. Em um caso mais típico, sem sombra, essa área pode ser ainda menor, até um valor não percentual como 5 ou 10. A segunda máscara deve ter um 'fuzz' grande o suficiente para consumir todos os pixels semitransparentes presentes. Ou seja, até a borda da imagem, e de preferência entrando nela, sem remover completamente a borda nem 'vazar' para a imagem propriamente dita (veja a última imagem acima). O negativo desta máscara representará, na verdade, todos os pixels que serão totalmente opacos (e, portanto, representarão o interior) na imagem final. Essa seleção pode ser difícil e pode exigir muita tentativa e erro para descobrir o melhor valor a usar. Para esta imagem, um fuzz muito alto de '32%' pôde ser escolhido sem grandes problemas. Basicamente, você quer tentar deixá-lo alto o suficiente para que a imagem final não contenha nenhum dos pixels de 'fundo' originais, mas sem que a máscara consuma (ou vaze para) o interior da imagem. Pode até exigir uma pequena edição manual para deixar a máscara perfeita quando houver uma lacuna na cor da 'borda' ao redor. Agora podemos usar esta máscara para extrair o 'núcleo' ou o interior da nossa imagem. Ou seja, as partes que temos certeza de que não contêm nenhuma semitransparência até o padrão de fundo que estamos removendo. |

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

[IM Output]
Observe como extraí a máscara azul das imagens mascaradas por floodfill. Além disso, devido à natureza de tudo ou nada do floodfill, a máscara mostrará fortes efeitos de escada ou serrilhado ao redor das bordas. Esse é o problema que a segunda máscara nos permitirá corrigir. Lembre-se de que esta imagem é apenas dos pixels que sabemos não interagir com o fundo original e que serão deixados como estão na imagem final. Ela não inclui nenhum dos efeitos de sombra nem os pixels de suavização que estou especificamente tentando recuperar. Recuperar esses pixels é onde reside o verdadeiro trabalho. Ao negar e subtrair (multiplicar) as máscaras, podemos gerar uma nova máscara que define a área onde queremos extrair os pixels de borda semitransparente ou de sombreamento... |

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

[IM Output]
Essa área é então usada para extrair os pixels de suavização da máscara de diferença, que define quão transparentes os pixels devem ser. Normalizamos esses pixels para obter uma transição suave de opaco para 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]
Quanto mais clara a cor na máscara acima, mais opaco o pixel será. Da mesma forma, quanto mais escura a cor, mais transparência ele terá. Observe que usei um fundo cinza aqui para garantir que as cores transparentes presentes na imagem não interfiram na Normalização da imagem. Sem isso, essa normalização falhará. A própria cor cinza uniforme não é importante, pois está fora da área da máscara, então será ignorada mais tarde. Agora que temos o nível de transparência correto, precisamos saber qual cor deve ser usada para esses pixels semitransparentes. Essa cor geralmente será a mesma que a cor da borda da imagem, neste caso, simplesmente, preto. Contudo, por causa da interação do fundo original, decidi optar por uma cor cinza-escura para a sombra | _Você precisará, de algum modo, descobrir qual deve ser a cor dos pixels semitransparentes, para poder definir a cor correta dos pixels de suavização.

Isto pode ser_

  1. Uma cor de borda fixa (por exemplo: quase preto, como neste exemplo)
  2. Use a cor dos pixels de borda totalmente opacos mais próximos (usando morfologia. VejaCor Esparsa como Operador de Preenchimento
  3. Calculada: uma vez que você conheça o alfa e a cor de fundo, pode subtrair a cor de fundo para corrigir a cor do pixel. VejaRemoção de Fundo usando Dois Fundos abaixo.

Basicamente, depende da sua imagem.
---|---
Já que estamos nisso, vamos também remascarar a imagem para deixar apenas esses pixels de borda especiais. |

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

[IM Output]
Tudo o que é necessário agora é sobrepor em camadas o 'núcleo' interno da imagem com os pixels de borda semitransparentes. |

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

[IM Output]
E, pronto, temos uma imagem com o fundo removido para produzir uma imagem perfeitamente suavizada, com bordas semitransparentes e sombreamento corretamente recuperados. Você pode até sobrepô-la a um fundo completamente diferente. |

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

[IM Output]
A imagem que usei para este exemplo é muito difícil, com uma grande região de 'borda'. A maioria das imagens não é nem de longe tão ruim, mas este método é provavelmente a melhor e mais universal técnica de remoção de fundo. Isso foi agora colocado em um script de shell chamado "**[bg_removal](../static/img/scripts/bg_removal)**", que usa um único comando, sem arquivos temporários, e tem várias opções extras sobre os métodos pelos quais o mascaramento é realizado.

Remoção de Fundo usando Dois Fundos

O principal problema com as técnicas anteriores é que você realmente não tem informação suficiente para recuperar completamente todas as informações sobre o objeto em primeiro plano. Você realmente precisa recuperar duas informações: quão transparente é cada pixel do objeto em primeiro plano e qual é a sua cor original. E não é possível recuperar perfeitamente ambas as informações a partir de apenas uma imagem. Mesmo quando você sabe exatamente como é a imagem de fundo, não pode simplesmente subtraí-la do objeto em primeiro plano, a menos que os dois sejam cores muito diferentes e conhecidas. O problema é que você simplesmente não pode ter certeza se a cor visível é realmente a cor dada (opaca) ou se é alguma mistura de outra cor com o fundo (semitransparente). Você não pode separar a cor original do valor alfa necessário, a menos que tenha uma fonte de alguma informação extra. A única situação em que você pode recuperar completamente todos os detalhes de um objeto em primeiro plano é quando você tem duas imagens contendo duas cores de fundo muito diferentes, mas completamente conhecidas. Nessa situação, você tem informação suficiente para recuperar tanto a cor quanto a transparência do objeto em primeiro plano, para uma remoção de fundo perfeita. O fator importante ao selecionar duas imagens é que as cores de fundo sejam o mais diferentes possível em toda a imagem. Ou seja, que as cores não sejam apenas complementares, mas negativas em intensidade em todos os canais. Por exemplo...

[IM Input] [IM Input]

Embora uma cor de fundo diferente seja usada, ambas as imagens contêm exatamente o mesmo objeto. O objeto mostrado não é simples, mas contém muitas cores semitransparentes. Você pode ver isso na forma como o fundo azul-escuro é visível nas chamas da imagem, embora essa transparência seja quase invisível no fundo amarelo mais claro. Ao usar duas cores, os pixels semitransparentes do objeto sobreposto ficarão misturados com duas cores muito diferentes e, como resultado, terão cores ligeiramente diferentes nas duas imagens. Ao medir quão diferente é cada pixel, você pode determinar exatamente quais pixels são semitransparentes e em que grau. Essencialmente, há informação suficiente para permitir que você recupere perfeitamente a transparência do objeto sobreposto. Recuperar a transparência ou 'máscara' é, claro, o primeiro passo e, na verdade, um passo muito direto. Gere uma imagem de diferença e, em seguida, mescle e maximize as diferenças encontradas em cada canal. |

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

[IM Output]
Esta imagem resultante é um mapa perfeito de quão transparente é cada pixel. É essencialmente a 'máscara alfa' do objeto original nas imagens de origem. Contudo, ela só funcionará se a imagem sobreposta contiver tanto áreas de transparência total quanto de opacidade total. Se não for o caso, em vez da etapa de normalização ("-evaluate-sequence max -auto-level") acima, você precisará dividir cada canal pela diferença das duas cores de fundo. Ou seja, dividir por um valor entre 0.0 e 1.0; quanto maior a diferença, melhor. Se as duas cores de fundo forem preto puro e branco puro, então nenhuma normalização é necessária, apenas a diferença das duas imagens. A diferença é então Negada, de modo que uma diferença máxima produza alfa zero, ou transparência total, e nenhuma diferença produza alfa máximo, ou opacidade total. A próxima tarefa é mais difícil: como as cores de cada pixel semitransparente são modificadas pelo fundo, você não pode simplesmente usar a máscara alfa para extrair o objeto de uma das imagens de origem. Por exemplo... |

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

[IM Output]
Basicamente, o que obtivemos foi um halo horrível da cor de fundo na 'chama' semitransparente da imagem. Nada agradável. Isso é conhecido como 'color spill' (um termo do Mascaramento com Chroma Key, também conhecido como técnica de Tela Azul ou Verde) e pode ser um grande problema. O que precisamos fazer é remover a cor de fundo dos pixels semitransparentes. Contudo, como já recuperamos o canal alfa das imagens originais, sabemos exatamente quanta cor precisa ser removida de cada pixel, de modo a restaurar a cor original sobreposta. Para fazer isso, não precisamos apenas de uma das imagens de origem e do canal alfa que acabamos de extrair, mas também precisamos saber a cor exata do fundo naquela imagem de origem. Um problema relativamente fácil ao usar um fundo de cor sólida, como nestes exemplos. Por exemplo, aqui restauro as cores originais... |

  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]
Usei o pixel do canto superior-esquerdo (fórmula FX 'u.p{0,0}') da imagem de origem como a cor de fundo a remover dos pixels semitransparentes. Ajuste isso ou substitua diretamente a cor a remover, se necessário. A chave para a restauração da cor é a complexa operação de subtração mesclada FX acima. Isso realçará a cor original ('u') da imagem de origem de acordo com a máscara alfa ('v') e, em seguida, subtrairá a cor de fundo (u.p{0,0}, ou o pixel do canto superior-esquerdo) do resultado final. A fórmula não é simples, e um grande agradecimento a HugoRune, na discussão do Fórum do IM Undo a Composite -dissolve, por determinar a matemática necessária. A discussão também prossegue explicando exatamente como todas as etapas funcionam, como foram derivadas e até como você pode também extrair a sobreposição de quaisquer dois padrões de fundo conhecidos, porém diferentes. Aqui está toda a sequência em um ú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]
| _No IM v6.6.8-3, se o FX referenciar um pixel transparente usando 'p{}', ele obtém valores zero em vez dos valores reais da cor totalmente transparente! Isso é um bug e foi relatado e corrigido no IM v6.6.8-5. Não se sabe quando o bug foi introduzido.

Isso só era um problema se você decidisse primeiro mesclar a imagem alfa na imagem de origem e depois tentar corrigir as cores semitransparentes ou de 'spill', usando a cor de fundo conhecida._
---|---
Desta vez, a imagem de fundo 'gold' foi usada para a extração de cor e foi selecionada pelo '0' na segunda operação "[-clone](https://imagemagick.org/command-line-options/#clone)", mas qualquer uma das imagens de origem poderia ter sido usada. Apenas um aviso. O exemplo acima pressupõe que o pixel do canto superior-esquerdo é a cor de fundo não adulterada. Se não for, você pode ter de modificar o comando para especificar uma cor de pixel específica, ou usar uma terceira imagem que contenha a informação correta da cor de fundo. Este último método é vital se a cor de fundo não for constante ao longo da imagem, embora até essa complicação possa ser resolvida. Aqui está a sequência mais simples para imagens sobrepostas a uma cor de fundo preto puro e branco puro. Neste caso, as cores são sempre recuperadas da imagem de fundo preto, pois é apenas uma divisão simples e, assim, uma Composição Divide mais rápida pode ser usada em vez do dolorosamente lento Operador Manual 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 estúdio para recuperação de fundo Os fundos ideais são um preto fosco (não reflexivo) e um branco puro simples (não reflexivo). O fundo também deve ter um tom o mais liso e uniforme possível. Para fazer fotos especificamente para remoção de fundo, usar duas cores complementares pode funcionar melhor. Digamos, tirar fotos com um fundo verde e magenta. Basicamente, você precisará, de algum modo, substituir a tela de cor de fundo antes de tirar a segunda foto. Observe que a ordem das duas fotos não importa na remoção de fundo, mas elas devem ser o mais limpas e uniformes possível, e o objeto principal e a câmera devem permanecer perfeitamente estáveis e fixos. Um método melhor pode ser simplesmente colocar uma tela branca bem distante atrás do objeto e iluminar uniformemente essa tela usando duas lâmpadas de cores diferentes, de modo a não produzir nenhuma sombra do objeto. Com esta técnica, você pode alternar para a outra cor de fundo sem precisar de nenhuma mudança física no estúdio para tirar duas fotos com dois fundos diferentes. Essas técnicas de fundo de duas cores devem funcionar bem para objetos transparentes, mas reflexos, e/ou deformações de fundo ou efeitos de 'lente' causados pelo objeto sendo fotografado, não serão registrados pela técnica, apenas a sua transparência. Por outro lado, reflexos de uma fonte de luz constante sobre o objeto serão preservados! Se você tentar isto, por favor nos avise e forneça um exemplo de suas fotos de origem e resultados para inclusão aqui. Você será citado com um link para o seu site para as pessoas verem.
Recuperação de fundo de vídeo Se você tiver uma série grande o suficiente de imagens com muitos fundos diferentes, porém complexos (como um vídeo), pode tentar tomar um valor mínimo e máximo de todas as imagens para gerar uma imagem de fundo quase preto e branco puro para uso. Quanto mais imagens, melhor isso funciona. Com essas duas imagens, qualquer logotipo constante e sua semitransparência podem ser extraídos, e a mesma técnica pode então ser usada para removê-lo de todos os quadros. Contudo, só funcionará para uma sobreposição semitransparente constante e pode não funcionar para logotipos que usam distorções de cor ou matiz, ou mesmo para um logotipo de cor sólida. Mas, pelo menos, permitirá determinar a forma exata do logotipo. Para logotipos que são totalmente opacos ou mais difíceis, o preenchimento de buracos (veja a seguir) pode então ser usado para preencher os detalhes faltantes a partir das cores ao redor. Veja a Discussão do Fórum do IM para mais detalhes.


Preenchimento de Buracos

Embora mascarar, adicionar transparência e remover o fundo forneçam uma maneira de lidar com elementos indesejados, muitas vezes um 'buraco' não é o que você realmente quer como resultado. Claro que você pode simplesmente sobrepor imagens com buracos sobre outras imagens para preenchê-los, mas isso pode não fornecer um resultado perfeito. Para apagar elementos de uma imagem, você não quer apenas recortá-los, mas substituí-los por cores, sombras e texturas das partes que cercam o buraco. A seguir estão várias técnicas para determinar o que usar para preencher esse buraco.

Criando um buraco para preencher

Suponha que temos uma imagem com algum texto feio... |

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

Bem, o que realmente queremos fazer é remover esse texto, e a maneira mais simples é mascará-lo, de modo a deixar um 'buraco' onde o texto estava. Isso simplifica o problema, pois não importa mais o que foi removido. Temos apenas um buraco a ser preenchido. [IM Output]
Para este caso, porém, criarei uma máscara usando uma linha desenhada que cobre o 'texto feio', como se um usuário tivesse usado rapidamente um editor de imagens. |

  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]
A própria criação do 'buraco' pode ser uma questão delicada, e uma solução automatizada pode depender exatamente do que você está tentando remover, ou até envolver a comparação de centenas de imagens com o mesmo 'texto' ou 'logotipo' para localizá-lo com exatidão. Observe que quanto menor for o buraco, melhor o resultado final. Quanto mais informação puder ser preservada da imagem original, melhor será o resultado. Um buraco tosco e de forma irregular também é melhor do que um buraco de contorno muito liso. Assim, dedicar tempo para fazer o menor buraco que remova todos os efeitos indesejados pode fazer uma grande diferença. Agora, vamos usar a máscara para recortar um buraco da imagem, o que também verificará se ela cobre todas as partes indesejadas. |

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

Então, aqui temos uma imagem com um 'buraco' que precisa ser preenchido. [IM Output]

Preenchimento com Desfoque

Então temos um buraco que precisa ser preenchido com alguma cor. Algo que não pareça que de fato removemos algo da imagem. Um dos métodos mais simples é simplesmente desfocar a imagem, permitindo que as cores ao redor do buraco 'se espalhem' para dentro dele, e então remover a transparência. |

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

A quantidade de desfoque que você usa depende do tamanho do buraco usado. [IM Output]
Agora, veja como podemos colocar por baixo esta imagem desfocada para 'preencher o buraco' que fizemos anteriormente...

  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]

E o texto foi removido. Isto não é perfeito, pois o desfoque das cores naquela área torna óbvio que algo foi removido. Por exemplo, se você olhar de perto a moldura da janela ao lado da cabeça da Zelda, poderá ver os efeitos do desfoque. Além disso, a área parece 'mais lisa' que o resto da imagem, o que é particularmente perceptível em fotos. Mas é uma técnica difundida e rápida, e você a verá frequentemente em vídeos, onde tentaram remover os logotipos que alguma emissora de TV havia adicionado como método de prevenção de direitos autorais. Uma alternativa a tentar ocultar a remoção é tornar a própria remoção perceptível. Por exemplo, se você quiser Proteger o Anonimato de Alguém.

Em Construção

Links para outros métodos. Método de preenchimento de buracos por desfoque com redimensionamento... Cor Esparsa, Método de Shepard (rápido). Veja também snibgo, Filling holes. Desfocando apenas os pixels de borda...Cor Esparsa como Operador de Preenchimento. Veja também snibgo, Filling holes in priority order. Eu gostaria de usar um operador de morfologia que define a cor nos canais de cor enquanto calcula a distância em um canal de fundo oculto. Isso deveria gerar um preenchimento tipo Shepard, muito rápido e sem vazamento, conhecido como 'Color Diffusion '. Veja o artigo Diffusion Curves, que faz uso intenso desta técnica. Uma discussão longa e antiga sobre preenchimento de buracos (remoção de texto) está nos Fóruns de Usuários do IM Text Removal Discussion. Uma discussão mais recente é Fill area with nearest colour from boundary, que trata mais de preencher sem desfocar. Alguns outros métodos, não do IM, de 'preenchimento de buracos' para apagar partes de imagens são mostrados no Stack Overflow, Remove text from jpeg. Por exemplo, usando Python Skimage. Ou usando Python OpenCV inpainting