Exemplos de ImageMagick -- Desfoque e Nitidez de Imagens
- Argumentos de Desfoque/Gaussiano
- O Desfoque Usa a Configuração de Canal
- Detalhes Internos do Desfoque
- Operadores de Desfoque vs Desfoque Gaussiano
-
Desfoques Grandes usando resize
Nitidez de Imagens (Em Construção) Geração de Sombras
- Problema de Deslocamento da Sombra
- Sombra e Composite
- Contornos com Sombra
- Sombra no Comando Montage
-
Suavização de Formas usando Desfoque (em construção) Operadores Relacionados (em construção) O desfoque e o seu oposto, a nitidez de imagens, são um aspecto muito importante do processamento de imagens. Nesta seção, ambos são abordados.
Desfoque de Imagens
Desfocar imagens para que fiquem borradas pode não parecer uma operação útil, mas na verdade é muito útil para gerar efeitos de fundo e sombras. Também é muito útil para suavizar os efeitos do 'serrilhado' (jaggies), fazendo o anti-aliasing das bordas das imagens, e para arredondar detalhes de modo a produzir efeitos de realce. O desfoque é tão importante que é parte integrante do Redimensionamento de Imagens, embora ali se use um método de desfoque diferente, restrito aos limites de um único pixel da imagem original. Existem dois operadores gerais de desfoque de imagens no ImageMagick. O espalhamento "[-gaussian-blur](https://imagemagick.org/command-line-options/#gaussian-blur)" e o "[-blur](https://imagemagick.org/command-line-options/#blur)". Os resultados dos dois são muito próximos, mas como o "[-blur](https://imagemagick.org/command-line-options/#blur)" é um algoritmo mais rápido, ele é geralmente preferido ao primeiro, ainda que este seja matematicamente mais correto. (Veja Operadores de Desfoque vs Desfoque Gaussiano.)
Argumentos de Desfoque/Gaussiano
Os argumentos de "[-blur](https://imagemagick.org/command-line-options/#blur)" e "[-gaussian-blur](https://imagemagick.org/command-line-options/#gaussian-blur)" são os mesmos, mas, para quem é novo no processamento de imagens, os valores dos argumentos podem ser confusos.
**-blur {_radius_}x{_sigma_} **
A configuração importante acima é o segundo valor, sigma. Ele pode ser entendido como uma aproximação de quanto se deseja que a imagem se 'espalhe' ou desfoque, em pixels. Pense nele como o tamanho do pincel usado para desfocar a imagem. Os números são valores de ponto flutuante, então é possível usar um valor muito pequeno como '0.5'. O primeiro valor, radius, também é importante, pois controla o tamanho da área que o operador deve considerar ao espalhar os pixels. Esse valor deve normalmente ser '0' ou, no mínimo, o dobro do sigma. Para mostrar os efeitos das opções, toma-se esta imagem simples, com bastante espaço ao redor (os operadores de desfoque precisam de muito espaço para trabalhar), e cria-se uma tabela com os resultados para várias configurações do operador. Usou-se também, propositalmente, uma fonte que contém linhas grossas e finas, para ver o borramento de pequenos detalhes de linha e de grandes áreas de cor. |
magick -font Gecko -pointsize 48 label:A \
-bordercolor white -border 20x10 blur_source.png
Um radius pequeno limita qualquer efeito do desfoque aos pixels que estão a essa quantidade de pixels daquele que está sendo desfocado (um raio quadrado). Assim, usar um radius muito pequeno como '1' limitou efetivamente o desfoque aos vizinhos imediatos de cada pixel. Note que, embora o sigma seja de ponto flutuante, o radius não é. Se for dado um valor de ponto flutuante (ou calculado internamente), ele é arredondado para cima até o inteiro mais próximo, para determinar a 'vizinhança' do desfoque. O quanto cada vizinho contribui para o resultado final ainda é controlado pelo sigma. Um sigma muito pequeno (menor que '1' ) limita sua contribuição a uma quantidade pequena, enquanto um sigma maior faz todos os vizinhos contribuírem em proporções mais iguais. O maior sigma, '65355', produzirá uma média simples de todos os pixels da vizinhança quadrada. Note também que, para um radius pequeno mas um sigma grande, aparecem artefatos no resultado desfocado. Isso é especialmente visível na saída de "-blur 5x8". Isso é causado pela pequena vizinhança quadrada 'cortar' a área desfocada, produzindo paradas abruptas na suave curva gaussiana do desfoque e, assim, gerando Artefatos de Ringing ao longo de bordas nítidas. Portanto...
Nunca use um radius menor que o sigma para desfoques
A solução ideal é simplesmente definir o radius como '0x', como mostra a última linha da tabela acima. Nesse caso, o operador tentará determinar automaticamente o melhor radius para o sigma fornecido. O menor raio que o IM usaria é 3 e, normalmente, é 3 * sigma em uma versão Q16 do IM (um raio menor é usado no IM Q8, por ter menos precisão). A única situação em que um radius diferente de zero seria usado é com um sigma muito pequeno ou em desfoques especializados. Portanto...
Sempre que possível, use um radius igual a zero nas operações de desfoque
Valores pequenos de sigma normalmente só são usados para borrar linhas e suavizar bordas em imagens nas quais nenhum anti-aliasing foi usado (veja Anti-Aliasing para mais informações). Nessa situação, um desfoque de '1x0.3' é um valor útil para remover a maior parte do 'serrilhado' das imagens. Valores grandes, por outro lado, são úteis para produzir imagens borradas, para fundos ou efeitos de sombra (veja Fontes Compostas), ou mesmo efeitos de realce de imagem (como mostrado ao longo da página de Exemplos Avançados). Devido à maneira como o IM trata os argumentos no estilo 'x', o sigma acima é opcional. No entanto, ele é o valor mais importante, portanto o opcional deveria ser o radius, já que o radius pode ser determinado automaticamente. Assim, um argumento de valor único para esse tipo de operador de convolução é inútil. É improvável que isso mude, pois tem sido assim por muito tempo e quebraria coisas demais. O Desfoque Usa a Configuração de Canal Para demonstrar o desfoque, comecemos de forma simples, gerando um círculo preto borrado sobre um fundo azul-claro...
magick -size 70x70 xc:lightblue \
-fill black -draw 'circle 35,35 20,25' circle_on_blue.png
magick circle_on_blue.png -blur 0x8 circle_on_blue_blur.png
![[IM Output]](../static/img/blur/circle_on_blue_blur.png)
Como se pode ver, desfocar uma imagem simples como esta não apresenta problemas. Simplesmente funciona, como se esperaria. Mas se tentarmos isso novamente com uma imagem que contém um fundo transparente...
magick -size 70x70 xc:none \
-fill black -draw 'circle 35,35 20,25' black_circle.png
magick black_circle.png -blur 0x8 black_blurred.png
![[IM Output]](../static/img/blur/black_blurred.png)
Espere, o que aconteceu! A imagem não mudou! Bem, na verdade o operador funcionou. Mas o "[-blur](https://imagemagick.org/command-line-options/#blur)", como operador de canal em tons de cinza, é limitado pela configuração "[-channel](https://imagemagick.org/command-line-options/#channel)" a apenas os três canais de cor. Isso significa que apenas os três canais de cor da imagem foram desfocados, deixando a transparência, ou canal alfa, da imagem como estava. No caso acima, porém, a imagem é um círculo totalmente opaco sobre uma tela de fundo da cor 'none', que o IM define como preto totalmente transparente! Isso significa que temos um círculo preto sobre um fundo preto transparente. Em outras palavras, uma imagem em que todas as cores são pretas, com algumas partes opacas e outras transparentes. Consequentemente, ao desfocar a imagem, apenas desfocamos preto com preto, o que, como se pode imaginar, produziu preto! Assim, o resultado não teve mudança de cor. Além disso, nunca tocamos no canal alfa, ou de transparência, da imagem, de modo que a transparência da imagem ficou inalterada. Ou seja, um círculo preto! O que realmente queríamos era desfocar os quatro canais da imagem, em especial o canal alfa. Para isso, define-se a configuração "[-channel](https://imagemagick.org/command-line-options/#channel)" com os quatro canais da imagem (por exemplo: usando o valor 'RGBA').
magick black_circle.png -channel RGBA -blur 0x8 black_blurred_RGBA.png
Sempre use a configuração "-channel RGBA" ao desfocar imagens com transparência.
| A versão 5.5.7 do IM teria desfocado os quatro canais de cor automaticamente, mas o operador apresenta outros efeitos problemáticos em imagens com transparência. Veja Bug do Desfoque com Transparência para mais detalhes.
---|---
| Alguns formatos de imagem, como GIF e JPEG, não lidam com pixels semitransparentes. Por isso, recomenda-se usar o formato PNG para quaisquer imagens com algum tipo de cor semitransparente, se possível.
---|---
Como se vê acima, a configuração "[-channel](https://imagemagick.org/command-line-options/#channel)" é muito importante para um operador em tons de cinza como o "[-blur](https://imagemagick.org/command-line-options/#blur)". Mas não é a única coisa que pode ser importante ao usar tal operador. Por exemplo, tentemos novamente aquele último exemplo do 'esqueceu a configuração "[-channel](https://imagemagick.org/command-line-options/#channel)"', mas desta vez com um círculo amarelo.
magick -size 70x70 xc:none \
-fill yellow -draw 'circle 35,35 20,25' yellow_circle.png
magick yellow_circle.png -blur 0x8 yellow_blurred.png
![[IM Output]](../static/img/blur/yellow_blurred.png)
Note que, em vez de obter uma imagem inalterada como ocorreu com o círculo preto, produziu-se um círculo amarelo de aparência horrível, com preto invadindo as bordas. Que feio! Esse problema é causado por um fato que poucos usuários novos do IM percebem.
Os pixels transparentes têm cor, mesmo que não seja possível vê-la.
No caso acima, essa cor transparente era preta, que vazou para o círculo amarelo. É claro que isso pode ser corrigido definindo-se corretamente a configuração "[-channel](https://imagemagick.org/command-line-options/#channel)" para uma imagem transparente; então tudo funciona como esperado.
magick yellow_circle.png -channel RGBA -blur 0x8 yellow_blurred_RGBA.png
Detalhes Internos do Desfoque
Levemos isso um passo adiante com um exemplo mais complicado, que permitirá explorar exatamente o que o "[-blur](https://imagemagick.org/command-line-options/#blur)" faz internamente. Aqui cria-se uma imagem muito especial de um círculo amarelo, desenhado sobre um fundo vermelho totalmente transparente. Isso permitirá ver o efeito que uma cor transparente tem ao desfocar imagens.
magick -size 70x70 xc:'#F000' \
-fill yellow -draw 'circle 35,35 20,25' yellow_on_red.png
![[IM Output]](../static/img/blur/yellow_on_red.png)
Note que a cor "#F000" é um vermelho totalmente transparente. Ou seja, as áreas de fundo da imagem são, na verdade, de um vermelho invisível, em vez do mais comum preto totalmente transparente. Isso é importante para os testes seguintes. É possível ver a cor das partes transparentes da imagem removendo efetivamente o canal alfa da imagem com o operador "[-alpha off](https://imagemagick.org/command-line-options/#alpha)".
magick yellow_on_red.png -alpha off yellow_on_red_matte.png
![[IM Output]](../static/img/blur/yellow_on_red_matte.png)
Agora tentemos desfocar novamente apenas as cores da imagem, usando a configuração "[-channel](https://imagemagick.org/command-line-options/#channel)" padrão, 'RGB'.
magick yellow_on_red.png -blur 0x8 yellow_on_red_RGB.png
![[IM Output]](../static/img/blur/yellow_on_red_RGB.png)
Como se pode ver, o fundo vermelho totalmente transparente da imagem agora invadiu o círculo amarelo visível, dando-lhe uma interessante borda alaranjada, como aconteceu anteriormente. Esse efeito pode agradar, mas há maneiras melhores de gerá-lo do que depender de cores invisíveis totalmente transparentes. Apenas para comprovar que é possível desfocar esta imagem corretamente, façamos isso da forma adequada...
magick yellow_on_red.png -channel RGBA -blur 0x8 yellow_on_red_RGBA.png
![[IM Output]](../static/img/blur/yellow_on_red_RGBA.png)
A razão pela qual desfocar com o canal alfa não produz cores alaranjadas como antes é que, quando o operador "[-blur](https://imagemagick.org/command-line-options/#blur)" percebe que o canal alfa está envolvido (de acordo com a configuração "[-channel](https://imagemagick.org/command-line-options/#channel)" atual), ele desfoca usando apenas os pixels que são visíveis segundo esse canal alfa. Se o canal alfa não estiver envolvido, ele o ignora por completo, e o vermelho totalmente transparente se desfoca com o amarelo para produzir vários tons de laranja. Basicamente, o algoritmo de desfoque foi modificado para ignorar todos os pixels totalmente transparentes da imagem, independentemente da cor que possam ter. Quaisquer pixels semitransparentes ainda são considerados, mas seu efeito no resultado também é moderado pelo quão visíveis eles são. O resultado é que o círculo se tornou uma mancha amarela semitransparente e difusa. Justamente o que o usuário provavelmente tentava alcançar. Se preferir, é possível desfocar as cores e o canal alfa separadamente, desconectando assim, na prática, o 'ajuste de visibilidade' do algoritmo sobre os canais de cor. O resultado se assemelha mais a um sol brilhando através de uma névoa marrom suja.
magick yellow_on_red.png -channel A -blur 0x8 \
-channel RGB -blur 0x8 yellow_on_red_GS.png
![[IM Output]](../static/img/blur/yellow_on_red_GS.png)
Este último exemplo produziu o que um operador puramente em tons de cinza teria produzido se não houvesse absolutamente nenhuma interação entre o canal alfa e as cores da imagem (transparentes ou não). Ou seja, cada um dos canais vermelho, verde, azul e alfa é desfocado de forma completamente separada dos demais, como se cada um fosse uma imagem separada em tons de cinza. Lembre-se apenas de que, como a configuração "[-channel](https://imagemagick.org/command-line-options/#channel)" padrão é 'RGB', a ação padrão é não desfocar o canal alfa e desfocar as cores invisíveis junto com a cor visível da imagem. Não é bom que o "[-blur](https://imagemagick.org/command-line-options/#blur)" já não seja sempre um operador puramente em tons de cinza? Embora ainda seja possível usá-lo dessa maneira, se realmente se quiser. No entanto, nem sempre houve essa escolha... | Antes da versão 6.2.4-4 do IM, os operadores "[-blur](https://imagemagick.org/command-line-options/#blur)" e "[-gaussian-blur](https://imagemagick.org/command-line-options/#gaussian-blur)" eram aplicados como operação puramente em tons de cinza e, portanto, não ajustavam a ponderação das cores de acordo com a 'visibilidade' do canal alfa. O resultado era que qualquer forma de desfoque com transparência quase sempre produzia horríveis efeitos de 'halo preto', como o gerado propositalmente no exemplo anterior.
Isso foi classificado como um grave bug de longa data na distribuição do IM, e de solução muito difícil. Para mais detalhes sobre esse problema, veja a página Bug do Desfoque com Transparência._
---|---
FUTURE: Blur and Trimming Images.
Operadores de Desfoque vs Desfoque Gaussiano
Houve alguma confusão sobre qual operador, "[-blur](https://imagemagick.org/command-line-options/#blur)" ou "[-gaussian-blur](https://imagemagick.org/command-line-options/#gaussian-blur)", é melhor para desfocar imagens. Em primeiro lugar, o "[-blur](https://imagemagick.org/command-line-options/#blur)" é mais rápido, mas consegue isso usando uma técnica em duas etapas. Primeiro em um eixo, depois no outro. O operador "[-gaussian-blur](https://imagemagick.org/command-line-options/#gaussian-blur)", por outro lado, é matematicamente mais correto, pois desfoca em todas as direções simultaneamente. O custo de velocidade entre os dois pode ser enorme, de um fator de 10 ou mais, dependendo da quantidade de desfoque envolvida. Em um contexto mais técnico, o "[-blur](https://imagemagick.org/command-line-options/#blur)" é um filtro de convolução ortogonal unidimensional de 2 passagens, enquanto o "[-gaussian-blur](https://imagemagick.org/command-line-options/#gaussian-blur)" é um filtro de convolução cilíndrico bidimensional. Veja Convolução para mais detalhes. Os resultados dos dois métodos deveriam ser iguais, ao contrário do uso de outras operações de convolução 'filtradas'. No entanto, o sistema de duas passagens implica uma etapa intermediária na qual podem ocorrer efeitos de arredondamento ou de quantização. Cristy também confirma isso ao relatar... Deve-se sempre usar "[-blur](https://imagemagick.org/command-line-options/#blur)" em vez de "[-gaussian-blur](https://imagemagick.org/command-line-options/#gaussian-blur)" porque é mais rápido. Alguns pixels serão diferentes no interior devido ao arredondamento, e os pixels de borda podem ser diferentes por causa da perda de efeitos de borda do Pixel Virtual, novamente na etapa intermediária. Em resumo, os dois operadores são ligeiramente diferentes, mas apenas de forma mínima. Como o "[-blur](https://imagemagick.org/command-line-options/#blur)" é muito mais rápido, use-o. É o que se faz em praticamente todos os exemplos que envolvem desfoque.
Desfoques Grandes usando Resize
Usar valores grandes de sigma para desfocar imagens é muito lento. Mas uma técnica pode ser usada para acelerar esse processo. No entanto, este é apenas um método aproximado e precisaria de algum rigor matemático para melhorar os resultados. Essencialmente, a razão pela qual desfoques grandes são lentos é que se precisa de uma janela ou 'núcleo' grande para combinar muitos pixels, para todo e cada pixel da imagem. Já o redimensionamento (tornar a imagem menor) faz a mesma coisa, mas gera menos pixels no processo. A técnica consiste basicamente em encolher a imagem e depois ampliá-la novamente para gerar o resultado fortemente desfocado. O Filtro Gaussiano é especialmente útil para isso, pois é possível especificar diretamente um define de Sigma Gaussiano. Por exemplo, aqui a pequena imagem da rosa é desfocada por um valor de sigma de 5 usando os dois métodos.
magick rose: -blur 0x5 rose_blur_5.png
magick rose: -filter Gaussian -resize 50% \
-define filter:sigma=2.5 -resize 200% rose_resize_5.png
Note que a configuração de sigma (usada apenas na etapa de ampliação) é apenas metade da realmente desejada, pois também se está dobrando o tamanho da imagem. É possível tornar o desfoque final geral maior ajustando tanto a proporção de redução quanto o valor de sigma fornecido. A etapa de redução é a que produz o ganho de velocidade, mas deve haver ao menos algum desfoque na etapa de ampliação como controle de qualidade. Este é apenas um exemplo da técnica. Ela se destina, na verdade, a ser usada para valores de sigma muito, muito grandes em imagens muito, muito grandes. Por exemplo, em desfoques usando um sigma de 10 ou mais em fotos digitais modernas. Essa técnica também é usada para gerar o desfoque multinível de uma única imagem em Sparse Color Shepards, Alternativa.
Nitidez de Imagens
Em Construção
A nitidez é o algoritmo de computação gráfica mais frequentemente visto em séries de TV e filmes. Imagine a polícia 'limpando' uma foto 'ampliada' da placa do carro de um assaltante de banco, ou o rosto de um homem em um vídeo borrado de câmera de loja, e entende-se a ideia. Basicamente, o que se faz é tentar recuperar os detalhes finos de uma imagem que foram perdidos devido ao desfoque natural da imagem causado pela lente da câmera ou por imagens de baixa resolução. Argumentos de nitidez? (expandir)
O fator mais importante é o sigma. Pois é ele o verdadeiro controle da
operação de nitidez. É apenas por acidente histórico que ele é o segundo
termo acima.
Pode ser qualquer valor de ponto flutuante, de .1 para praticamente nenhuma nitidez até
3 ou mais para uma nitidez intensa. 0.5 a 1.0 é bastante bom.
O radius é apenas um limite do efeito, assim como o limiar.
O radius é apenas em unidades inteiras, pois é assim que o algoritmo funciona; quanto
maior ele for, mais lento será. Mas deve ser no mínimo 1 ou, melhor
ainda, 2 vezes o sigma.
| Primeiro, esqueça o primeiro número; basta usar 0, que então usará o melhor número para o fator 'sigma' fornecido. Quanto maior o sigma, mais nítido fica. -sharpen 0x.4 | muito pequeno |
|---|---|
| -sharpen 0x1.0 | nitidez de cerca de um pixel |
| -sharpen 0x3.0 | provavelmente grande demais |
O operador "[-sharpen](https://imagemagick.org/command-line-options/#sharpen)" é uma espécie de desfoque invertido. Na verdade, funciona praticamente da mesma maneira. Para exemplos que mostram como isso se relaciona com o desfoque, veja Processamento de Imagens por Interpolação e Extrapolação. Por exemplo, desfoca-se uma imagem simples e depois tenta-se dar-lhe nitidez novamente para remover o desfoque. |
magick -font Gecko -pointsize 72 label:A A_original.jpg
magick A_original.jpg -blur 0x3 A_blur.jpg
magick A_blur.jpg -sharpen 0x3 A_blur_sharp.jpg
magick A_blur_sharp.jpg -sharpen 0x3 A_blur_sharp_x2.jpg
Como se pode ver, o resultado não é perfeito, pois espalhar os pixels torna os cantos nítidos da imagem menos distintos. Note em especial o espessamento extra que resultou no canto das duas linhas no topo da imagem, bem como o quase desaparecimento das linhas finas. Mesmo repetir a operação ou aumentar o tamanho da área de nitidez não ajudará a devolver a imagem exatamente ao original, pois basicamente perderam-se os detalhes mais finos com o desfoque da imagem. No entanto, o detalhe macro pode ser recuperado bastante bem. São os algoritmos de nitidez capazes de recuperar detalhes mais finos em uma imagem desfocada ou muito ampliada que rendem muito dinheiro nos pacotes de software usados por forças policiais, astrônomos e agências governamentais de espionagem.
Imagens Unsharp
Em Construção
Tanto o operador "[-sharpen](https://imagemagick.org/command-line-options/#sharpen)" quanto o "[-unsharp](https://imagemagick.org/command-line-options/#unsharp)" funcionam usando exatamente a mesma técnica de subtrair um desfoque da imagem original. Para os detalhes internos de como o "[-sharpen](https://imagemagick.org/command-line-options/#sharpen)" e o "[-unsharp](https://imagemagick.org/command-line-options/#sharpen)" realmente funcionam, veja Convolução Unsharpen.
magick A_blur.jpg -unsharp 0x5 A_blur_unsharp.jpg
Dos comentários em [Nitidez com ImageMagick](http://redskiesatnight.com/2005/04/06/sharpening-using-image-magick/) de Alex Beels
Correspondência com o unsharp do GIMP
Pegue o radius do gimp e some 1 => sigma do IM
Divida o limiar por 255 => Limiar do IM
Então GIMP radius=2 amount=1.5 threshold=5 resulta em
-unsharp 0×3+1.5+0.0196
Outro sugeriu que im_sigma = sqrt(gimp_radius)
**Notas brutas de Fred Weinhaus**
Imagem desfocada para teste.
A_original.jpg
magick A_original.jpg -blur 0x3 A_original_blur3.jpg
a nitidez é apenas uma imagem desfocada de tipo gaussiano subtraída da imagem para
criar uma imagem de bordas (filtro passa-alta), depois mescla isso de volta em igual proporção com a
original, obtendo-se assim uma imagem realçada por passa-alta.
magick A_original_blur3.jpg -sharpen 0x3 A_original_blur3_sharp3.jpg
o unsharp é mais complexo. É semelhante. Ele toma a diferença (resultado de bordas)
como acima, ou seja, como o sharpen, MAS mescla apenas uma fração ou múltiplo disso
com a imagem original, E somente se a diferença estiver acima de um limiar. Assim,
unsharp 0x3+1+0 é basicamente o mesmo que sharpen 0x3
magick A_original_blur3.jpg -unsharp 0x3+1+0
A_original_blur3_unsharp3_1_0.jpg
compare -metric rmse A_original_blur3_sharp3.jpg
A_original_blur3_unsharp3_1_0.jpg null:
164.661 (0.00251256)
A diferença pode se dever ao uso ou não de um filtro de desfoque separável
(gaussiano) em um ou no outro, mas não em ambos. Ou pode ser apenas alguma
pequena diferença em outra parte da implementação do IM.
Se mesclar menos com a original, obtém-se menos nitidez.
magick A_original_blur3.jpg -unsharp 0x3+0.5+0
A_original_blur3_unsharp3_0p5_0.jpg
Se mesclar mais com a original, obtém-se mais nitidez.
magick A_original_blur3.jpg -unsharp 0x3+2+0
A_original_blur3_unsharp3_2_0.jpg
Se aumentar o limiar, obtém-se novamente menos nitidez.
magick A_original_blur3.jpg -unsharp 0x3+2+0.2
A_original_blur3_unsharp3_2_0p2.jpg
Vários dos meus (do Fred) scripts, binomialedge, gaussianedge, sharpedge, usam este
conceito de mesclagem (entre o resultado filtrado por passa-alta e a imagem
original) e há uma descrição junto com os scripts. A limiarização nos meus
scripts é feita de forma diferente e com um propósito diferente.
**Nitidez usando deconvolução**
Existe uma técnica que usa deconvolução (divisão em uma forma de frequência de imagens
gerada por Fourier rápida). Funciona melhor quando o 'desfoque' exato
que foi aplicado à imagem original é conhecido, ou calculado de alguma forma.
No momento, apenas métodos brutos 'faça você mesmo' estão disponíveis no IM
e vários desses métodos são demonstrados (testados) na subseção
[Multiplicação/Divisão de Fourier](https://usage.imagemagick.org/fourier/fft_math/).
Geração de Sombras
O operador "[-shadow](https://imagemagick.org/command-line-options/#shadow)" é um operador avançado que foi desenvolvido junto com as páginas de exemplos do IM. Basicamente, ele representa um desfoque e uma recoloração muito complexos da forma de transparência da imagem dada. Essa é uma operação que os usuários do IM realizavam o tempo todo, mas que exigia bastante conhecimento para descobrir como fazer corretamente. O operador toma uma imagem (normalmente um clone, que já pode ter alguma transparência) e a transforma em uma imagem de sombra, que pode então ser posicionada sob a imagem original em um deslocamento dado (geralmente usando o operador especial Layer Merge). Aqui, por exemplo, está um método padrão de sombrear uma imagem existente, usando uma cor de sombra azul-marinho para combinar com esta página web. |
magick rose: \( +clone -background navy -shadow 80x3+5+5 \) +swap \
-background none -layers merge +repage shadow.png
![[IM Output]](../static/img/blur/shadow.png)
Note como a imagem de sombra está corretamente deslocada em relação à imagem. Pode-se até zerar o valor 'sigma ' do desfoque e criar uma sombra dura, porém semitransparente. |
magick rose: \( +clone -background navy -shadow 60x0+4+4 \) +swap \
-background none -layers merge +repage shadow_hard.png
![[IM Output]](../static/img/blur/shadow_hard.png)
O uso de "[-layers](https://imagemagick.org/command-line-options/#layers) merge" para sobrepor as imagens de sombra à imagem original facilita a geração de sombras a partir de uma fonte de luz em qualquer direção, não apenas do lado superior esquerdo. |
magick rose: \( +clone -background navy -shadow 80x3-5+5 \) +swap \
-background none -layers merge +repage shadow_other.png
![[IM Output]](../static/img/blur/shadow_other.png)
Embora seja mais fácil simplesmente usar um Layers Merge, isso tende a deslocar o offset geral da imagem resultante. O deslocamento, porém, não é causado pelo método de sobreposição, mas pelo "[+repage](https://imagemagick.org/command-line-options/#repage)" remover qualquer offset negativo ou positivo que possa estar presente na imagem de 'camada' resultante. Veja Sombras e o Problema de Deslocamento para técnicas alternativas. | O método Layers Merge foi adicionado no IM v6.3.6-2. Antes disso, seria preciso usar o operador semelhante de achatamento de camadas "[-mosaic](https://imagemagick.org/command-line-options/#mosaic)". No entanto, esse operador tem problemas (veja a seguir).
---|---
Sombras com Forma
O "[-shadow](https://imagemagick.org/command-line-options/#shadow)" foi projetado tendo em mente imagens com forma (e essa é a razão de sua complexidade). Por exemplo, aqui está uma fonte com sombra típica. |
magick -background none -stroke black -fill white \
-font Candice -pointsize 48 label:A -trim \
\( +clone -background navy -shadow 80x3+3+3 \) +swap \
-background none -layers merge +repage shadow_a.png
![[IM Output]](../static/img/blur/shadow_a.png)
Se houver espaço suficiente na imagem original para incluir a sombra sem recorte, pode-se usar este comando. Ele usa um método de composição especial, '[DstOver](compose.html#dst_over)', para evitar a necessidade de trocar a ordem das duas imagens. |
magick -background none -stroke black -fill white \
-font Candice -pointsize 48 label:'A ' \
\( +clone -background navy -shadow 80x3+3+3 \) \
-background none -compose DstOver -flatten shadow_a_size.png
![[IM Output]](../static/img/blur/shadow_a_size.png)
Provavelmente é possível ver um pequeno recorte nisto, pois a imagem original não tinha espaço extra suficiente para a sombra solicitada.
Sombras e o Problema de Deslocamento
O problema da sombra é que uma sombra borrada se estende em todas as direções. Para compensar, o operador "[-shadow](https://imagemagick.org/command-line-options/#shadow)" aumenta a própria imagem original adicionando uma borda de 2 vezes o tamanho do valor 'sigma ' do desfoque fornecido. Ou seja, se uma sombra for desfocada usando 'x3', a imagem será aumentada em 12 pixels (2 vezes 3 pixels em cada lado). Para compensar esse aumento, a imagem de sombra também recebe um Deslocamento de Tela Virtual negativo apropriado, para que fique posicionada corretamente em relação à imagem que está sendo sombreada. Para uma imagem normal, isso significa que a imagem de sombra gerada terá um offset negativo. Isso, porém, gera um problema quando o seu IM não dispõe do método 'merge' de "[-layers](https://imagemagick.org/command-line-options/#layers)". Por exemplo, aqui tenta-se adicionar uma sombra do lado esquerdo da imagem, como se uma luz brilhasse do canto superior direito. |
magick rose: \( +clone -background navy -shadow 60x3-5+5 \) +swap \
-background none -mosaic shadow_left_clipped.png
![[IM Output]](../static/img/blur/shadow_left_clipped.png)
Como se pode ver, a sombra foi recortada pelo operador "[-mosaic](https://imagemagick.org/command-line-options/#mosaic)" por causa do offset negativo. Nada bom! Uma solução é adicionar um offset inicial à imagem original, para que o offset da imagem de sombra resultante não seja negativo. |
magick rose: -repage +11+0\
\( +clone -background navy -shadow 80x3-5+5 \) +swap \
-background none -mosaic shadow_left.png
![[IM Output]](../static/img/blur/shadow_left.png)
Outro método é deslocar ambas as imagens por uma quantidade apropriada depois que a sombra foi gerada. Isso remove quaisquer offsets negativos antes de combiná-las com "[-mosaic](https://imagemagick.org/command-line-options/#mosaic)". Note o uso de uma flag '!' com "[-repage](https://imagemagick.org/command-line-options/#repage)" para adicionar o offset dado a ambas as imagens. |
magick rose: \( +clone -background navy -shadow 80x3-5-5 \) +swap \
-repage +11+11\! -background none -mosaic shadow_tl.png
![[IM Output]](../static/img/blur/shadow_tl.png)
A quantidade de espaço necessária deve ser de pelo menos 2×'sigma '-'offset ', ou, neste caso, 2×3--5 ⇒ 11 pixels, ou corre-se o risco de recortar a sombra. No entanto, um espaço de cerca de 'sigma '-'offset ' costuma produzir um nível aceitável de recorte. Outra alternativa é expandir a imagem original de modo a abrir espaço suficiente para a sombra final. Esta é a MELHOR maneira de lidar com sombras, preservando a localização original da imagem na tela virtual. Por exemplo, aqui preenche-se a imagem original com algum espaço extra para a sombra e, em seguida, coloca-se a imagem de sombra diretamente por baixo. Incluiu-se uma borda no resultado exibido para que se possa ver que a imagem final permanece centralizada na imagem 'preenchida'. |
magick rose: -bordercolor None -border 11x11 \
\( +clone -background navy -shadow 80x3+5+5 \) \
-background none -compose DstOver -flatten \
-compose Over shadow_space.png
![[IM Output]](../static/img/blur/shadow_space.png)
A quantidade de preenchimento necessária deve ser de pelo menos 'sigma '+abs('offset ') ou, melhor ainda, 2×'sigma '+abs('offset '), para garantir que a sombra não seja recortada. O preenchimento pode ser assimétrico para reduzir o espaço, mas normalmente usa-se um preenchimento simétrico (como o acima) por conveniência. | Note que, embora a configuração "-compose Over" não seja realmente necessária acima, ela é recomendada. Caso contrário, operações posteriores (mesmo em outros comandos "magick") poderiam ser afetadas, com resultados inesperados. Ou seja, uma configuração de composição fora do padrão pode afetar outras operações, incluindo: sobreposição de imagens, adição de bordas ou molduras, ou simplesmente outras composições.
---|---
Sombras e Composite
Muitas pessoas nos fóruns geram uma imagem de sombra e então tentam usar o "[-composite](https://imagemagick.org/command-line-options/#composite)", de nível mais baixo, para mesclar as imagens. Por exemplo, sobrepor diretamente a imagem original a uma imagem de sombra (maior) gerada. |
magick rose: \( +clone -background navy -shadow 60x3 \) \
+swap -composite +repage shadow_composite.png
![[IM Output]](../static/img/blur/shadow_composite.png)
O primeiro ponto a lembrar é que os Operadores de Composição são de nível muito baixo e não leem qualquer offset de camada ou de tela virtual que a imagem original ou o Operador de Sombra possam ter. De fato, ainda é preciso remover ou ajustar o offset possivelmente negativo (ruim) que a sombra adicionou, usando a Configuração Repage. Isso significa que o offset visto no exemplo acima está sendo gerado simplesmente por causa da forma como a sombra ampliou a imagem de entrada para dar algum espaço à sombra. A sombra está onde está unicamente devido à expansão da imagem de sombra em 2 vezes o sigma. Além disso, ao usar uma 'sombra dura' (sigma zero), também não haveria offset algum para a sombra e, assim, a sombra ficaria oculta pela imagem original, exceto por um possível efeito de halo escuro na borda. Basicamente, abriu-se mão do cálculo de offset embutido que o Operador de Sombra fornece. É claro que, em vez disso, é possível calcular e definir as configurações apropriadas de Geometria/Gravidade de Composição, e a maneira mais fácil é usar uma configuração "[-gravity](https://imagemagick.org/command-line-options/#gravity) Center", pois a imagem de sombra ampliada é expandida igualmente em todos os lados. |
magick rose: \( +clone -background navy -shadow 60x3 \) +repage \
+swap -gravity center -geometry -3-5 -composite shadow_geometry.png
![[IM Output]](../static/img/blur/shadow_geometry.png)
Note que o offset de geometria centralizada é negativo, pois a ordem das imagens foi trocada.
Contornos com Sombra
Também é possível usar o "[-shadow](https://imagemagick.org/command-line-options/#shadow)" para gerar contornos difusos de formas, como texto. Ao usar Layers Merge, o IM adicionará automaticamente o espaço extra necessário para o desfoque semitransparente. |
magick -background none -fill white \
-font Candice -pointsize 48 label:A -trim \
\( +clone -background black -shadow 100x3+0+0 \) +swap \
-background none -layers merge +repage shadow_outline.png
![[IM Output]](../static/img/blur/shadow_outline.png)
Aqui é possível ver um problema no uso de uma forma desfocada para criar contornos. A borda da forma será sempre pelo menos 50% transparente, pela própria natureza de como o desfoque funciona. Para compensar, pode-se aumentar a forma da imagem que será sombreada (para um exemplo, veja Fonte de Contorno Suave Mais Densa). Melhor ainda, pode-se ajustar a transparência da imagem de sombra usando um Ajuste de Nível, de modo que uma transparência de 50% ao longo das bordas da forma se torne totalmente opaca. |
magick -background none -fill white \
-font Candice -pointsize 48 label:A -trim \
\( +clone -background black -shadow 100x3+0+0 \
-channel A -level 0,50% +channel \) +swap \
+repage -gravity center -composite shadow_outline_darker.png
![[IM Output]](../static/img/blur/shadow_outline_darker.png)
Outro método de lidar com o posicionamento e o offset da sombra é basicamente descartar todos os offsets gerados pelo "[-shadow](https://imagemagick.org/command-line-options/#shadow)" (usando "[+repage](https://imagemagick.org/command-line-options/#repage)") e sobrepor a imagem original centralizada sobre a imagem de sombra maior. Adicionando um offset de composição "[-geometry](https://imagemagick.org/command-line-options/#geometry)", pode-se então deslocar a sombra como uma ação separada. |
magick -background none -fill white -stroke black \
-font Candice -pointsize 48 label:A -trim \
\( +clone -background navy -shadow 80x3 \) +swap \
+repage -gravity center -geometry -3-3 -composite \
shadow_geometry_offset.png
![[IM Output]](../static/img/blur/shadow_geometry_offset.png)
No entanto, note como o offset é o negativo do que normalmente se usaria para posicionar a sombra. Isso ocorre porque, na verdade, está-se deslocando a forma do texto e não a sombra, de modo que é na direção oposta. Esse método, porém, recortará a imagem de origem original, em vez da imagem de sombra, se o offset se tornar maior que o dobro do 'sigma' do desfoque. Assim, ele não pode ser usado para 'sombras duras' (usando um 'sigma' de desfoque 'x0'), a menos que se inclua algum espaço de preenchimento na imagem de sombra para que a imagem original seja sobreposta. Com uma sombra suave e difusa, porém, isso raramente é um problema. Para alguns exemplos práticos de sombreamento, veja Sombreamento de miniaturas e Melhor Geração de Logotipos 3D.
Sombra no Comando Montage
A partir do IM v6.3.1, a configuração "[-shadow](https://imagemagick.org/command-line-options/#shadow)" do "magick montage" passou a fazer uso das sombras suaves 'com forma' que este operador fornece. |
montage -label Rose rose: \
-background none -geometry +5+5 -shadow shadow_montage.png
![[IM Output]](../static/img/blur/shadow_montage.png)
No entanto, não são fornecidos controles para definir a cor, o grau de difusão e o offset dessa sombra, pois o "magick montage" nunca forneceu tais controles, além de uma simples opção liga/desliga.
Detalhes Internos da Sombra
Internamente, o "[-shadow](https://imagemagick.org/command-line-options/#shadow)" é extremamente complexo. Basicamente, ele não só precisa ampliar uma imagem para acomodar uma 'sombra suave e borrada', como também precisa desfocar a forma existente da imagem, definir sua cor de forma apropriada e, por fim, ajustar os offsets de página/tela virtual; tudo conforme as especificações do usuário. Por exemplo, dado o seguinte comando "[-shadow](https://imagemagick.org/command-line-options/#shadow)"...
magick image_clone.png -shadow 60x4+5+5 image_shadow.png
A operação equivalente do IM seria...
magick image_clone.png -alpha set \
-bordercolor none -border 8 -repage -8-8\! \
-channel A -virtual-pixel transparent \
-blur 8x4 -evaluate multiply .60 +channel
-fill {background_color} -colorize 100% \
-repage +5+5\! image_shadow.png
| Note que o valor 8 acima é duas vezes o sigma do desfoque, de modo a fornecer espaço suficiente para a sombra borrada. No entanto, isso significa que a imagem final ficará 4 vezes o sigma em pixels maior. Para compensar, adiciona-se também uma quantidade igual de offset negativo. Como um offset negativo de 2 vezes o sigma será adicionado à imagem gerada, deve-se ter cuidado para evitar que a sombra seja recortada ou posicionada incorretamente em relação à imagem original. Isso pode ser feito dando à imagem original um offset positivo inicial (como 8-5 ou +3+3 pixels), ou usando Layers Merge, que entende offsets negativos sem recortar a imagem final. Basicamente, use as técnicas anteriores para lidar corretamente com os possíveis offsets negativos envolvidos com imagens de sombra. | Os formatos PNG e MIFF são os únicos formatos de imagem que conheço capazes de lidar com um offset negativo, além de pixels semitransparentes. Recomenda-se usar PNG ao salvar imagens de sombra para uso futuro. |
|---|---|
Como foi dito, o "[-shadow](https://imagemagick.org/command-line-options/#shadow)" é uma operação muito complexa. É claro que, embora o exemplo acima seja próximo do que o "[-shadow](https://imagemagick.org/command-line-options/#shadow)" faz internamente, não é exatamente o mesmo. O operador "[-shadow](https://imagemagick.org/command-line-options/#shadow)" real não altera nenhuma das configurações globais, como as cores de borda/fundo/preenchimento, nem a configuração de pixel virtual atual. Além disso, ele curto-circuita o uso do operador "[-blur](https://imagemagick.org/command-line-options/#blur)" se o sigma do desfoque estiver definido como 0, para impedir que a função de desfoque emita um aviso de sigma ou raio zero. |
FUTURE: overlaying multiple shadows
Overlaying two images with shadows, produces an unrealistic darkening of the
shadow where the shadow overlaps. This darkening would be correct if each
object was lit by separate light sources, but more commonly the objects are
lit by the same light source.
The solution is to overlay the one image over the other, applying the shadow
effects to the opaque parts of each layer image in turn. That is, the
background shadow should be generated separately into each layer. Remember
the shadow cast by the top most layer should become fuzzier than the shadow
contribution of the bottom most layer.
This complexity gets worse when you have three objects shadowing each other.
Also the offset and blurring from the shadow of each object should technically
be separate. To generate that level of complexity, probably a 3-d ray-tracing
program should be used instead (sigh).
Desfoques Especializados
Há alguns outros tipos de desfoque que foram adicionados na versão 6 do IM, com usos muito especiais. Eles operam de maneiras específicas, e não em todas as direções como fazem a maioria das outras operações do estilo 'convolução'. Também podem não funcionar tão bem quanto outros métodos de gerar desfoques especializados, como distorcer imagens antes e depois de um desfoque mais convencional. Por exemplo, veja Truques de Ciclo Polar e Desfoque Elíptico (mapeado).
AVISO: Todos esses desfoques são experimentais, e a sintaxe pode mudar!
Desfoque Radial
É possível desfocar a imagem em círculo usando um "[-radial-blur](https://imagemagick.org/command-line-options/#radial-blur)", como se ela estivesse girando repetidamente. Embora tecnicamente este seja um desfoque rotacional ou angular, e não um desfoque radial. NOTA: É possível obter um resultado de qualidade muito maior (embora a uma velocidade muito menor) usando a técnica Depolar-Polar - Desfoque Rotacional. Note, porém, que, assim como um operador "[-blur](https://imagemagick.org/command-line-options/#blur)" normal, o "[-radial-blur](https://imagemagick.org/command-line-options/#radial-blur)" é afetado pela configuração "[-channel](https://imagemagick.org/command-line-options/#channel)". |
magick -size 70x70 xc:none \
-stroke red -strokewidth 15 -draw 'line 35,5 35,65' \
-stroke yellow -strokewidth 9 -draw 'line 35,5 35,65' \
-channel RGBA -radial-blur 30 radial_blur.png
![[IM Output]](../static/img/blur/radial_blur.png)
É possível posicionar o objeto fora do centro (adicionando algum espaço a uma imagem) para efeitos de "[-radial-blur](https://imagemagick.org/command-line-options/#radial-blur)" mais interessantes. |
magick -size 70x70 xc:none \
-stroke red -strokewidth 15 -draw 'line 5,50 65,50' \
-stroke yellow -strokewidth 9 -draw 'line 5,50 65,50' \
-channel RGBA -radial-blur 90 radial_blur_90.png
![[IM Output]](../static/img/blur/radial_blur_90.png)
O argumento do desfoque é o ângulo que o radial-blur abrange. Ou seja, metade desse ângulo em cada direção a partir da imagem original. Assim, um ângulo de 180 abrange meio círculo, enquanto 360 graus desfocará a imagem em um círculo completo. |
magick -size 70x70 xc:none \
-stroke red -strokewidth 15 -draw 'line 5,50 65,50' \
-stroke yellow -strokewidth 9 -draw 'line 5,50 65,50' \
-channel RGBA -radial-blur 180 radial_blur_180.png
magick -size 70x70 xc:none \
-stroke red -strokewidth 15 -draw 'line 5,50 65,50' \
-stroke yellow -strokewidth 9 -draw 'line 5,50 65,50' \
-channel RGBA -radial-blur 360 radial_blur_360.png
![[IM Output]](../static/img/blur/radial_blur_360.png)
Pode-se até adicionar um pouco de Deformação de Imagem para tornar o efeito mais interessante... |
magick -size 70x70 xc:none \
-stroke red -strokewidth 15 -draw 'line 5,50 65,50' \
-stroke yellow -strokewidth 9 -draw 'line 5,50 65,50' \
-channel RGBA -radial-blur 180 -swirl 180 radial_swirl.png
![[IM Output]](../static/img/blur/radial_swirl.png)
O desfoque radial de círculo completo pode ser usado para gerar gradientes circulares aproximados. No entanto, formular a forma correta para gerar o gradiente correto pode ser extremamente difícil e provavelmente não vale o esforço. Ainda assim, houve uma tentativa... |
magick -size 80x80 xc:lightblue -fill red \
-draw "path 'M 40,40 C 43,43 47,47 50,40 \
S 52,23 40,20 S 14,22 10,40 S 15,75 40,79 Z'" \
radial_gradient_pre.gif
magick radial_gradient_pre.gif -radial-blur 360 radial_gradient.gif
Desfoque de Movimento
É possível adicionar um desfoque que se atenua linearmente em apenas uma direção (fornecendo um raio e um sigma, além do ângulo em que o desfoque deve ocorrer), usando um "[-motion-blur](https://imagemagick.org/command-line-options/#motion-blur)". Isso dá à imagem uma aparência como se ela (ou a câmera) estivesse se movendo muito, muito rápido. |
magick -size 70x70 xc:none -channel RGBA \
-fill yellow -stroke red -strokewidth 3 \
-draw 'circle 45,45 35,35' -motion-blur 0x12+45 motion_blur.png
![[IM Output]](../static/img/blur/motion_blur.png)
Note que o objeto não só ganha um rastro, como também as bordas na direção do movimento têm o fundo desfocado sobre elas. Esse desfoque da borda dianteira pode ser melhorado redesenhando ou sobrepondo a imagem original e reaplicando um "[-motion-blur](https://imagemagick.org/command-line-options/#motion-blur)" menor várias vezes. |
magick -size 70x70 xc:none -channel RGBA \
-fill yellow -stroke red -strokewidth 3 \
-draw 'circle 45,45 35,35' -motion-blur 0x8+45 \
-draw 'circle 45,45 35,35' -motion-blur 0x6+45 \
-draw 'circle 45,45 35,35' -motion-blur 0x2+45 \
motion_blur_redraw.png
![[IM Output]](../static/img/blur/motion_blur_redraw.png)
Vários desfoques de movimento podem ser aplicados para causar algum espalhamento da cauda que segue o objeto em movimento. Algo como fumaça ou chamas se dissipando. |
magick -size 70x70 xc:none -channel RGBA \
-fill yellow -stroke red -strokewidth 3 \
-draw 'circle 45,45 35,35' -motion-blur 0x12+25 \
-draw 'circle 45,45 35,35' -motion-blur 0x12+55 \
-draw 'circle 45,45 35,35' -motion-blur 0x12+40 \
motion_blur_spread.png
![[IM Output]](../static/img/blur/motion_blur_spread.png)
Essa técnica pode ser usada para gerar uma sombra que se espalha no chão. Como alternativa, poderia-se gerar um desfoque de movimento e depois aplicar-lhe um pouco de desfoque radial, embora isso exija algum deslocamento da imagem para acertar o centro. Também é possível adicionar um pouco mais de Deformação de Imagem para tornar as coisas ainda mais interessantes... |
magick -size 70x100 xc:none -channel RGBA \
-fill yellow -stroke red -strokewidth 3 \
-draw 'circle 35,80 45,70' -motion-blur 0x20+90 \
-background none -rotate 50 -wave 5x25 -rotate -50 \
-gravity center -crop 70x100+0+0 +repage \
-draw 'circle 35,80 45,70' -blur 0x2 \
motion_wave.png
Note que, enquanto o "[-radial-blur](https://imagemagick.org/command-line-options/#radial-blur)" desfoca em ambas as direções, o "[-motion-blur](https://imagemagick.org/command-line-options/#motion-blur)" desfoca em apenas uma direção. Em ambos os casos, recomenda-se preencher a imagem com espaço extra ao redor da borda (geralmente usando "[-border](https://imagemagick.org/command-line-options/#border)"), pois esses dois desfoques especializados têm fortes efeitos de borda que é melhor evitar. Se encontrar um exemplo ou uso mais prático ou interessante do que foi mostrado acima, por favor, envie uma cópia por e-mail (endereço no rodapé da página).
Suavização de Formas usando Desfoque
Em Construção
AVISO: Esta seção está agora desatualizada, e os usuários que desejam suavizar imagens corretamente devem consultar Suavização de Formas usando Distância. O que é mostrado aqui é conhecido como 'Suavização por Desfoque' que, como se mostra mais adiante, é uma 'Técnica de Suavização Falsa'. Ainda assim, continua sendo um método útil, mas apenas com formas de imagem 'convexas'. Ao recortar uma forma de uma imagem, muitas vezes deseja-se suavizar ou desfocar um pouco as bordas da forma para dar-lhe uma aparência mais suave, para atenuar quaisquer partes fora da forma que possam ter sido incluídas acidentalmente, ou para permitir que a imagem se encaixe no fundo sem tornar óbvio que se trata de um copiar-e-colar. Basicamente, em vez de ter uma borda 'dura' em alguma forma, suaviza-se para 'simular' anti-aliasing ou desfoque de lente, de modo que a colagem fique mais imperceptível. Por exemplo, aqui há uma imagem GIF que se sobrepõe a um fundo de cor clara |
magick shape.gif -background wheat -flatten overlaid.png
![[IM Output]](../static/img/blur/overlaid.png)
No entanto, como se está sobrepondo uma imagem GIF com transparência booleana e que, por consequência, tem bordas altamente serrilhadas, ou em forma de escada, a imagem parece muito deslocada sobre o fundo. Ao lidar com imagens da vida real, o resultado acima pareceria muito artificial. Mas, desfocando um pouco a transparência da imagem, é possível fazer a sobreposição se encaixar no fundo de forma mais suave. |
magick figure.gif -alpha set -virtual-pixel transparent \
-channel A -blur 0x0.7 -level 50,100% +channel \
-background wheat -flatten edge_blured.png
![[IM Output]](../static/img/blur/edge_blured.png)
A propósito, esta é exatamente a mesma técnica usada para gerar Bordas Suaves em miniaturas. Para mais exemplos disso, veja os resultados do script de mascaramento "feather" de Fred Weinhaus. Como se pode ver, isso funciona muito bem em casos simples, quando há um alto contraste entre a imagem sobreposta e o fundo. No entanto, há problemas sérios quando se deseja usar um fator de desfoque de suavização muito maior, ou quando as duas imagens são de cores muito claras.
Note que, como o desfoque se estende tanto para dentro quanto para fora da área da forma, o canal alfa precisa ser ajustado de modo que a borda da forma seja zero (totalmente transparente), mas rapidamente se torne totalmente opaca à medida que se afasta da borda. Um exemplo justamente desse tipo de ajuste de canal alfa é fornecido por CLUT com Tratamento de Transparência. Esse ajuste é crítico; caso contrário, em vez de atenuar a área fora da forma, adiciona-se uma sombra ou halo semitransparente da área fora da forma. Basicamente, alguma 'cor indefinida' semitransparente que antes estava oculta pela transparência da imagem. No entanto, o desfoque tem um problema particularmente desagradável de também suavizar o contorno da forma. Por exemplo... |
magick -size 100x60 xc: -draw 'polygon 5,5 50,30 5,55 95,30' \
sharp_angles.gif
![[IM Output]](../static/img/blur/sharp_angles.gif)
Se você desfocar essa forma em particular, obtém... |
magick sharp_angles.gif -blur 0x5 feather_blurred.gif
![[IM Output]](../static/img/blur/feather_blurred.gif)
Note como as pontas da máscara foram atenuadas mais do que as bordas. Note também como o ângulo interno pareceu ficar 'preenchido', o que, com transparência, pode fazer com que pixels totalmente transparentes se tornem semitransparentes. Ou seja, pixels com uma cor indefinida podem realmente se tornar visíveis! Isso é visto com mais clareza aplicando-se um limiar à imagem. |
magick feather_blurred.gif -threshold 50% feather_blur_thres.gif
![[IM Output]](../static/img/blur/feather_blur_thres.gif)
Esse é o problema de usar o 'desfoque' como método de suavização de imagens. E é especialmente preocupante ao lidar com coisas como dedos e orelhas, bem como as áreas entre as pernas. Ou seja, o efeito sobre a forma dos próprios apêndices e os espaços entre eles. Se a imagem tiver um contorno de borda semelhante a um desenho animado, então isso não é um problema tão grande para uma suavização de '1 pixel'. Mas, para imagens da vida real (sem bordas definidas), é um problema real. Uma solução adequada seria encontrar algum tipo de medida de quão distante um ponto está de uma borda da forma, mas de modo que duas bordas próximas não somem seus efeitos. Essa operação de medição de distância foi agora adicionada ao IM e é conhecida como Morfologia de Distância. Para detalhes de como usá-la para suavização, veja Suavização de Formas usando Distância.
Operadores Relacionados
Basic image modifications
-despeckle -enhance
-noise -spread -displace
-median
Set each channel color of the pixel to the median value of all all pixels
within a given radius. (median = center most value of all values found,
half on one side, half on the other). This is a way of "de-speckling" an
image (such a dust in a scan). But could distort edges, cause some color
channel aburation, and remove thin lines.
This filter is the best technique to use for removing Salt & Pepper
noise, especially on gray scale images.
It is suggested that a trim for a scan use a median filtered image for
attempting to find the appropriate bounding box.
-adaptive-sharpen radius x sigma
Adjust sharpening so that it is restricted to close to image edges
as defined by edge detection.
See forum discussion
https://magick.imagemagick.org/viewtopic.php?f=1&t=10266
-adaptive-blur radius x sigma
Blur images, except close to the edges as defined by an edge detection
on the image. Eg make the colors smoother, but don't destroy any
sharp edges the image may have.
-adaptive-resize
Resize but attempt not to blur across sharp color changes
![[IM Output]](../static/img/blur/blur_source.png)
![[IM Output]](../static/img/blur/blur_montage.jpg)
![[IM Output]](../static/img/blur/black_blurred_RGBA.png)
![[IM Output]](../static/img/blur/yellow_blurred_RGBA.png)
![[IM Output]](../static/img/images/rose.png)
![[IM Output]](../static/img/blur/rose_blur_5.png)
![[IM Output]](../static/img/blur/rose_resize_5.png)
![[IM Output]](../static/img/blur/A_original.jpg)
![[IM Output]](../static/img/blur/A_blur.jpg)
![[IM Output]](../static/img/blur/A_blur_sharp.jpg)
![[IM Output]](../static/img/blur/A_blur_sharp_x2.jpg)
![[IM Output]](../static/img/blur/A_blur_unsharp.jpg)
![[IM Output]](../static/img/blur/radial_blur_180.png)
![[IM Output]](../static/img/blur/radial_gradient_pre.gif)
![[IM Output]](../static/img/blur/radial_gradient.gif)
![[IM Output]](../static/img/blur/motion_wave.png)