Exemplos do ImageMagick -- Filtros de Reamostragem
Aqui entramos nos aspectos de nível mais baixo do Redimensionamento e da Distorção de imagens, examinando os filtros de reamostragem usados para determinar a cor final de cada pixel individual na imagem resultante. Este é um assunto extenso, longamente estudado e muitas vezes cheio de opiniões e pontos de vista pessoais em vez de fatos qualitativos concretos, pois é impossível determinar o que constitui uma imagem redimensionada perfeita. Isso é um fato comprovado e faz deste um campo de estudo muito vasto que nunca será concluído. Recomenda-se ler e compreender os Operadores de Redimensionamento e Escala.
Artefatos de Reamostragem - Quão bom é o Resize do IM
O redimensionamento de imagens precisa combater um problema muito difícil. Como reduzir um arranjo de valores em um arranjo menor, ou maior, de valores de modo que fique bom aos nossos olhos. Muita coisa pode dar errado ao tentar fazer isso, mas os problemas se enquadram em quatro categorias básicas..
Blocagem
Essencialmente, se você ampliar uma imagem simplesmente replicando pixels, criará blocos retangulares maiores de pixels. De fato, ampliar imagens usando "[-scale](https://imagemagick.org/command-line-options/#scale)" ou "[-sample](https://imagemagick.org/command-line-options/#sample)" faz exatamente isso, produzindo uma imagem ampliada e pixelizada. Por exemplo, aqui eu amplio uma imagem pequena, gerando grandes blocos de cor em vez de uma imagem suave e agradável. Ao lado há uma versão 'redimensionada' e, por fim, uma que usa um filtro Gaussian para desfocá-la mais do que o normal e substituir pixels isolados por pontos arredondados, a fim de remover parte da blocagem.
magick storm.gif -scale 300% storm_scaled.gif
magick storm.gif -resize 300% storm_resized.gif
magick storm.gif -filter Gaussian -resize 300% storm_resized_gas.gif
![[IM Output]](../static/img/images/storm.gif)
Original | | ![[IM Output]](../static/img/filter/storm_scaled.gif)
Escalada | ![[IM Output]](../static/img/filter/storm_resized.gif)
Redimensionada | ![[IM Output]](../static/img/filter/storm_resized_gas.gif)
Redimensionada com Gaussian
---|---|---|---|---
A principal causa da 'blocagem' é uma imagem de origem mal suavizada (anti-aliasing) ou uma suavização insuficiente (mistura de cores ou desfoque) entre os pixels para melhorar a aparência geral da imagem. Também costuma ser vista quando uma imagem de resolução muito baixa é redimensionada para uma escala muito maior ou para uso em um dispositivo de alta resolução. O lugar mais comum onde isso aparece é no uso de uma imagem bitmap em boletins e revistas criados por usuários, que depois eram impressos em impressoras a laser de altíssima resolução. O boletim fica ótimo na tela, mas sai 'em blocos' na página impressa. Essa situação é muito difícil de corrigir e, em geral, é melhor evitá-la usando um clipart de resolução muito maior ou uma imagem vetorial escalável (como imagens nos formatos SVG e WMF). É claro que, em algumas situações, os artefatos de blocagem são de fato desejáveis e são realçados no resultado. Por exemplo, quando você tenta recriar jogos de vídeo antigos de baixa resolução em telas modernas de alta resolução, manter a antiga 'blocagem' da imagem realça o visual 'retrô'. Ou talvez quando você tenta rotacionar imagens sem gerar cores novas ou mescladas. As técnicas para de fato preservar a 'blocagem', mas preenchendo os quadrados com linhas diagonais, são conhecidas como Algoritmos de Escala de Pixel Art, e muitos desses esquemas foram desenvolvidos. Um esquema foi incorporado ao ImageMagick, com o operador Magnify.
Ondulação
A ondulação (ringing) é um efeito que você costuma ver em imagens JPEG de qualidade muito baixa perto de bordas nítidas. Normalmente é causada por uma borda que foi supercompensada pelo algoritmo de redimensionamento ou de compressão da imagem, ou por um filtro de alta qualidade usado com um tamanho de suporte inadequado. Aqui, por exemplo, uso uma opção especial para selecionar um filtro Sinc bruto, em uma mudança de cor muito abrupta. Também repeti a operação usando o operador de redimensionamento padrão do IM, com sua seleção de filtro padrão para ampliações de imagem.
magick -size 8x16 xc:'#444' xc:'#AAA' +append gray_edge.gif
magick gray_edge.gif -filter Sinc \
-resize 100x100\! gray_edge_ringing.gif
magick gray_edge.gif -resize 100x100\! gray_edge_resize.gif
O exemplo acima mostra com bastante clareza a supercompensação produzida pelo uso de um filtro de redimensionamento bruto, sem nenhuma das otimizações que o IM oferece. A segunda imagem, produzida pelo filtro de ampliação padrão do IM, também mostra um leve efeito de ondulação, mas ele é quase imperceptível e, na verdade, desejável, pois aguça perceptualmente a borda. Aqui está outro exemplo do efeito de ondulação, desta vez ampliando um único pixel sobre um fundo cinza. |
magick -size 1x1 xc: -bordercolor '#444' -border 4x4 \
-define filter:lobes=5 -filter Sinc \
-resize 100x100\! dot_sinc.gif
![[IM Output]](../static/img/filter/dot_sinc.gif)
Esta imagem também mostra claramente os efeitos secundários gerados pelo uso de um filtro unidimensional. Ou seja, o efeito de ondulação é mais forte nas direções horizontal e vertical (ortogonais), com ondulação secundária a 45 graus. E, desta vez, com um filtro cilíndrico (via Operação de Distorção Resize), mostrando como ele difere do filtro (tensor) mais comum, alinhado ortogonalmente em 2 passos, que o Operador Resize usa. |
magick -size 1x1 xc: -bordercolor '#444' -border 4x4 \
-define filter:lobes=5 -filter Jinc \
-distort resize 100x100\! +repage dot_jinc.gif
![[IM Output]](../static/img/filter/dot_jinc.gif)
Esses efeitos normalmente não são visíveis e só aparecem aqui por causa do uso de um filtro 'Sinc' ou 'Jinc' bruto (veja Filtros com Janelamento mais abaixo) para algumas ampliações extremas. Em geral, um filtro 'bruto' como este não é usado.
Serrilhamento e Efeitos de Moiré
Os efeitos de serrilhamento (aliasing) costumam ser vistos como a produção de efeitos de 'escada' ao longo das bordas das imagens. Muitas vezes isso é causado pela amostragem bruta da imagem, como ao usar "[-sample](https://imagemagick.org/command-line-options/#sample)", ou por um aguçamento excessivo da imagem durante o redimensionamento. Um efeito de escada é mais perceptível na forte redução de imagens, embora raramente seja visto no IM. No entanto, o serrilhamento também tem outros efeitos, em particular os padrões de Moiré em grande escala que aparecem em imagens contendo algum tipo de padrão em nível de pixel. Esses padrões de baixo nível costumam produzir padrões de Moiré em grande escala, incluindo: padrões de linhas paralelas, tramas de tecido (a seda exibe esse efeito na vida real!), bem como padrões de tijolos e ladrilhos em fotos de prédios de tijolos, cercas e pavimentos.
Para ver alguns exemplos de imagens redimensionadas que produzem fortes efeitos de Moiré, consulte a página Wikipedia, Padrão de Moiré. A maneira clássica de verificar se um redimensionamento produzirá problemas de serrilhamento é reduzir uma Imagem de Anéis (veja à direita). Essa imagem costuma mostrar efeitos de Moiré quando qualquer forma de redimensionamento é aplicada em qualquer escala. Os navegadores web, em particular, mostram esses efeitos de Moiré ao exibir tal imagem devido ao uso de uma técnica de redimensionamento ultrarrápida (mas muitas vezes ruim).
Aqui mostro a imagem 'anéis' redimensionada usando o operador "[-sample](https://imagemagick.org/command-line-options/#sample)", que serrilha fortemente, o operador de média de blocos "[-scale](https://imagemagick.org/command-line-options/#scale)" e o "[-resize](https://imagemagick.org/command-line-options/#resize)" padrão normal.
magick rings_sm_orig.gif -sample 100x100 rings_sample.png
magick rings_sm_orig.gif -scale 100x100 rings_scale.png
magick rings_sm_orig.gif -resize 100x100 rings_resize.png
![[IM Output]](../static/img/filter/rings_sample.png)
sample | ![[IM Output]](../static/img/filter/rings_scale.png)
scale | ![[IM Output]](../static/img/filter/rings_resize.png)
resize
---|---|---
Como você pode ver, todos os métodos de redimensionamento produziram alguns efeitos de Moiré, embora o operador de redimensionamento padrão do IM produza a menor quantidade desses padrões secundários indesejáveis na imagem final. Para mostrar os efeitos de um redimensionamento leve, recortei o canto da Imagem de Anéis Grande, cujo resultado é mostrado primeiro, e então reduzi seu tamanho em apenas 5%.
magick rings_lg_orig.png -crop 105x105+0+0 rings_crop.png
magick rings_crop.png -sample 100x100 rings_crop_sample.png
magick rings_crop.png -scale 100x100 rings_crop_scale.png
magick rings_crop.png -resize 100x100 rings_crop_resize.png
![[IM Output]](../static/img/filter/rings_crop.png)
original recortado | | ![[IM Output]](../static/img/filter/rings_crop_sample.png)
sample | ![[IM Output]](../static/img/filter/rings_crop_scale.png)
scale | ![[IM Output]](../static/img/filter/rings_crop_resize.png)
resize
---|---|---|---|---
Como você pode ver, mesmo um redimensionamento leve revelará qualquer serrilhamento que um operador de redimensionamento possa ter. Na verdade, se olhar de perto, talvez veja até um efeito de Moiré muito leve no recorte original não escalado da imagem inicial, o que resulta das limitações de usar apenas uma imagem rasterizada em uma densidade adequada para exibição na tela de um computador. Ou seja, o quão sensível esta imagem de teste é para mostrar efeitos de serrilhamento causados pela redução de imagens.
Desfoque
A maioria das pessoas conhece o desfoque que pode ser gerado pelo uso de "[-resize](https://imagemagick.org/command-line-options/#resize)". Na verdade, essa é provavelmente a reclamação número um sobre qualquer imagem redimensionada, e com boa razão. Normalmente, um redimensionamento muito pequeno tende a produzir uma imagem desfocada, e redimensioná-la de novo só vai piorar. O problema é que, quando você redimensiona uma imagem, está alterando a imagem armazenada como uma 'grade' ou arranjo de pixels (conhecido como 'raster') para se ajustar a uma grade de pixels completamente diferente. As duas 'grades' não vão coincidir, exceto em casos muito especiais, e, como resultado, os dados da imagem precisam ser modificados para se ajustar a esse novo padrão de pontos. Basicamente, é impossível redimensionar diretamente uma imagem e esperar que ela saia perfeita, embora um resultado razoável possa ser alcançado. O resultado costuma ser um leve desfoque dos dados dos pixels. Quanto melhor o algoritmo de redimensionamento, menor o desfoque das bordas nítidas. No entanto, alguns filtros de redimensionamento, especialmente os projetados especificamente para ampliar imagens, muitas vezes adicionam muito mais desfoque do que o necessário. Isso serve para combater os artefatos de 'Blocagem' demonstrados acima. Para a redução de imagens, uma borda desfocada costuma ser usada para evitar artefatos de 'Ondulação' em bordas nítidas e reduzir possíveis efeitos de Serrilhamento. Isso, porém, é um compromisso de recurso limitado, e um que o IM se esforça muito para evitar. Mesmo assim, uma configuração especial de nível avançado, Filter Blur, pode ser usada para ajustar o desfoque que um filtro fornece. Mas atenção: embora um número menor que 1.0 supostamente reduza o desfoque, ele também pode piorá-lo, dependendo do filtro exato e das proporções de redimensionamento usadas. Nenhuma garantia pode ser dada. |
Antes do IM v6.3.6-3, a configuraçãoFilter Blur era chamada de "[-support](https://imagemagick.org/command-line-options/#support)", o que era muito enganoso quanto ao que ela realmente fazia. Essa opção foi descontinuada e não está mais disponível. |
|---|---|
| O melhor método para corrigir os efeitos de desfoque causados pelo redimensionamento é refiltrar a imagem usando um operador de aguçamento. Veja Aguçar Imagens Redimensionadas para mais detalhes. |
O Resize do IM versus outros Programas
Uma comparação prática do operador de redimensionamento padrão do IM com vários outros programas no redimensionamento de uma imagem do mundo real foi fornecida por Bart van der Wolf em...
Exemplo de Redução por Amostragem
Especificamente, em resumo para o resize do IM...
Embora a quantidade de aguçamento seja uma questão de gosto, a ausência de artefatos de serrilhamento produz a imagem mais limpa e de aparência mais natural de todas.
Ele também analisa um teste de 'anéis', para comparar diretamente vários métodos de redimensionamento do Photoshop com o ImageMagick...
Métodos de Redução por Amostragem
Esses artigos mostram o quanto fazer o redimensionamento corretamente (e usar os métodos de filtragem certos) é importante para o processamento de imagens. Analisamos isso mais de perto na próxima seção.
Filtros de Reamostragem
A configuração "[-filter](https://imagemagick.org/command-line-options/#filter)" é o controle chave de como o "[Redimensionamento de Imagens](resize.html#resize)", bem como o "[Operador de Distorção Geral](distorts.html#distort)", funciona para produzir um resultado limpo com o mínimo de Artefatos de Reamostragem. Este foi um tópico de intenso estudo no final da década de 1980, a partir do qual Paul Heckbert, um importante pesquisador nessa área, produziu e liberou publicamente seu programa de redimensionamento de imagens "**[zoom](http://www.xmission.com/~legalize/zoom.html)**". Esse programa tornou-se o pai da maioria dos programas de redimensionamento de imagens usados hoje, embora muitos programas posteriores o implementem de forma deficiente, pois é fácil errar. Por exemplo, veja os resultados dos testes sobre Como os navegadores web redimensionam imagens. De muitas maneiras, esses filtros estão intimamente relacionados à Convolução de Imagens, e até mesmo ao Núcleo de Desfoque. Eles até sofrem de problemas semelhantes. No entanto, os filtros são projetados para melhorar a aparência do resultado final ao redimensionar ou distorcer uma imagem. Os nomes dos filtros são um verdadeiro "quem é quem" dos especialistas em processamento de imagens e matemáticos do último século (ou mais). Eles geralmente não descrevem o filtro, mas apenas rotulam a pessoa que primeiro publicou o filtro (ou a família de filtros), ou que mais pesquisou sobre aquele filtro. Isso, porém, torna muito mais difícil saber se um filtro 'Lagrange' (nomeado em homenagem a Joseph-Louis Lagrange) é melhor do que, digamos, um filtro 'Catrom' (nomeado em homenagem a Edwin Catmull e Raphael Rom). Aqui explicarei os principais aspectos dos filtros. Não é essencial que você aprenda essas coisas, mas decidi documentar um resumo do que aprendi, após concluir pesquisas nessa área, como parte de uma grande revisão e expansão do sistema de filtros de redimensionamento do IM (IM 6.3.7-1). Agradecimentos especiais a Fred Weinhaus por sua ajuda na pesquisa durante o redesenvolvimento dos Filtros de Redimensionamento. Ele estava especialmente ansioso pela adição da família de filtros '[Lagrange](#lagrange)', que não existia no resize do IM antes desta revisão. Agradecimentos também a Nicolas Robidoux, cuja matemática ajudou a resolver uma falha grave no Operador de Distorção Geral, e depois a desenvolver os Filtros Cilíndricos, que produzem resultados melhores do que os obtidos com o Operador Resize.
Como os filtros funcionam
Ao redimensionar uma imagem, você está basicamente tentando determinar o valor correto de cada pixel na nova imagem, com base nos pixels da imagem de origem original. No entanto, esses novos pixels não coincidem exatamente com as posições dos pixels antigos e, portanto, um valor correto para eles precisa ser determinado de alguma forma. O que se faz é tentar usar algum tipo de média ponderada dos valores dos pixels de origem originais para determinar um bom valor para o novo pixel. Os pixels reais que cercam a localização do novo pixel formam uma 'vizinhança' de valores contribuintes. Quanto maior essa vizinhança, mais lento o redimensionamento. Esta é uma técnica chamada Convolução. O quanto cada pixel vizinho real (conhecido como 'amostra') contribui para produzir o pixel final é determinado por uma função de ponderação. Esse é o 'filtro ' que você pode selecionar usando a configuração "[-filter](https://imagemagick.org/command-line-options/#filter)". Esse filtro, por sua vez, geralmente tem um tamanho de vizinhança ideal, conhecido como o 'suporte ' do filtro, embora também seja conhecido como sua 'janela '. Um 'filtro ' bidimensional pré-definido também é conhecido como um 'núcleo de convolução '.
_FUTURE: some diagrams may be helpful here_
O design dessas funções de ponderação, ou 'filtros', é um assunto muito complexo que envolve matemática avançada, análise de frequência e até Transformadas de Fourier. Um bom ponto de partida, se você tiver interesse nisso, é a Wikipedia: Teorema de amostragem de Nyquist–Shannon. No entanto, você realmente não precisa ir tão longe para compreender os filtros existentes e seus efeitos sobre as imagens.
Os Filtros
Filtros Interpolados
O tipo mais simples de funções de filtro de redimensionamento são os métodos Interpolativos. Eles pegam uma localização de pixel específica na imagem de origem e tentam simplesmente determinar um valor lógico de cor da imagem naquela localização com base nas cores dos pixels ao redor. Como há sempre um número fixo e mínimo de pixels envolvidos, esse tipo de filtro é um método muito rápido de redimensionar ou distorcer imagens. No entanto, essa também é a fraqueza do filtro, pois ele não mescla um número maior de pixels para formar uma imagem que seja muito menor do que a imagem original. Isso, por sua vez, pode resultar em fortes Efeitos de Serrilhamento e Moiré. A interpolação geralmente só é usada para amostragem 'por ponto' de imagens, quando a escala da imagem não é conhecida nem necessária. Por exemplo, ao rotacionar uma imagem ou aplicar pequenas distorções, a escala ou o tamanho da imagem não muda e, como tal, uma interpolação pode produzir um resultado razoável, embora não muito preciso. Para mais informações, veja a Configuração de Interpolação do IM. Ela não é, contudo, adequada para o redimensionamento geral de imagens.
Point
Usar uma configuração "[-filter](https://imagemagick.org/command-line-options/#filter)" igual a '**Point**' basicamente significa usar um filtro de interpolação não escalado. Para o Operador Resize, ele simplesmente selecionará o pixel mais próximo da posição do novo pixel, e é só isso. Isso significa que o Operador Resize simplesmente usará a cor de um pixel real da imagem de origem. Nenhuma tentativa será feita para mesclar cores ou gerar uma cor melhor para a imagem resultante. Como resultado, usar "-filter point -resize ..." produzirá o mesmo resultado que "[-sample](https://imagemagick.org/command-line-options/#sample)" (veja Operador de Amostragem), embora o último seja mais rápido, pois seu código é projetado especificamente para redimensionar imagens por amostragem por ponto, com controles para ajustar o ponto de amostragem exato. | _Para oOperador Distort, selecionar "[-filter](https://imagemagick.org/command-line-options/#filter) Point" forçará o uso da Amostragem por Ponto Interpolada em vez de um Filtro Cilíndrico. Veja Filtros de Imagem no Operador Distort para mais detalhes.
Se você deseja a mesma Amostragem por Ponto Interpolada para o redimensionamento normal de imagens, pode usar o operador Interpolative Resize. Ou usar o Distort Resize com filtro point para o mesmo resultado.
_
---|---
Aqui começo com um padrão de hachura de 10x10 pixels e reduzo seu tamanho, antes de escalá-lo para que você possa ver o resultado.
magick -size 10x10 pattern:gray50 checks_10.gif
magick checks_10.gif -filter point -resize 9x9 checks_point-1.gif
magick checks_10.gif -filter point -resize 8x8 checks_point-2.gif
magick checks_10.gif -filter point -resize 7x7 checks_point-3.gif
magick checks_10.gif -filter point -resize 6x6 checks_point-4.gif
magick checks_10.gif -filter point -resize 5x5 checks_point-5.gif
![[IM Output]](../static/img/filter/checks_10_mag.gif)
| | ![[IM Output]](../static/img/filter/checks_point-1_mag.gif)
Point-1 | ![[IM Output]](../static/img/filter/checks_point-2_mag.gif)
Point-2 | ![[IM Output]](../static/img/filter/checks_point-3_mag.gif)
Point-3 | ![[IM Output]](../static/img/filter/checks_point-4_mag.gif)
Point-4 | ![[IM Output]](../static/img/filter/checks_point-5_mag.gif)
Point 50%
---|---|---|---|---|---|---
Tudo o que realmente acontece é que linhas e colunas individuais de pixels são removidas ao longo da imagem. Mesmo nesse nível, você terá blocagem e serrilhamento extremos na imagem resultante e, em casos específicos como o acima, pode produzir um resultado completamente irrealista. Por isso, um filtro 'Point', ou o Operador de Amostragem equivalente mais rápido, não é recomendado para o redimensionamento normal de imagens.
Box
A configuração de filtro '**Box**' é exatamente igual à 'point' com uma leve variação. Ao reduzir imagens, ela calculará a média dos pixels e os mesclará. Quanto menor a imagem resultante, mais pixels serão mesclados na média.
Aqui está um gráfico da função de ponderação do filtro, a partir do qual você pode ver por que ele é chamado de filtro 'Box'. Basicamente, qualquer pixel que caia dentro da 'Box' será usado diretamente para calcular a cor do novo pixel. Ora, como o filtro tem apenas 1/2 pixel de largura, isso significa que, para uma imagem que não está sendo redimensionada, apenas um pixel, o mais próximo, será usado. Em outras palavras, quando nenhuma escala está envolvida (ou apenas ampliação), o pixel mais próximo da nova localização formará a cor do novo pixel. No entanto, se uma imagem estiver sendo reduzida, mais da imagem de origem será comprimido dentro dos limites dessa 'box'. O resultado é que mais pixels serão mesclados na média para produzir a cor do pixel na imagem menor. Por exemplo, aqui está uma visão ampliada de um padrão de pixels em tabuleiro de xadrez à medida que é lentamente comprimido usando um filtro 'Box'.
magick checks_10.gif -filter box -resize 9x9 checks_box-1.gif
magick checks_10.gif -filter box -resize 8x8 checks_box-2.gif
magick checks_10.gif -filter box -resize 7x7 checks_box-3.gif
magick checks_10.gif -filter box -resize 6x6 checks_box-4.gif
magick checks_10.gif -filter box -resize 5x5 checks_box-5.gif
![[IM Output]](../static/img/filter/checks_10_mag.gif)
| | ![[IM Output]](../static/img/filter/checks_box-1_mag.gif)
Box-1 | ![[IM Output]](../static/img/filter/checks_box-2_mag.gif)
Box-2 | ![[IM Output]](../static/img/filter/checks_box-3_mag.gif)
Box-3 | ![[IM Output]](../static/img/filter/checks_box-4_mag.gif)
Box-4 | ![[IM Output]](../static/img/filter/checks_box-5_mag.gif)
Box 50%
---|---|---|---|---|---|---
Como você pode ver, cada vez mais pixels são mesclados à medida que a imagem é redimensionada para menor usando um filtro 'Box', mas essa mesclagem ocorre em linhas e colunas específicas e igualmente espaçadas. Isso causa todo tipo de artefatos e efeitos de Moiré ou Serrilhamento tanto ao reduzir quanto ao ampliar imagens. Recomenda-se que a filtragem 'Box' seja usada para o 'binning' de imagens. Ou seja, reduzir imagens por múltiplos inteiros para garantir que cada pixel no resultado seja uma média do mesmo número de pixels vizinhos (o 'bin'). A imagem resultante permanecerá assim com aparência limpa, exatamente como na imagem final acima. Também se recomenda usar o Operador Scale, muito mais rápido, em vez do 'Filtro Box'. Ele produzirá resultados quase idênticos, exceto no caso especial de reduzir imagens em apenas alguns pixels. Ao fazer 'binning', ele produzirá resultados idênticos. |
OOperador Scale não é exatamente igual a um 'Filtro Box', pois é implementado usando um algoritmo especial de 'Mistura de Pixels'. Para detalhes exatos, veja Internos do Scale. |
|---|---|
Ao ampliar, tanto os filtros 'Point' quanto 'Box' produzirão a mesma 'replicação de pixels' de linhas e colunas, pois ambos resultam no uso de uma simples seleção de 'vizinho mais próximo'. |
magick -size 5x5 pattern:gray50 checks_5.gif
magick checks_5.gif -filter box -resize 6x6 checks_box+1.gif
magick checks_5.gif -filter box -resize 7x7 checks_box+2.gif
magick checks_5.gif -filter box -resize 8x8 checks_box+3.gif
magick checks_5.gif -filter box -resize 9x9 checks_box+4.gif
magick checks_5.gif -filter box -resize 10x10 checks_box+5.gif
![[IM Output]](../static/img/filter/checks_5_mag.gif)
| | ![[IM Output]](../static/img/filter/checks_box+1_mag.gif)
Box+1 | ![[IM Output]](../static/img/filter/checks_box+2_mag.gif)
Box+2 | ![[IM Output]](../static/img/filter/checks_box+3_mag.gif)
Box+3 | ![[IM Output]](../static/img/filter/checks_box+4_mag.gif)
Box+4 | ![[IM Output]](../static/img/filter/checks_box+5_mag.gif)
Box+5
---|---|---|---|---|---|---
| OOperador Scale também produz resultados semelhantes, mas com alguma mistura de cores dos pixels ao ampliar, a menos que a ampliação seja por um fator de escala inteiro.
---|---
Triangle
O filtro de interpolação 'Triangle ' ou '[Bilinear](misc.html#bilinear)' apenas leva a interpolação da vizinhança mais próxima um passo adiante. Em vez de simplesmente calcular a média direta dos pixels próximos, como o 'Box' faz, ele os pondera de acordo com o quão próxima a posição do novo pixel está dos pixels originais dentro da vizinhança (ou região de 'suporte '). Quanto mais próximo o novo pixel estiver de um pixel da imagem de origem, mais cor esse pixel contribui. Isso produz uma média mais global das cores quando as imagens estão sendo reduzidas de tamanho.
magick checks_10.gif -filter triangle -resize 9x9 checks_tri-1.gif
magick checks_10.gif -filter triangle -resize 8x8 checks_tri-2.gif
magick checks_10.gif -filter triangle -resize 7x7 checks_tri-3.gif
magick checks_10.gif -filter triangle -resize 6x6 checks_tri-4.gif
magick checks_10.gif -filter triangle -resize 5x5 checks_tri-5.gif
![[IM Output]](../static/img/filter/checks_10_mag.gif)
| | ![[IM Output]](../static/img/filter/checks_tri-1_mag.gif)
Tri-1 | ![[IM Output]](../static/img/filter/checks_tri-2_mag.gif)
Tri-2 | ![[IM Output]](../static/img/filter/checks_tri-3_mag.gif)
Tri-3 | ![[IM Output]](../static/img/filter/checks_tri-4_mag.gif)
Tri-4 | ![[IM Output]](../static/img/filter/checks_tri-5_mag.gif)
Tri
---|---|---|---|---|---|---
Como você pode ver, como os pixels dos cantos eram quase idênticos aos cantos da imagem original, eles ficam mais visíveis, mas em direção ao meio, onde nenhum dos pixels próximos coincide exatamente com o novo pixel sendo gerado, você obtém uma cor mais média de toda a vizinhança. O resultado para o padrão de pixels em tabuleiro de xadrez é uma tendência a surgir e desaparecer numa cor cinza média. No entanto, como a vizinhança de 'suporte é maior, mais pixels serão envolvidos quando você ampliar a imagem. Produzindo assim a média das cores ao gerar os pixels adicionados à imagem.
magick checks_5.gif -filter triangle -resize 6x6 checks_tri+1.gif
magick checks_5.gif -filter triangle -resize 7x7 checks_tri+2.gif
magick checks_5.gif -filter triangle -resize 8x8 checks_tri+3.gif
magick checks_5.gif -filter triangle -resize 9x9 checks_tri+4.gif
magick checks_5.gif -filter triangle -resize 10x10 checks_tri+5.gif
![[IM Output]](../static/img/filter/checks_5_mag.gif)
| | ![[IM Output]](../static/img/filter/checks_tri+1_mag.gif)
Tri+1 | ![[IM Output]](../static/img/filter/checks_tri+2_mag.gif)
Tri+2 | ![[IM Output]](../static/img/filter/checks_tri+3_mag.gif)
Tri+3 | ![[IM Output]](../static/img/filter/checks_tri+4_mag.gif)
Tri+4 | ![[IM Output]](../static/img/filter/checks_tri+5_mag.gif)
Tri+5
---|---|---|---|---|---|---
Para ampliações em grande escala, o resultado age como se um gradiente de cores fosse adicionado entre cada par de pixels. Por exemplo, aqui gero uma imagem muito pequena com um único pixel branco (a exibição é uma visão ampliada). Em seguida, amplio essa imagem enormemente.
magick xc: -bordercolor black -border 2x0 pixel_5.gif
magick pixel_5.gif -filter triangle -resize 300x pixel_triangle.gif
![]()
Imagem de Pixel Único
(ampliada) | | ![]()
Ampliada com Filtro Triangle
---|---|---
Se você fosse traçar um gráfico das cores da imagem acima (usando o script "[im_profile](../static/img/scripts/im_profile)"), veria uma réplica do gráfico do filtro triangular.
![[IM Profile]](../static/img/filter/plot_triangle.gif)
Perfil da Imagem
Como você pode ver, o pixel central foi mesclado com os pixels vizinhos para produzir um gradiente linear de cores entre esses pontos. Todos os filtros de interpolação produzem padrões de gradiente semelhantes entre pixels vizinhos, e essa também é a razão pela qual eles são tão bem adequados a ampliações de imagem.
Outros Filtros de Interpolação
À direita, tracei o gráfico dos vários filtros de interpolação, exceto o 'Point', que na verdade é um caso muito especial de um filtro 'Box' não escalado (uma interpolação '[NearestNeighbor](misc.html#nearest)' pura). Outros filtros de interpolação incluem o '**Hermite**', que é muito semelhante ao triangle nos resultados, mas produz um arredondamento mais suave nas ampliações, o que suaviza as transições de gradiente. Clique no gráfico à direita para ver um gráfico dessas três funções de filtro.
O filtro '**Lagrange**' tem sido chamado de filtro de interpolação 'universal'. Variando o tamanho do 'suporte' (veja a Configuração Avançada de Suporte abaixo), ele pode gerar todos os filtros de interpolação vistos anteriormente (exceto o 'Hermite'). As configurações padrão (um filtro Lagrange de ordem 3 (support=2.0), mostrado como a linha roxa no gráfico à direita) fornecem um filtro 'cúbico' razoável. Ele funciona muito bem, embora a mudança de gradiente possa resultar em alguns efeitos de blocagem perceptíveis na ampliação, ainda que, com imagens bitmap e desenhos de linha, isso possa ser algo bom. Mais sobre as outras ordens do Filtro Lagrange adiante.
O filtro '**Catrom**' (Catmull-Rom) é um Filtro Cúbico padrão bem conhecido, frequentemente usado como função de interpolação, e está disponível com o mesmo nome. Esse filtro produz uma borda razoavelmente nítida, mas sem a pronunciada mudança de gradiente em ampliações de imagem em grande escala que um filtro 'Lagrange' pode produzir. Ele é basicamente equivalente a um 'unsharp resize' embutido (veja Aguçar Imagens Redimensionadas), embora alguns o considerem nítido demais, e não oferece nenhum controle do aguçamento. O que torna um filtro 'Catrom' mais interessante é que ele é quase um equivalente cúbico idêntico a um filtro '[Lanczos](#lanczos)' de 2 lóbulos, que é provavelmente o Filtro Sinc com Janelamento mais comumente usado (veja abaixo). Também veremos esse filtro mais de perto adiante em Filtros Cúbicos.
Interpolação e a Configuração Interpolate do IM
A configuração Interpolate do IM, usada para produzir uma consulta 'por ponto' não escalada de imagens em operadores como o Operador FX DIY ("[-fx](https://imagemagick.org/command-line-options/#fx)") e o Operador de Substituição por Tabela de Cores ("[-clut](https://imagemagick.org/command-line-options/#clut)"), e algumas funções mais antigas de Distorção Circular, baseia-se nesses simples filtros de redimensionamento por interpolação. No entanto, atualmente elas são implementadas usando código separado e também têm nomes de configuração diferentes. Essas Configurações de Interpolação incluem: '[NearestNeighbor](misc.html#nearestneighbor)', que implementa o filtro 'Point' (ou 'Box' não escalado), e '[BiLinear](misc.html#bilinear)' para obter um filtro 'Triangle' não escalado. À PARTE: neste momento, o filtro triangle suavizado 'Hermite' não foi implementado diretamente como uma Configuração de Interpolação, o que é uma pena, pois é um filtro de interpolação bastante bom.
Filtros de Desfoque Gaussian
Na complexa matemática das Transformadas de Fourier para domínios de frequência, os filtros de redimensionamento devem remover qualquer ruído de alta frequência que possa estar presente. Esse ruído é causado pela amostragem de uma imagem do mundo real em pixels e, quando você redimensiona uma imagem, esse ruído aparece como efeitos de serrilhamento e Moiré. Por causa disso, a Curva em Sino Gaussian tornou-se um candidato natural desde cedo como filtro de redimensionamento ou reamostragem, pois é o modelo ideal para efeitos do mundo real.
Gaussian
O filtro Gaussian é um filtro muito especial que gera aquele mesmo formato de 'curva em sino' no domínio da frequência. Isso o torna muito útil como filtro de imagem, pois garante uma boa remoção desse ruído de alta frequência de uma forma altamente controlável. No entanto, se você examinar o gráfico do filtro, verá que, a uma distância de um pixel do ponto de amostragem, você tem um valor diferente de zero. De fato, é um valor bastante alto. Isso resulta em uma enorme quantidade de desfoque dos pixels individuais, mesmo quando nenhum redimensionamento é de fato realizado. Por exemplo, aqui redimensionei o logotipo padrão do IM usando um filtro Gaussian e novamente usando o filtro normal do IM ('Lanczos' neste caso, que veremos mais adiante).
magick logo: -filter Gaussian -resize 150x logo_gaussian.png
magick logo: -resize 150x logo_normal.png
| ![[IM Output]](../static/img/filter/logo_gaussian.png)
Gaussian | ![[IM Output]](../static/img/filter/logo_normal.png)
Redimensionamento Normal
---|---|---
Se olhar de perto, verá que a imagem filtrada com 'Gaussian' à esquerda está mais desfocada do que o redimensionamento normal. Especialmente no que diz respeito ao detalhe das estrelas menores ao redor da varinha e no chapéu do mago. Esse desfoque da imagem é a contrapartida que você obtém por remover todos os efeitos de serrilhamento na redução de imagens, bem como todos os efeitos de blocagem na ampliação de imagens. Ele também nunca produzirá efeitos de ondulação (quando aplicado perfeitamente). Mas tudo isso ao custo de um desfoque extremo na imagem resultante. De fato, durante ampliações em grande escala, esse filtro gerará pontos arredondados em vez de pontos com aparência quadrada. Por exemplo, aqui amplio enormemente uma imagem de 3x3 pixels com um único ponto no centro. |
magick xc:red -bordercolor yellow -border 1 \
-filter Gaussian -resize 99x99 -normalize dot_gaussian.jpg
![[IM Output]](../static/img/filter/dot_gaussian.jpg)
Como você pode ver, um único pixel se amplia em um ponto perfeitamente circular. Apenas o Gaussian e filtros semelhantes ao Gaussian fazem isso.
Controle Avançado do Sigma Gaussian
Você pode controlar o Filtro Gaussian diretamente usando uma opção avançada especial "[-define](https://imagemagick.org/command-line-options/#define) filter:sigma=_{value}_" para especificar o valor real do 'sigma' da curva Gaussian. Por padrão, esse valor é '0.5', que é também o mesmo tamanho do Filtro Box. De muitas maneiras, você pode considerar um Filtro Gaussian essencialmente como uma 'box desfocada'. Essa opção avançada foi adicionada para permitir a criação de Desfoques Gaussian muito pequenos, sem reduzir o alcance do Suporte do Filtro (veja abaixo). No entanto, aumentar o 'sigma' poderia fazer o filtro ficar cortado. Por isso, ao aumentar o valor de 'sigma', o 'suporte' padrão (2.0) também é aumentado em quantidade semelhante. Isso só acontece com aumentos no valor padrão de 'sigma'. A Configuração Avançada de Suporte pode ser usada para sobrescrever esse efeito automático, mas normalmente não é necessário. | _A opção avançada 'filter:sigma' só funciona para o Filtro Gaussian. Nenhum outro filtro é afetado por esse controle avançado.
Um controle mais generalizado, para outros filtros, pode ser obtido usando o Controle Avançado do Blur do Filtro, que veremos mais adiante.
Outros Filtros Semelhantes ao Gaussian
Se você estudar os gráficos comparativos à direita, verá que o filtro 'Quadratic ', bem como o 'Spline ', um pouco mais complexo, seguem a curva de ponderação do filtro 'Gaussian' bastante bem. E, por serem funções polinomiais, também são muito mais rápidos de calcular, e foi por isso que foram originalmente inventados. Enquanto o 'Quadratic' é apenas um pouco mais desfocado do que o Filtro Gaussian, o filtro 'Spline' é ainda mais desfocado, com uma configuração de Sigma equivalente de aproximadamente '0.65'. Isso faz do filtro 'Spline' o filtro mais desfocado fornecido sem modificações. Examinando os gráficos, você verá que, assim como o Filtro Gaussian e ao contrário dos Filtros de Interpolação, eles têm um valor diferente de zero a uma distância de 1.0 do ponto de amostragem. Isso faz com que os pixels próximos mesclem suas cores e é a causa do desfoque que você vê. O filtro 'Spline', tendo o valor mais alto na distância de 1.0, produz a maior quantidade de desfoque em qualquer imagem redimensionada (ou distorcida). Esse desfoque extra remove os últimos resquícios de quaisquer efeitos de 'blocagem' que possam estar presentes em ampliações de grande escala. E poderia ser usado com uma técnica de Aguçar Imagens Redimensionadas para ampliar desenhos de linha com pouquíssimos 'efeitos de escada' nos resultados. O filtro '[Mitchell](#mitchell) ' também é mostrado no gráfico comparativo. Esse filtro também tem algum desfoque na distância de 1.0 do ponto de amostragem, o que também o torna levemente desfocado, muito parecido com os outros filtros que vimos. No entanto, ele também tem alguma ponderação negativa em sua curva, que, embora produza efeitos de ondulação (veja Filtros Sinc com Janelamento mais adiante), compensa esse desfoque perto de bordas nítidas.
Controle Avançado do Suporte do Filtro
O filtro Gaussian é conhecido como um filtro IIR (Resposta ao Impulso Infinita), o que significa simplesmente que a 'curva' de resposta que ele usa nunca chega a zero. Ou seja, não importa o quão longe você fique do ponto de amostragem, você ainda terá alguma contribuição diferente de zero ao resultado, vinda de pixels muito distantes. Em termos matemáticos, isso é de fato algo bom, pois significa que o resultado é muito mais perfeito matematicamente. Na aplicação prática, é muito ruim, pois um filtro infinito exige que você use uma média ponderada de cada pixel da imagem original para gerar cada novo pixel da imagem de destino. Isso significa que imagens grandes levariam muitíssimo tempo para serem redimensionadas perfeitamente usando esse filtro. No entanto, para o filtro 'Gaussian', qualquer coisa além de um alcance de cerca de 2 pixels (4 vezes sua configuração padrão de 'sigma') a partir do ponto de amostragem geralmente produzirá muito pouco efeito no resultado final e, portanto, pode em geral ser ignorada. Mesmo 3 vezes o sigma é geralmente considerado razoável. Esse alcance é conhecido como a 'janela de suporte ' do filtro e é o limite prático do programa para o filtro. Se você realmente quiser, pode alterar o 'suporte' de um filtro usando a configuração avançada especial "[-define](https://imagemagick.org/command-line-options/#define) filter:support=_{value}_". Por exemplo, aqui redimensiono uma imagem com um único pixel usando o valor de suporte menor de 1.25, ou 2,5 vezes o valor do sigma (veja o gráfico resultante à direita). Isso é, claro, menor do que o mínimo geralmente aceito de 3 vezes o valor do sigma. |
magick pattern:gray5 -crop 5x1+0+3 +repage pixel_5.gif
magick pixel_5.gif -filter gaussian -define filter:support=1.25 \
-resize 300x pixel_gaussian.png
![]()
Imagem de Pixel Único | | ![]()
Filtrada com Gaussian
---|---|---
![[IM Profile]](../static/img/filter/plot_gaussian.gif)
Perfil da Imagem
Ao usar a configuração de 'support' menor, o 'degrau' (onde a janela de suporte corta a função) foi deslocado para a posição 1.25. Isso, por sua vez, resulta em uma 'parada' maior no perfil do filtro e resulta em um efeito de 'serrilhamento' que você pode ver na ampliação. Ou seja, a oscilação perto do 'pico' do gráfico, bem como uma 'queda' repentina nas bordas dos limites de 'suporte' do filtro. Você pode pensar no 'suporte' como uma 'janela' deslizante ao longo dos pixels que estão sendo mesclados na média para produzir o resultado da imagem ampliada. Como o tamanho do suporte é 1.25, a área total de suporte do filtro tem 2,5 pixels de largura (não escalada durante as ampliações de imagem), de modo que você pode ter 2 ou 3 pixels envolvidos na fase de redimensionamento horizontal. À medida que essa 'janela' de suporte desliza pela imagem, cada pixel que entra ou sai gerará a 'mudança' repentina na 'curva' do filtro. Ou seja, a causa das leves oscilações nos resultados. Isto é, nesses pontos, um pixel está sendo adicionado ou removido do número total de pixels que estão sendo mesclados na média de acordo com a curva de ponderação do filtro. Isso, por sua vez, produz quatro dessas 'oscilações' ou 'ziguezagues' na imagem redimensionada: um par inicial nas bordas externas, quando o único pixel branco entra/sai do alcance de suporte, e um segundo par de oscilações, quando um segundo pixel preto (formando uma média ponderada de três pixels) entra/sai do alcance de suporte. Se não houvesse uma 'parada' tão repentina no filtro, isto é, se o filtro fosse a zero no limite da configuração de suporte, você não veria as 'oscilações' e não teria o efeito visível. Usar um tamanho de suporte definido como um inteiro ou meio-inteiro (como a configuração padrão de 'suporte' de '2.0' para um filtro 'Gaussian') sempre garantiria que, sempre que um novo pixel entrasse no alcance de suporte, outro pixel estaria saindo, de modo que o mesmo número de pixels sempre fizesse parte dessa média. Isso removeria as duas oscilações 'centrais', mas não removeria as oscilações iniciais nas bordas externas, que marcam os limites do suporte. Mesmo mudanças bruscas de inclinação (descontinuidades) no filtro, como as que você obtém de um filtro Triangle ou Lagrange, podem gerar artefatos visíveis na imagem resultante. | _Antes do IM v6.3.6-3, o 'suporte' do filtro Gaussian era definido com esse valor de '1.25', produzindo efeitos de Ondulação nas ampliações (como o mostrado acima). Por essa razão, o 'suporte' do Gaussian foi alterado para '1.5', para garantir que o mesmo número de pixels sempre fosse mesclado na média e para reduzir o degrau menor.
A partir do IM v6.6.5-0, a configuração padrão de 'suporte' do Gaussian foi aumentada para um valor de '2.0'. Isso tem pouco efeito sobre a velocidade geral do filtro, mas torna a 'parada' praticamente inexistente. Também simplificou a codificação do filtro para outros usos especiais deste filtro, especificamente para distorções EWA e o Mapeamento de Desfoque Variável.
_
---|---
Note, porém, que, se você usar uma configuração de suporte muito grande, é claro que mais pixels precisarão ser mesclados na média, tornando a operação de redimensionamento mais lenta, sem nenhuma melhoria real nos resultados. Apenas os filtros Sinc/Jinc com Janelamento e Lagrange podem, em geral, produzir um resultado melhor usando uma janela de suporte maior que 2.0. Lembre-se de que estas são opções 'avançadas' e, como tal, você tem mais probabilidade de piorar do que de melhorar as coisas ao usá-las. É por isso que elas não são uma simples opção de linha de comando, mas fornecidas por meio da opção especial "[-define](https://imagemagick.org/command-line-options/#define)". É claro que você é bem-vindo para experimentar, assim como fiz acima, a fim de tentar entender melhor as coisas, e o IM fornece essas opções para que você possa fazer exatamente isso.
Controle Avançado do Blur do Filtro
Uma opção avançada especial, "[-define](https://imagemagick.org/command-line-options/#define) filter:blur=_{value}_", pode ser usada para ajustar a quantidade de desfoque que um filtro fornece. Um valor de '1.0' produz a ação padrão, enquanto valores menores e maiores ajustam a 'quantidade de desfoque' geral. Basicamente, isso amplia ou reduz linearmente a curva do filtro ao longo do eixo X (distância do pixel em relação ao ponto de amostragem) e normalmente torna um filtro mais ou menos desfocado no geral. Usar uma configuração menor faz com que a função do filtro (e sua janela de suporte) fiquem menores. Para filtros Gaussian e semelhantes ao Gaussian, o efeito é como se você multiplicasse o valor 'sigma' dos filtros (padrão=0.5) por esse fator de 'blur'. Essa configuração também ampliará ou reduzirá a Janela de Suporte do filtro na mesma proporção, de modo a evitar o corte, mas isso pode ser sobrescrito usando a Configuração Avançada de Suporte do Filtro. Por exemplo, aqui redimensiono uma imagem com três configurações diferentes de 'blur', usando um Filtro Spline Semelhante ao Gaussian..
for blur in 0.5 1.0 1.5; do \
magick logo: -define filter:blur=$blur -filter Spline \
-resize 150x logo_blur_$blur.png; \
done
![[IM Output]](../static/img/filter/logo_blur_0.5.png)
blur 0.5 | | ![[IM Output]](../static/img/filter/logo_blur_1.0.png)
blur 1.0 | | ![[IM Output]](../static/img/filter/logo_blur_1.5.png)
blur 1.5
---|---|---|---|---
Como você pode ver, essa configuração especial permite controlar a quantidade geral de desfoque do resultado para o filtro 'Spline'. Como o tamanho da 'janela de suporte' também é escalado pela configuração Filter Blur, usar valores de escala muito pequenos pode fazer com que a reamostragem 'perca' todos os pixels ou gere apenas pixels com ponderação zero. Como resultado, linhas ou blocos 'pretos' regulares serão gerados. Por exemplo... |
magick rose: -define filter:blur=0.1 -filter Gaussian \
-resize 100x100 rose_black_bars.png
![[IM Output]](../static/img/filter/rose_black_bars.png)
Aumentar o tamanho da janela de suporte (antes de ser escalada pelo blur) pode ajudar a evitar esses efeitos, mas, como a maioria dos filtros só produzirá ponderações zero para pixels que caiam fora de seu alcance de suporte 'natural', isso não funcionará para todos os filtros. Os únicos filtros que costumam gerar valores úteis diferentes de zero em todo o alcance de suporte são o Filtro Box e os Filtros Sinc/Jinc com Janelamento. Efeitos semelhantes podem ser vistos com os Filtros Cilíndricos, quando o suporte do filtro fica pequeno demais para sempre encontrar ao menos um pixel para amostrar. Os Filtros Lagrange usam a Configuração Avançada de Suporte do Filtro para determinar a 'ordem' apropriada que se ajusta à 'janela de suporte' e, assim, transformam-se em várias outras formas (veja abaixo). | _Usar configurações de suporte ruins com filtros que contêm ponderações negativas (basicamente qualquer um dos filtros que veremos a seguir) pode produzir efeitos de aguçamento inverso e de negação, além de efeitos de serrilhamento desproporcionalmente mais fortes. Em casos raros, pode até gerar cores com ponderação infinita (que são fixadas em preto e branco puros nas versões normais não-HDRI do IM).
Cautela e experiência são recomendadas ao usar esta opção especial com qualquer filtro.
---|---
| _Antes do IM v6.3.6-3, o define 'filter:blur' era definido por engano pela opção "-support", que era muito enganosa quanto ao que ela realmente fazia. Essa opção foi descontinuada e não está mais disponível.
---|---
Variante do Filtro Interpolador Gaussian
Um valor de Blur Control de '0.75' em Filtros Semelhantes ao Gaussian, ou o uso de um valor de Sigma Control de '0.375' para o Filtro Gaussian, gerará uma variação que chamo de Interpolador Gaussian. Esse filtro Gaussian aguçado tem propriedades semelhantes às dos Filtros de Interpolação que vimos acima. Mas não contém nenhuma parada brusca ou outras mudanças de gradiente que possam ser perceptíveis em imagens ampliadas. Nesse aspecto, ele é muito parecido com o filtro "[Hermite](#hermite)" (veja o gráfico), mas com uma inclinação não simétrica que de fato parece funcionar melhor como interpolador.
magick logo: -filter Gaussian -resize 150x logo_gaussian.png
magick logo: -define filter:blur=0.75 -filter Gaussian \
-resize 150x logo_gaussian_interpolate.png
![[IM Output]](../static/img/filter/logo_blur_1.5.png)
Gaussian | | ![[IM Output]](../static/img/filter/logo_gaussian_interpolate.png)
Interpolador Gaussian
(blur=0.75 ou sigma=0.375)
---|---|---
De fato, acho que ele faz o filtro Gaussian produzir resultados muito mais aceitáveis, que não são nem nítidos demais nem desfocados demais. No entanto, reduzir o desfoque do filtro realçará os efeitos de serrilhamento, tornando mais provável a geração de efeitos de Moiré em grande escala a partir de padrões de baixo nível de pixel. Essa é a contrapartida de usar uma forma menos desfocada do filtro.
magick rings_crop.png -filter gaussian -resize 100x100 rings_gaussian.png
magick rings_crop.png -filter gaussian -define filter:blur=0.75 \
-resize 100x100 rings_gaussian_interpolate.png
![[IM Output]](../static/img/filter/rings_gaussian.png)
Gaussian | | ![[IM Output]](../static/img/filter/rings_gaussian_interpolate.png)
Interpolador Gaussian
(blur=0.75 ou sigma=0.375)
---|---|---
Filtros Sinc com Janelamento
Filtros Sinc
A matemática determinou que o filtro ideal para redimensionar imagens (usando uma técnica de redimensionamento 'tensor' de 2 passos) é a função Sinc() . (Veja o Teorema de amostragem de Nyquist-Shannon).
Sendo matematicamente perfeita, a Sinc() tem algumas características especiais que gostaria de destacar. Primeiro, a cada distância inteira do ponto de amostragem, a função de ponderação do filtro se torna zero. Isso é muito importante, pois significa que o filtro não desfoca a imagem mais do que o necessário (ao contrário dos Filtros Gaussian). Também significa que, se uma imagem for reamostrada sem redimensionamento (um redimensionamento "no-op"), a imagem permanece completamente inalterada pelo filtro. É, portanto, um filtro interpolativo, embora muito complexo. A função Jinc() está intimamente relacionada à Sinc() e tem propriedades que a tornam útil como filtro para filtragem bidimensional, como a usada pelo Operador de Distorção Geral de Imagens. Mais sobre essa função adiante em Filtros Cilíndricos. Por ora, apenas note que ela também poderia ser usada como função base para Filtros Jinc com Janelamento. A outra grande diferença entre os filtros baseados em Sinc() e Jinc() e os filtros que vimos anteriormente é que muitas das ponderações são negativas. Ou seja, elas subtrairão parte das cores dos pixels próximos da cor final, para cada pixel da imagem. Isso pode parecer um pouco estranho, mas resulta em um forte aguçamento das bordas dos objetos. É claro que quaisquer ponderações negativas geralmente precisam ser compensadas por muito mais ponderações positivas ao longo da curva, o que produz a função em forma de onda que você vê se estendendo por um longo alcance a partir do ponto de amostragem. Esses 'lóbulos' extras de ponderações positivas (e negativas) causam artefatos de ondulação em imagens que contêm fronteiras de cor muito fortes, como em desenhos de linha de alto contraste, ou fronteiras como um telhado vermelho contra um céu azul. Esses efeitos de ondulação podem se tornar ainda mais pronunciados se filtros baseados nessas funções forem aplicados de forma inadequada.
Funções de Janelamento
Infelizmente, essa função também é uma função IIR (Resposta ao Impulso Infinita). Ou seja, ela tem efeitos que se estendem até o infinito, assim como o Filtro Gaussian anteriormente. Isso significa que, para usar a 'Sinc', você precisaria gerar uma média ponderada de cada pixel da imagem (e além) a fim de criar a melhor representação de cada novo pixel da imagem de destino. Isso é proibitivamente caro, tornando impraticável o uso direto desses filtros perfeitos. Não que você fosse querer, por causa dos efeitos de ondulação. Mas, ao contrário do Filtro Gaussian, a função 'Sinc' não apenas cai para perto de zero a uma curta distância do ponto de amostra. De fato, mesmo a 10 pixels de distância do ponto de amostragem (veja o gráfico acima), você pode obter um efeito apreciável no resultado final. No entanto, redimensionar uma imagem usando um filtro com distância de suporte de 10 exigiria uma média de pelo menos 20x20, ou 400 pixels por pixel no resultado final. E isso produziria um redimensionamento muito lento. Como consequência, usar uma forma bruta do filtro "Sinc" não é recomendado e quase nunca é usado, embora, usando os Controles Avançados de Filtro, o IM não impeça você de fazer isso, se for realmente o que deseja. O que é recomendado e fornecido são as formas 'com janelamento' da função Sinc, que foram desenvolvidas por especialistas em processamento de imagens e que podem ser usadas para 'limitar' as funções Sinc (e Jinc) infinitas a um tamanho mais prático. Esses Filtros de Janelamento incluem filtros como: 'Blackman', 'Bohman', 'Hann', 'Hamming', 'Lanczos', 'Kaiser', 'Welch', 'Bartlett' e 'Parzen'.
Como Funcionam os Filtros com Janelamento
Por exemplo, o gráfico à direita mostra três funções (clique para obter uma visão ampliada). A função vermelha é a função Sinc() matematicamente ideal, que se estende até o infinito. A função verde é uma função de janelamento "Hann" (baseada em uma simples curva de Cosseno). Ela é multiplicada pela Sinc() para modular os componentes mais distantes do filtro, chegando a zero (ou perto de zero) na borda da janela de suporte (4.0 unidades de pixel é a distância padrão para este filtro). Basicamente, ao selecionar 'Hann' na seleção "[-filter](https://imagemagick.org/command-line-options/#filter)", você está, na verdade, selecionando a 'Função de Janelamento ' 'Hann() ' para modular a 'função de ponderação ', como a 'Sinc() ' (ou 'Jinc() '). Assim, os 'Filtros com Janelamento ' são, na verdade, duas funções. A função Sinc ou Jinc (dependendo do operador de processamento de imagens) e a 'Função de Janelamento' que você selecionou especificamente como filtro a usar. (Veja Controles Avançados de Filtro abaixo). |
Antes da v6.3.6-3, o IM cometeu o grave erro de de fato usar as funções de janelamento diretamente como a função de ponderação do filtro. Isso, por sua vez, fazia com que todos esses filtros (exceto o Lanczos) produzissem imagens muitoserrilhadas quando usados para redimensionamento. Como consequência, os filtros eram frequentemente mal compreendidos ou raramente usados pelos usuários do IM. Isso já foi corrigido. |
|---|---|
Os Diversos Filtros de Janelamento
À direita está um gráfico de todas as diversas funções de janelamento que o IM tem disponíveis no momento em que este texto foi escrito (mais foram adicionadas depois). Sim, há muitas delas, pois as funções de janelamento têm sido objeto de intenso estudo por numerosos especialistas em processamento de sinais. Todas as funções de filtro com janelamento serão geralmente usadas para modular uma função de ponderação Sinc (ou Jinc) usando um suporte de 3 ou 4 para o Sinc (3 ou 4 lóbulos), dependendo da classe da função de janelamento sendo usada (veja abaixo). Por exemplo, um filtro de janelamento 'Blackman' usará 4 lóbulos, mas o 'Lanzcos' usará 3 lóbulos. Isso depende da sua versão do IM, então verifique a Opção Avançada de Filtro 'verbose' se quiser ter certeza. Como você pode ver, todas as funções de filtro com janelamento produzem uma forma atenuada da função Sinc() original, que também é mostrada. E, além da quantidade de ondulação que um filtro específico gera, muitas vezes há muito pouco para distinguir um filtro com janelamento de outro. Provavelmente um dos melhores filtros com janelamento é o 'Lanczos '. Enquanto outras pessoas juram pelo 'Blackman ', 'Bohman ', 'Hann ' (um sino cossenoidal atenuado), 'Hamming ' (variante do sino cossenoidal), 'Cosine ' (um único lóbulo cossenoidal); como funções de janelamento. Todas essas funções baseiam-se no uso de uma Sinc, ou de funções Seno/Cosseno em sua formulação, o que supostamente garante que a função terá uma boa resposta em frequência. Os outros filtros de janelamento incluem 'Welch ' (parabólico), 'Parzen ' (spline cúbica), 'Kaiser ' (Bessel) e, provavelmente o mais simples, 'Bartlett ' (triangular ou linear). Normalmente, essas funções foram criadas por sua simplicidade e rápido cálculo, embora sejam geralmente consideradas como tendo uma 'resposta em frequência' ruim. Além disso, muitas dessas funções de janelamento são usadas como filtros de reamostragem por conta própria. Por exemplo, o 'Bartlett' (que é provavelmente o verdadeiro caso à parte de todas as funções de janelamento) é, na verdade, a mesma função matemática usada para um filtro 'Triangle', bem como para o filtro de interpolação 'Bilinear'. Todas as funções (exceto o 'Bartlett') formam duas categorias básicas de funções de janelamento.
- Uma curva atenuada em forma de 'sino', como '
Hamming', 'Hann', 'Kaiser', 'Blackman', 'Bohman' e 'Parzen'. - E uma função de janelamento do tipo 'lóbulo' não atenuada, que cai rapidamente a zero antes de ser 'cortada' pelo suporte da janela, como '
Lanczos', 'Welch' e 'Cosine'.
Se você estudar o gráfico da função de janela acima, poderá ver como as formas dos dois estilos de filtro diferem. No entanto, as duas categorias de funções de janelamento não parecem ser tão importantes quanto a 'resposta em frequência' geral que você obtém ao usar uma curva definida trigonometricamente. As funções de janelamento em forma de 'sino' atenuado usarão um Suporte em Lóbulos de mais de 4 lóbulos da função de ponderação Sinc (ou da função Jinc na reamostragem cilíndrica (distort)). O tipo 'lóbulo' não atenuado de filtros com janelamento usará, por padrão, um suporte de 3 lóbulos. Isso resulta em uma equivalência aproximada entre os dois tipos de filtro com janelamento, devido à diferença no decaimento da função de janelamento. Isso também significa que os filtros com janelamento não atenuados serão, por padrão, um pouco mais rápidos do que os atenuados. O número padrão de lóbulos que os filtros devem ter foi discutido na Discussão dos Fóruns do IM, Add Cosine windowing?. É claro que, se quiser, você pode alterar o Suporte em Lóbulos ou até mesmo apenas o suporte geral de qualquer um dos filtros de redimensionamento. Todos são mais ou menos iguais, apenas com variações muito leves na quantidade de efeitos de ondulação e blocagem produzidos.
À direita estão as mesmas funções de janelamento, mas usando o Suporte em Lóbulos padrão definido pelo IM de acordo com a natureza atenuada/não atenuada da função. Como você pode ver, ao longo dos dois primeiros lóbulos (os principais, com mais influência), há muito pouca diferença entre qualquer um dos filtros, e todos mostram um 'decaimento' muito semelhante nesse alcance. No entanto, a ordenação das funções não mudou muito, com os extremos ainda entre 'Welch ' e 'Parzen ', e com o 'Lanczos ' caindo bem no meio dos decaimentos de curva resultantes.
E à direita estão os filtros sinc-com-janelamento resultantes que seriam fornecidos a um usuário que selecionasse essas funções de janelamento usando os padrões acima. Como você pode ver, as curvas de ponderação finais são todas muito semelhantes e, como esperado, todas estão espremidas entre os extremos de 'Welch ' e 'Parzen '. Você pode ver definições e gráficos mais detalhados da maioria dessas várias funções de janelamento, e seus resultados no Espectro de Frequência de Fourier, na Wikipedia, Função de janela.
Em resumo: não encontrei uma grande diferença nos resultados entre essas várias funções de janelamento. Além disso, minha leitura dos artigos de pesquisa dos resultados pareceu ser mais uma opinião qualitativa sobre sua adequação do que algo concreto. Minha sensação é a de que praticamente qualquer função de janelamento pode ser usada, mas, se eu tivesse que escolher uma, é melhor ficar com o filtro de janelamento 'Lanczos', o mais popular. Ele fica no meio de todos os filtros acima, tem boa resposta de espectro de frequência e é, em geral, uma boa escolha como filtro de reamostragem. Por outro lado, um especialista em processamento de imagens, que foi fundamental nos filtros de Reamostragem do ImageMagick, discorda disso. Embora ele selecione filtros mais com base nos requisitos exatos de imagens específicas. Você pode ver suas sugestões e comentários em Técnicas Recomendadas por Nicolas Robidoux.
Filtro Lanczos
Já mencionamos o filtro 'Lanczos ' algumas vezes. Ele é provavelmente o mais conhecido dos Filtros com Janelamento, e fica no meio da faixa dos filtros com janelamento que vimos. Essencialmente, ele não 'decai' rápido nem devagar demais, e tem uma boa resposta em frequência na transformada de Fourier resultante. Basicamente, o 'Lanczos ' é um ótimo ponto de partida para qualquer tipo de trabalho com filtros, e tem sido usado extensivamente no recente desenvolvimento dos Filtros Cilíndricos Jinc com Janelamento (veja abaixo). O filtro 'Lanczos ' basicamente usa o primeiro 'lóbulo' da função Sinc() para janelar a função Sinc() . Ou seja, a função de ponderação do filtro é usada para definir a própria função de janelamento do filtro. Muitas pessoas veem isso como um bom motivo para escolhê-lo em vez dos muitos outros Filtros Sinc com Janelamento. Embora haja pouca ou nenhuma evidência real de que ele seja o melhor, é um filtro sólido da faixa intermediária. Por padrão, o IM define o filtro 'Lanczos' como tendo 3 'lóbulos'. A razão para isso é que a própria função de janelamento é 'não atenuada', ou seja, é apenas um único lóbulo que se corta, com o primeiro cruzamento de zero da função coincidindo com os limites de suporte da janela. Veja Como Funcionam os Filtros com Janelamento acima.
No entanto, um filtro 'Lanczos2 ' de 2 lóbulos (Lanczos com um padrão de 2 lóbulos, adicionado para facilitar a seleção pelo usuário) também se mostrou popular, pois evitará os Artefatos de Ondulação positivos que podem ser gerados pelos filtros Sinc-com-Janelamento. O 'Catrom' (na verdade o 'Filtro Catmull-Rom') é quase uma duplicata exata do filtro 'Lanczos2', embora, por ser um Filtro Cúbico, seja muito mais rápido de gerar matematicamente. Isso, porém, normalmente não é um problema, dado o modo como o IM armazena em cache os valores do filtro antes de processar as imagens. Dito isso, uma longa Discussão nos fóruns do IM parece indicar que, para o redimensionamento ortogonal (tensor), um 'Lanczos' de 4 lóbulos de fato funciona melhor para reduzir imagens, prevenindo o Moiré em imagens de objetos com padrões muito finos, mas ao custo de mais Ondulação.
Tamanho do Janelamento em Lóbulos
Como mencionei, a função de filtro Sinc (e Jinc) subjacente é, na verdade, de tamanho infinito. Embora, por padrão, o IM as limite usando a função de janelamento especificada a um tamanho muito menor e mais prático. No entanto, pode haver algumas situações em que você realmente queira tentar obter um redimensionamento muito melhor e mais exato da imagem usando uma janela (suporte) muito maior e mais lenta. Isso pode até ser feito de forma bastante simples usando o controle avançado de Suporte do Filtro, assim como fizemos para os filtros Semelhantes ao Gaussian. A própria função de janelamento reduzirá (na maioria dos casos) a Sinc (e a Jinc) a zero ao longo do alcance da configuração de suporte. Mas, como a função de janelamento é escalada para se ajustar à janela de 'suporte', a função de filtro resultante também mudará.
Por exemplo, à direita tracei o gráfico dos filtros 'Lanczos' com janelamento, comparados à função Sinc() como referência, usando várias configurações de 'suporte' de 2 a 8. Note que o tamanho real do filtro é limitado pelo tamanho de suporte de fato usado. Quanto menor o 'suporte', mais rápido o filtro, mas menos exatamente a função segue a função Sinc() matematicamente ideal. Observe de perto cada uma das curvas do gráfico. A curva 'verde' (support=2) tem apenas o pico central principal, mais um 'lóbulo' negativo (equivalente a um filtro 'Lanczos2'). Depois disso, a função é apenas zero e não é usada. A próxima curva, 'roxa' (support=3, e o filtro 'Lanczos' padrão), tem um primeiro 'lóbulo' negativo muito maior, depois um 'lóbulo' positivo menor. Isso continua com mais lóbulos sendo adicionados, à medida que o tamanho do suporte aumenta em incrementos inteiros. Os lóbulos adicionais são cada vez menores em altura, produzindo cada vez menos influência no resultado final, mas com os 'lóbulos' iniciais se tornando mais altos (mais influência e, portanto, mais efeitos de Ondulação). Para melhor efeito, você usaria uma configuração de suporte que gere um filtro com esse número de 'lóbulos' para cima/para baixo. Ou seja, você faria a função de janelamento, e portanto o 'suporte' do filtro, terminar em um 'cruzamento de zero'. No entanto, embora a função Sinc() tenha 'lóbulos' (cruzamentos de zero) em configurações de 'suporte' inteiras, a função de ponderação Jinc() não tem. Isso apresenta um problema para os usuários que querem ajustar a janela de suporte de um filtro usado com o Operador Distort. De fato, a Jinc() tem 'cruzamentos de zero' em posições numeradas de forma altamente irracional. Esses cruzamentos de zero são muito difíceis de calcular sem ser um especialista em matemática. Para facilitar a definição de um filtro em termos do número de 'lóbulos', outra configuração especial foi criada, "[-define](https://imagemagick.org/command-line-options/#define) filter:lobes=_{integer}_". Se o filtro estiver sendo usado por um operador de reamostragem de imagem bidimensional, como o Operador de Distorção Geral, que geralmente usa a Jinc() como função base, ele consultará uma tabela dos primeiros 20 cruzamentos de zero do filtro e definirá a configuração de 'suporte' com esse valor. Isso significa que você não precisa tentar encontrar a configuração de suporte apropriada para a função Jinc() , basta especificar o número de lóbulos que deseja usar. Por causa disso, é melhor especificar os filtros Sinc ou Jinc com janelamento em termos do número de 'lóbulos' que você quer que o filtro contenha, em vez de especificar uma configuração de 'suporte' mais direta. Se nem a função Sinc() nem a Jinc() forem usadas para a definição do filtro, então a configuração 'filter:lobes' é usada para calcular a configuração de 'suporte' apropriada para o uso do filtro. Note, porém, que uma configuração 'filter:support' sobrescreverá qualquer configuração 'filter:lobes' dada, então é melhor definir apenas a opção avançada 'filter:lobes', especialmente se estiver usando o Operador de Distorção Geral.
Filtro Lagrange
Assim como o filtro '[Gaussian](#gaussian)' é uma função matematicamente lenta (não que isso afete muito a velocidade geral, graças ao cache de resultados do IM), os Filtros Sinc/Jinc com Janelamento são ainda mais lentos e complexos de calcular, devido à necessidade de calcular funções trigonométricas para uso tanto nas funções de ponderação quanto nas de janelamento. O filtro 'Lagrange ', no entanto, gera uma função polinomial cúbica por partes para aproximar um filtro com janelamento. (Veja Wikipedia: Polinômio de Lagrange). Assim como os Filtros com Janelamento são ajustáveis de acordo com a Configuração de Suporte, o filtro 'Lagrange' também se ajustará de acordo com essa configuração. A configuração de suporte padrão de 2.0 gera um filtro 'Lagrange' (ordem 3). Esse filtro é bastante bom tanto para ampliação quanto para redução de imagens, com efeitos mínimos de blocagem e ondulação e sem efeitos de desfoque. | _OControle Avançado de Suporte na verdade define a 'ordem' do filtro Lagrange que deve ser usado. Ou seja, o filtro Lagrange padrão de suporte 2.0 gera um filtro Lagrange de ordem 3 (ordem = suporte × 2 - 1, portanto support=2.0 => filtro Lagrange-3). É por isso que você só pode realmente usar uma configuração em tamanhos de meio-inteiro.
Assim, para obter um filtro Lagrange de ordem 4, você usaria a opção_ -define filter:support=2.5
---|---
Com configurações de suporte maiores, o filtro 'Lagrange' gera Filtros Sinc com Janelamento sem precisar de um cálculo complexo de função trigonométrica, nem mesmo de funções de janelamento adicionais. Quanto maior a configuração de suporte, mais o filtro emula uma função Sinc() , mas também mais lento fica o cálculo. (veja o gráfico de filtros Lagrange de suporte maior à esquerda).
Usando configurações de suporte menores, o filtro 'Lagrange' emula a maioria dos vários Filtros Interpolados. Ou seja, um tamanho de suporte de '0.5' gerará o filtro 'Box', e '1.0' um filtro 'Triangle'. A configuração de suporte é limitada a ajustes por meios-inteiros, e usar qualquer outro fator de suporte não é muito produtivo.
Os outros filtros Lagrange de suporte meio-inteiro (gerando ordens pares) produzem um conjunto muito desconexo de ponderações de filtro e, assim como o filtro 'Box', podem produzir alguns fortes artefatos de blocagem no redimensionamento. Por outro lado, para redimensionamento em pequena escala, isso pode garantir que as imagens permaneçam nítidas em ajustes de redimensionamento muito pequenos. Esses filtros 'Lagrange' de ordem 'par' na verdade destacam a principal desvantagem de usar este filtro, que é o fato de a função de ponderação não ser um gradiente 'suave'. Em ampliações de grande escala, isso significa que você pode obter mudanças visíveis no gradiente gerado. Isso raramente é um problema, contudo, exceto naqueles casos extremos. Basicamente, ele representa um filtro que universalmente cria algo apropriado para a configuração de 'suporte' atual, independentemente de quão grande ou pequena seja essa configuração. É um filtro de redimensionamento auto-janelante. | O filtro '[Lagrange](#lagrange)' não foi totalmente definido e utilizável até a versão v6.3.7-1 do IM.
---|---
Filtros Cúbicos
À medida que muitos especialistas em imagem tentavam encontrar um filtro melhor e mais rápido de calcular para o redimensionamento de imagens, uma família de filtros evoluiu e ficou conhecida como Filtros Cúbicos. Eles são muito parecidos com os Filtros Lagrange mostrados anteriormente, e eram compostos por um conjunto fixo menor de seções por partes. No entanto, ao contrário dos filtros Lagrange, as partes foram projetadas para se encaixar formando uma curva suave, a fim de reduzir os fortes efeitos de blocagem.
Mostrados no gráfico à esquerda estão quatro desses filtros cúbicos 'suaves' que são pré-definidos no IM e bem conhecidos para uso como filtros de redimensionamento. O filtro 'Spline ' (também usado como alias e configuração padrão para a função de filtro 'Cubic' geral) emula um Filtro de Desfoque Gaussian. Essa curva também é conhecida como uma curva de interpolação 'B-Spline' e é comumente usada para desenhar linhas suaves através de um conjunto de pontos. Também é frequentemente usada para movimentos de câmera e de objetos em animações, para produzir um fluxo suave pelos pontos de controle fornecidos pelo usuário. Também é mostrado o 'Catrom ', ou, mais corretamente, o 'Filtro Catmull-Rom' ou a 'Convolução Cúbica de Keys', que gera uma forma suave e não desfocante de Filtro de Interpolação. No entanto, ele pode ultrapassar levemente (overshoot). É essencialmente um filtro auto-aguçado ideal e, como tal, também é a função comumente usada para a Interpolação Bicúbica básica. E, por fim, o filtro Cúbico 'Hermite ', que é um tipo de Filtro de Interpolação triangular suavizado, que desacelerará (decairá) suavemente nas coordenadas de entrada. Basicamente, ele arredonda bordas fortes preservando os 'níveis de cor' planos na imagem original.
Famílias de Filtros Cúbicos
Os acima são os filtros 'nomeados' mais comuns das Curvas Cúbicas, mas eles também pertencem a famílias específicas de Filtros Cúbicos. A família 'B-Spline' de cúbicos é essencialmente equivalente a vários graus de desfoque dos resultados. Normalmente variando do muito desfocado filtro 'Spline', aos resultados de arredondamento de bordas, mas com blocagem, do filtro 'Hermite'. Depois havia a família 'Cardinal', que produz filtros que fazem um meio-termo entre artefatos de blocagem e ondulação, e da qual o 'Filtro Catmull-Rom' ('Catrom') evoluiu como um compromisso equilibrado desses artefatos. Essas duas famílias então se fundiram para formar a 'Família de Filtros Cúbicos de Keys', que ligou o 'Filtro Catmull-Rom' (Keys α = 0.5) ao 'Filtro Cúbico B-Spline' (Keys α = 0.0). A família de filtros de Keys também tem a propriedade especial de preservar qualquer gradiente linear (afim) que possa existir ao longo da imagem. Os efeitos de ondulação e desfoque de um filtro da família de Keys só entrariam em ação quando uma imagem contém fortes mudanças de cor, em vez de gradientes suaves de cor. Confuso com a variedade? É claro que está. Todos os outros também estavam! O problema é que os resultados dos filtros costumam ser muito subjetivos, dependentes da imagem e das restrições da 'família' que você está usando. O que fazia um bom filtro dependia realmente de quem você perguntava, se você estava ampliando ou reduzindo, e de qual imagem você estava processando. De certa forma, ainda é confuso. Levei mais de dois anos me atrapalhando, lendo e brincando com os vários filtros para chegar ao início deste resumo, e mesmo agora ele ainda está evoluindo. O redimensionamento de imagens é uma área muito subjetiva, difícil (na verdade, comprovadamente impossível) de quantificar de qualquer forma real. Não existe um redimensionamento 'perfeito'.
Filtro Mitchell-Netravali
Nesse contexto, Don P. Mitchell e Arun N. Netravali apresentaram um artigo, 'Reconstruction Filters in Computer Graphics', que formulou duas variáveis conhecidas como 'B' (como usada para curvas 'B-spline') e 'C' (como usada para as curvas 'Cardinal' e equivalente ao valor α do filtro 'Keys'). Com esses dois valores, você pode gerar qualquer filtro cúbico por partes de encaixe suave (primeira derivada contínua).
Mais importante, eles então pesquisaram um grupo de 9 especialistas em processamento de imagens, em vez de apenas confiar na própria opinião, para classificar os Artefatos produzidos ao ampliar levemente imagens usando vários valores de B e C. Os resultados dessa pesquisa são mostrados no diagrama recriado à direita. A área 'verde' representava valores que os especialistas consideraram como produtores de um resultado aceitável, enquanto as várias outras áreas produzem os diversos tipos de Artefatos. Esta imagem é importante, pois realmente mostra as relações entre os vários Artefatos e os diferentes tipos de filtros que podem ser produzidos. Você também pode ver, a partir dos resultados, por que a família de filtros 'Keys' se tornou tão importante, como um dos melhores métodos de gerar bons filtros cúbicos. Seus filtros basicamente caíram em uma linha que atravessa diretamente a área considerada 'aceitável' pelos especialistas em processamento de imagens. A partir dessa pesquisa, Mitchell e Netravali determinaram que o melhor filtro era um filtro da família 'Keys', que caía no meio da área aceitável, usando valores B,C de 1/3,1/3. Esse filtro é agora conhecido como o 'Filtro Mitchell-Netravali' e está disponível no IM como a configuração de filtro 'Mitchell '. Basicamente, é um compromisso de todos os artefatos de redimensionamento. É também o filtro padrão usado para ampliações de imagem no IM. Todos os filtros Cúbicos 'nomeados' embutidos: 'Mitchell', 'Robidoux', 'Catrom', 'Spline' e 'Hermite'; também foram marcados no diagrama acima, mostrando o que aqueles especialistas pensariam desses filtros específicos. Também são mostradas as linhas que representam as famílias de filtros 'B-Spline', 'Cardinal' e 'Keys'. Internamente, todos esses filtros diferem apenas pelas configurações B,C pré-definidas do filtro; de fato, o IM usa a mesma função interna para gerar todos os filtros cúbicos, apenas com diferentes configurações B,C para definir esses filtros.
Controles Avançados B,C Cúbicos
Você pode usar as configurações avançadas especiais para definir as configurações B,C que um Filtro Cúbico está usando. Para fazer isso, você precisa selecionar a 'função' de filtro 'Cubic' geral (ou qualquer um dos outros filtros cúbicos nomeados) e as configurações avançadas 'b' e 'c' desejadas. Por exemplo...
-filter Cubic
-define filter:b=_value_
-define filter:c=_value_
As configurações avançadas sobrescreverão os padrões internos do filtro dado quando ele for usado por um operador de redimensionamento ou distorção. Assim, a ordem das opções acima não importa, desde que você tenha usado "[-define](https://imagemagick.org/command-line-options/#define)" ou "[-set](https://imagemagick.org/command-line-options/#set)" em todas as configurações avançadas globais desejadas antes de o operador de processamento de imagens ser usado. Se uma das configurações 'b' ou 'c' não tiver sido definida, seu valor será calculado a partir do outro valor, sob a suposição de que você quer um filtro da família 'Keys' (ao longo da linha pontilhada no diagrama da Pesquisa Mitchell-Netravali). Lembre-se de que o 'c' é equivalente à configuração α de Keys, enquanto o 'b' pode ser pensado como uma configuração de 'blur' da spline cúbica. Essas configurações avançadas fornecem uma boa maneira para os usuários 'ajustarem' o redimensionamento de suas imagens para obter exatamente o que querem (quer estejam usando Resize ou Distort). A configuração 'b' é a mais fácil das duas de entender. Basta pensar em 'b' como 'blurriness' (desfoque). Um valor de b=0 é o muito nítido (filtro Catmull-Rom), que tende a produzir um halo negativo de Ondulação e alguns efeitos de Serrilhamento ou Moiré. Um valor de b=1 tende a produzir um efeito excessivamente desfocado (o Spline ou semelhante ao Gaussian). Isso facilita para os especialistas (ou até para usuários comuns) ajustarem esse valor para encontrar um filtro que seja 'bom para eles'. À direita está uma tabela dos valores B,C para os Filtros Cúbicos especificamente 'nomeados'. Lembre-se de que o 'Hermite' é o único filtro cúbico embutido que não faz parte da família de filtros 'Keys'. Ele também tem o menor suporte ('1.0') de todos os filtros Cúbicos BC e não contém um lóbulo negativo. Os filtros '[Robidoux](#robidoux)' e '[RobidouxSharp](#robidoux_sharp)' são muito semelhantes ao 'Mitchell', mas, em vez de serem o resultado de uma pesquisa, foram determinados matematicamente para uso especial como Filtro Cilíndrico. O filtro '[Robidoux](#robidoux)' é o filtro padrão usado pelo Operador de Distorção Geral (veja abaixo). | | | Filtro | B
blur | C
Keys α
---|---|---
Hermite | 0.0 | 0.0
Spline | 1.0 | 0.0
Catrom | 0.0 | 1/2
Mitchell | 1/3 | 1/3
Robidoux | 0.3782 | 0.3109
Robidoux
Sharp | 0.2620 | 0.3690
Robidoux
Soft | 0.6796 | 0.1602
| O filtro de janelamento 'Parzen' usa um filtro 'Spline' como sua função de janelamento. Assim, você pode redefinir esse filtro de janelamento em termos das opções avançadas B,C. Quão útil isso é, e que efeito tem sobre a Sinc (ou Jinc) com janelamento resultante, é desconhecido e não recomendado.
---|---
Filtros Cilíndricos - para o Distort
Como já abordamos algumas vezes, o Operador Distort usa a configuração de filtro para reamostrar imagens de uma maneira ligeiramente diferente do Operador Resize. Especificamente, o Distort aplica o filtro usando a distância 'radial' entre o 'ponto de amostra' e os pixels reais dentro da área de amostragem da imagem de origem, para determinar as ponderações de cada pixel e, assim, a cor final no ponto de amostra. O Resize, em contraste, processa a imagem duas vezes usando filtros alinhados ortogonalmente. Uma vez na direção X e depois novamente na direção Y, ele fica, portanto, limitado ao redimensionamento retangular simples de imagens e não envolve o uso de Pixels Virtuais. Ou seja, o Distort aplica os filtros para produzir formas 'Cilíndricas ' em vez de formas 'Box', de modo a permitir distorções de forma livre das imagens, incluindo rotações e escala variável (esticamento e compressão) em qualquer direção, não apenas ao longo do eixo X ou Y. Por causa disso, os próprios filtros muitas vezes precisam ser ajustados ou são projetados especificamente para esse tipo de uso.
Filtros Cilíndricos Interpolados
Aqui uso um filtro '[Box](#box)' para ampliar uma imagem de pixel único em 30 vezes usando os operadores Resize e Distort equivalentes.
magick xc: -bordercolor black -border 1 \
-filter Box -resize 3000% dot_resize_box_black.png
magick xc: -bordercolor black -border 1 \
-filter Box +distort SRT 30,0 dot_distort_box_black.png
Como você pode ver, quando o filtro '[Box](#box)' é usado como filtro cilíndrico, você obtém um círculo (ou um cilindro em 3 dimensões). No entanto, por causa da forma como o filtro é tratado, você obtém algumas áreas onde dois pixels são amostrados (igualmente) para produzir um cinza de meio-tom perfeito. Você pode pensar em um filtro box cilíndrico como convertendo a imagem de origem em todo um conjunto de pixels circulares sobrepostos que são misturados (não somados) entre si. Aqui está um exemplo mais colorido dos resultados de expandir uma imagem usando um filtro 'Box Cilíndrico' para ampliação... |
magick \( xc:red xc:white xc:black +append \) \
\( xc:blue xc:lime xc:white +append \) \
\( xc:black xc:red xc:blue +append \) -append \
-filter Box +distort SRT 30,0 color_box_distort.gif
![[IM Output]](../static/img/filter/color_box_distort.gif)
Com uma imagem distorcida, esses pixels circulares também são distorcidos em um conjunto de elipses sobrepostas. Por exemplo... |
magick \( xc:red xc:white xc:black +append \) \
\( xc:blue xc:lime xc:white +append \) \
\( xc:black xc:red xc:blue +append \) -append \
-alpha set -virtual-pixel transparent -filter Box \
+distort Perspective '0,0 0,0 0,3 0,90 3,0 90,30 3,3 90,60' \
color_box_distort.png
![[IM Output]](../static/img/filter/color_box_distort.png)
| _O 'raio' de suporte para um filtro 'Box' cilíndrico é aumentado de '0.5' para '0.707' (sqrt(2)/2). Isso garante que o filtro sempre encontrará ao menos um pixel de origem na área de amostra circular (diagonalmente). Este é o tamanho de suporte prático mínimo para quaisquer filtros cilíndricos.
Nenhum outro filtro tem esse problema de cobertura, exigindo um aumento no suporte._
---|---
| _Se o suporte não for de pelo menos '0.707', então você pode obter áreas da sua imagem nas quais o filtro 'perde' todos os pixels de origem e, assim, produzir uma Falha de Reamostragem.
Usar uma configuração de suporte maior também produz padrões interessantes. À medida que os 'círculos' ficam maiores, mais pixels serão misturados. Por exemplo..._ | |
magick \( xc:red xc:white xc:black +append \) \
\( xc:blue xc:lime xc:white +append \) \
\( xc:black xc:red xc:blue +append \) -append \
-filter Box -define filter:support=0.83 \
+distort SRT 30,0 color_box_distort_overlap.png
![[IM Output]](../static/img/filter/color_box_distort_overlap.png)
_O resultado é uma espécie de forma circular de umaInterpolação Blend.
Com um suporte de 1.0 ou maior, cada reamostragem será uma mistura 'box' ou 'média' de pelo menos dois pixels.
_
Aqui está uma comparação de vários filtros de interpolação. Cores em cinza são usadas para que você possa ver os over e undershoots. A linha superior usa um redimensionamento ortogonal, enquanto a linha inferior usa uma distorção cilíndrica.
for filter in box triangle hermite lagrange catrom
do
magick xc:gray80 -bordercolor gray20 -border 2 \
-filter $filter -resize 2000% dot_resize_$filter.png
magick xc:gray80 -bordercolor gray20 -border 2 \
-filter $filter +distort SRT 20,0 dot_distort_$filter.png
done
![[IM Output]](../static/img/filter/dot_resize_box.png)
![[IM Output]](../static/img/filter/dot_distort_box.png)
Box | ![[IM Output]](../static/img/filter/dot_resize_triangle.png)
![[IM Output]](../static/img/filter/dot_distort_triangle.png)
Triangle | ![[IM Output]](../static/img/filter/dot_resize_hermite.png)
![[IM Output]](../static/img/filter/dot_distort_hermite.png)
Hermite | ![[IM Output]](../static/img/filter/dot_resize_lagrange.png)
![[IM Output]](../static/img/filter/dot_distort_lagrange.png)
Lagrange | ![[IM Output]](../static/img/filter/dot_resize_catrom.png)
![[IM Output]](../static/img/filter/dot_distort_catrom.png)
Catrom
---|---|---|---|---
Você pode ver como os resultados são semelhantes, mas com diferentes estilos de Artefatos sendo gerados, tanto internamente quanto externamente (ondulação), pelas duas formas diferentes com que o filtro é aplicado. Os artefatos internos são especialmente evidentes no filtro 'Triangle'. No entanto, lembre-se de que os filtros de interpolação não são particularmente bons para a redução extrema (encolhimento) de imagens distorcidas, mas são muito bons para a ampliação.
Gaussian Cilíndrico
O único filtro que não produz diferença nos resultados entre as formas 'resize' ortogonal e 'distort' cilíndrica é o filtro especial '[Gaussian](#gaussian)'... |
magick xc:red -bordercolor yellow -border 1 \
-filter Gaussian +distort SRT 33,0 -normalize dot_distort.jpg
![[IM Output]](../static/img/filter/dot_distort.jpg)
Esta é, na verdade, uma das propriedades especiais deste filtro (conhecida como separabilidade) e uma das razões pelas quais muitas implementações de reamostragem cilíndrica o usam como filtro padrão. Ele foi o padrão no artigo EWA original, mas também é muito desfocado em seus resultados. O ImageMagick também o usava quando as distorções foram implementadas pela primeira vez, mas não mais. Assim como acontece com o resize ortogonal, um filtro 'Gaussian' não produzirá absolutamente nenhum Artefato de Serrilhamento na imagem resultante, mesmo quando aplicado à imagem especial de 'anéis'. Mas o custo disso é um resultado desfocado, mesmo que pouca ou nenhuma distorção esteja de fato envolvida. Da mesma forma, como visto na discussão sobre o Controle Avançado do Sigma, você também pode usar este filtro como um tipo de filtro interpolado. | _A partir do IM v6.6.5-0, o IM não usa mais este filtro, por padrão, para Distorções de Imagem. Em vez disso, é usado outro filtro, o '[Robidoux](#robidoux)', especificamente projetado para produzir um resultado mais nítido.
De qualquer forma, antes desta versão, as distorções também eram muito desfocadas devido a um erro em sua implementação. Atualize se você tiver uma versão mais antiga e quiser usar Distorções de Imagem.
_
---|---
| _Antes do IM v6.6.7-6, o IM usava um valor de 'sigma' ligeiramente maior para um Gaussian Cilíndrico, de 1/sqrt(2) ou aproximadamente 0.707, em vez de 1/2. Isso resultava em um resultado um pouco mais desfocado, o que servia para reduzir possíveisArtefatos de Serrilhamento.
Isso foi um erro, criado por seguir a recomendação de um artigo de pesquisa, ao passar o suporte maior de um Filtro Box Cilíndrico para o Filtro Gaussian. O raciocínio apresentado era que o Gaussian é essencialmente uma box desfocada. Não é. Um Gaussian é um impulso desfocado, não uma box desfocada. Esta versão removeu esse erro, o que agora significa que você deve obter resultados equivalentes tanto com resize quanto com distort, quando o filtro gaussian é usado.
Pessoalmente, acho que usar esse valor de sigma ligeiramente maior de fato suaviza quaisquer artefatos de 'blocagem' ao longo de bordas diagonais serrilhadas ao fazer ampliações de desenhos de linha. Mas esse é um caso especial.
Filtros Cilíndricos Jinc com Janelamento
A função Jinc() (às vezes chamada imprecisamente de filtro 'Bessel') é o equivalente da 'Sinc' para uso com uma operação de filtragem cilíndrica. Embora muito semelhante e intimamente relacionada à Sinc() , ela é projetada para filtrar um arranjo retangular de valores usando uma distância radial ou cilíndrica, em vez de apenas nas direções ortogonais (alinhadas aos eixos). Se você olhar o gráfico fornecido da função Jinc() , verá que seu primeiro 'cruzamento de zero', representando o primeiro anel de vizinhos próximos, cai entre os valores de 1.0 (para vizinhos ortogonais) e a raiz quadrada de 2. Ou seja, o cruzamento de zero tem um valor aproximado de '1.2196699'. A forma como a função Jinc() funciona é que, se o ponto de amostragem for igual a um valor de pixel real, a função Jinc() atribuirá um valor positivo aos pixels vizinhos ortogonais ligeiramente mais próximos, mas depois atribuirá um valor negativo semelhante aos vizinhos diagonais ligeiramente mais distantes, e assim por diante à medida que avança pelo arranjo bidimensional de valores. Como resultado, quando nenhuma escala (distorção) é realizada, as contribuições dos vizinhos deveriam, em teoria, cancelar-se mutuamente. É por isso que o filtro Jinc é matematicamente a solução preferida para a reamostragem cilíndrica de um arranjo quadrado e, portanto, o filtro 'ideal' para o método de reamostragem elíptica (EWA) do Distort. Isso não quer dizer que ele seja um filtro 'perfeito' do ponto de vista humano. Por causa disso, selecionar qualquer Filtro com Janelamento ao usar o Operador Distort substituirá a função normal 'Sinc() ' pela função equivalente 'Jinc() '. Como os cruzamentos de zero da função Jinc() estão em posições não inteiras, é muito importante especificar o suporte dos filtros em termos da Configuração Especial de Suporte em Lóbulos apresentada acima para os Filtros Sinc com Janelamento. O maior problema de usar um filtro 'Jinc com Janelamento' é quando a imagem de origem contém um padrão de hachura em nível de pixel (como o fornecido por "pattern:gray50", veja Padrões Embutidos). Nessa situação, todos os vizinhos ortogonais são diferentes dos vizinhos diagonais e, como resultado, a imagem fica fortemente desfocada pela função 'Jinc() '. No entanto, praticamente qualquer outro padrão, como linhas, bordas e cantos, permanece bastante nítido e claro ao usar um filtro 'Jinc com Janelamento', tornando-o ainda uma boa função a usar. Esse 'problema' pode ser algo bom, pois significa que um filtro cilíndrico bidimensional derivado da Jinc pode ser usado como método para remover fortes padrões de hachura de pixel das imagens, como os gerados por um Dither de Redução de Cores, sem afetar muito a nitidez do resto da imagem. Ou seja, ele poderia ser usado como um 'Método de Remoção de Dither' (veja abaixo).
Distort e Filtros no caso No-Op
Idealmente, uma distorção no-op deveria retornar exatamente a mesma imagem. Mas, como você viu em exemplos anteriores, isso pode não acontecer de fato. Os filtros de redimensionamento (de 1 dimensão em 2 passos): Lanczos (Sinc-Sinc), Lanczos2, Catrom, Hermite, Triangle e muitos outros filtros de redimensionamento têm essa propriedade. O padrão de pixels é preservado exatamente se a imagem não for escalada. Por outro lado, filtros de suavização ou desfoque, como Gaussian, Cubic e Quadratic, desfocarão uma imagem se aplicados a um caso quase no-op. Note que até mesmo o filtro de redimensionamento padrão, Mitchell-Netravali, também contém algum desfoque, pois é basicamente uma mistura do filtro de suavização 'Cubic' B-spline e do filtro Catmull-Rom, o equivalente sinc cúbico de dois lóbulos. | _O operador resize, por padrão, se auto-curto-circuitará, de modo a não fazer nada no caso no-op. Assim, a menos que você especifique explicitamente um filtro, não é possível gerar um resize 'noop'.
O Distort nunca se curto-circuitará no caso no-op, e isso serve para garantir a consistência em animações nas quais a escala da distorção pode passar pelo caso 'no-op'. Isso é algo que normalmente não é uma preocupação com o resize.
_
---|---
Embora muitos filtros de redimensionamento preservem as imagens no caso no-op, os métodos cilíndricos (distort) basicamente nunca produzirão uma distorção no-op perfeita. Qualquer distort no-op distorcerá, no mínimo, minimamente as cores de uma imagem, ainda que a própria imagem não seja distorcida. O que acontece é que, ao usar um filtro cilíndrico, a contribuição dos pixels da vizinhança ortogonal será diferente da dos pixels da vizinhança diagonal. Eles estão, essencialmente, a distâncias diferentes do ponto de consulta (centrado em um pixel real no caso no-op). A função 'Jinc' tenta reduzir essa distorção de cor cancelando as contribuições dos vizinhos ortogonais com as dos vizinhos diagonais. Isso é, na verdade, parte de sua definição matemática. No pior caso, uma 'hachura em nível de pixel', cada pixel vizinho diagonal é diferente de cada pixel vizinho ortogonal. Nesse caso, as ponderações do filtro realçarão em vez de cancelar as contribuições. Como resultado, esse tipo de imagem tenderá a produzir distorções de cor muito severas para uma distorção no-op de qualquer imagem contendo uma 'hachura em nível de pixel'. Aqui, por exemplo, uso de fato essa propriedade especial para remover um padrão de hachura de uma imagem. Nenhuma escala é usada, apenas uma 'convolução' bidimensional aplicada por distorção sobre a imagem.
magick -size 100x100 pattern:gray50 hash.png
magick hash.png -filter Lanczos -distort resize 100% hash_removed.png
| _A razão pela qual o nível de cinza percebido da hachura é muito mais escuro do que o nível de cinza geral da hachura é por causa de como funciona aPercepção Humana de Cores.
A correção é incluir '-set colorspace RGB' no exemplo acima, para dizer ao IM que estamos redimensionando no espaço de cor RGB linear. Veja Redimensionamento com Correção de Espaço de Cor.
_
---|---
O acima é, na verdade, equivalente a uma Convolução com uma função de núcleo semelhante à Jinc. Mas, como você pode ver, a propriedade especial da Função Jinc (neste caso EWA Lanczos, ou Jinc com janelamento Jinc) removeu completamente o padrão de hachura que estava fortemente presente na imagem original. A única parte onde ele agora permanece é ao longo das bordas, onde o 'abismo' (sem contribuição de pixels virtuais) que cerca a imagem propriamente dita pode afetar os resultados. O número real de lóbulos de um filtro Jinc com Janelamento também tem uma enorme influência nos resultados. Com 2 lóbulos, uma 'hachura em nível de pixel' tende a ser preservada, embora atenuada ou desfocada. |
magick hash.png -filter Lanczos2 -distort resize 100% hash_2_lobes.png
A contribuição do método de janelamento aplicado à função Jinc também terá grande influência sobre esse efeito. Em alguns casos, pode até realçar ainda mais o padrão de hachura. ![[IM Output]](../static/img/filter/hash_2_lobes.png)
Surge, então, a questão de como ajustar os filtros de distorção de modo a minimizar as distorções de cor geradas pelo filtro em uma distorção no-op. A maneira como Nicolas Robidoux decidiu fazer isso foi selecionando um blur (reescala do suporte do núcleo do filtro) que tende a preservar as bordas ortogonais tanto quanto possível.
Filtro Lanczos Cilíndrico
Ora, como discutido acima, o "Lancoz" é normalmente definido como uma função 'Sinc() ' usada tanto na ponderação quanto no janelamento do filtro. Mas, quando usado como filtro cilíndrico EWA, AMBAS as funções de ponderação serão substituídas pela função 'Jinc() '. Ou seja, não apenas a função de ponderação é substituída (como acontece com os outros filtros lineares com janelamento), mas ela também substitui a função de janelamento, produzindo uma função de ponderação Jinc com janelamento Jinc. Assim, um 'Lanczos Cilíndrico' selecionará uma "Jinc com janelamento Jinc" com o mesmo número de lóbulos (padrão 3). Essa técnica foi defendida pela primeira vez por Andreas Gustafsson, em sua tese sobre Distorção Interativa (Local) de Imagens (página 24). Ele usou especificamente um Lanczos Cilíndrico de 2 lóbulos (Jinc com janelamento Jinc) que chamou de 'Lanczos2D' (veja a seguir). Essa foi simplesmente uma extensão óbvia para a situação planar (EWA). Daí o uso do mesmo nome. Para mais informações sobre isso, veja este Post na Discussão de BC-splines.
Lanczos2 - Lanczos de 2 lóbulos
Por conveniência, esta versão de dois lóbulos, simplesmente chamada '**Lanczos2**', foi incluída no IM v6.6.4-10, especialmente para uso em distorções. É, na verdade, apenas um 'Lanczos' cilíndrico (Jinc-Jinc) com a configuração avançada 'filter:lobes=2'. Veja o gráfico acima e, como o filtro do IM alterna automaticamente entre o uso das funções Sinc() e Jinc() conforme apropriado, ele não serve apenas para uso '2D' (cilíndrico). Ele também pode ser usado para resize (como uma função Sinc-Sinc), embora eu não o recomende, pois provavelmente é um pouco pequeno demais e se torna praticamente equivalente às várias outras funções cúbicas.
LanczosSharp - Um Lanczos ligeiramente aguçado
Observou-se que janelar uma função Jinc() leva a resultados de distort EWA muito mais desfocados do que a função Sinc() com janelamento análoga, nos resultados de resize ortogonal (especialmente com linhas finas). Esse era particularmente o caso para distorções leves. Basicamente, a função Jinc() tem algumas propriedades especiais, e janelar a função Jinc() estraga essas propriedades específicas e desejáveis. Com alguns cálculos, Nicolas Robidoux, Professor de Matemática na Laurentian University, conseguiu elaborar uma versão ligeiramente mais nítida de um Lanczos Cilíndrico de 3 lóbulos, agora disponível como '**LanczosSharp**', que corrigiu, em certa medida, o problema para a distorção de imagens. No entanto, o filtro resultante ainda tem o forte desfoque de padrões de 'hachura de pixel' de baixo nível, dos Filtros Cilíndricos Jinc com Janelamento.
Lanczos2 Aguçado
O mesmo problema era mais severo nos filtros 'Lanzcos2', então Nicolas também produziu um filtro '**Lanczos2Sharp**' mais nítido, usando um Controle Avançado de Blur ligeiramente maior. Isso resultou em um filtro com apenas desfoque mínimo para linhas verticais ou horizontais em um caso 'sem distorção'. Esse filtro aguçado resulta em um pequeno deslocamento do ponto zero, de modo que ele agora se localiza em aproximadamente '1.1684'. Isso pode não parecer muito, mas faz uma enorme diferença na quantidade de desfoque que o filtro gera para imagens com pouca ou nenhuma distorção.
Lanczos Radius
Este é um filtro EWA Lanczos que é desfocado (aguçado) de modo que o número de lóbulos usado (3 por padrão) se ajuste a um raio de suporte inteiro. Ou seja, um EWA Lanczos de 3 lóbulos (baseado em uma Jinc com Janelamento) é aguçado para ter um suporte de exatamente raio 3. Você pode usar o Controle Avançado de Lóbulos para obter o mesmo resultado, mas, como isso envolve um ajuste baseado no cruzamento de zero conhecido da função Jinc, não é um cálculo fácil de fazer. Nicolas recomendou a adição deste filtro para que você não precise fazer esse cálculo e possa testar este filtro tão especificamente aguçado. FUTURO: tabela de fatores de blur para os filtros Jinc com Janelamento Jinc.
Incluir o número de lóbulos como referência.
Filtro Robidoux Cilíndrico
Estranhamente, os experimentos mostravam que usar um filtro Mitchell-Netravali como filtro cilíndrico produzia resultados 'nítidos' quase equivalentes para o caso 'sem distorção'. E, no entanto, o filtro não tem relação com seu uso como filtro cilíndrico, pois foi selecionado por um 'estudo social' para filtragem ortogonal (resize). O filtro 'Mitchell' era especialmente bom em preservar padrões de 'hachura de pixel' de baixo nível, que os Filtros Jinc com Janelamento normais destruíam em imagens filtradas cilindricamente. Nicolas então descobriu que, por uma coincidência bizarra, o 'Mitchell' era extremamente próximo da forma 'aguçada' do filtro 'Lanzcos2' discutida acima. Isso, por sua vez, o levou a desenvolver um Filtro Cúbico de Keys que preserva as linhas verticais (e horizontais) perfeitamente. Além disso, esse novo filtro faz isso com um custo computacional menor, pois uma função cúbica é muito mais barata de calcular do que uma função Jinc. Esse filtro cúbico foi adicionado ao IM como o filtro '**Robidoux**', a partir do IM v6.6.5-0, e é também o filtro padrão usado pelo Distort e seu método de Reamostragem Ponderada Elíptica, especificamente devido à sua propriedade de desfoque mínimo para imagens com apenas distorção mínima. Isso não quer dizer que ele seja 'o melhor' filtro a usar, e até o próprio Nicolas gosta de usar outros filtros, mas é um compromisso muito bom, assim como o 'Mitchell' é um bom compromisso para o redimensionamento ortogonal (tensor). Marquei este filtro no "Mapa dos Cúbicos" gerado pela Pesquisa Mitchell-Netravali, para que você possa ver o quão intimamente relacionado ao filtro '[Mitchell](#mitchell)' ele é. Ele, de fato, seria um filtro razoável tanto para imagens redimensionadas ortogonalmente quanto distorcidas cilindricamente.
Filtro Robidoux Sharp Cilíndrico
O filtro '**RobidouxSharp**' é uma versão ligeiramente mais nítida do filtro '[Robidoux](#robidoux)', embora alguns achem que os resultados são nítidos demais. Ele é projetado especificamente para preservar imagens contendo pixels puramente pretos e brancos com o mínimo de erro, no caso "no-distort". Especificamente, para que as ponderações dos pixels vizinhos ortogonais correspondam exatamente às ponderações negativas dos pixels vizinhos diagonais em um caso 'no-distort'. Por coincidência, o filtro '[Mitchell](#mitchell)' calha de cair quase exatamente entre o filtro '[Robidoux](#robidoux)' e o filtro '[RobidouxSharp](#robidoux_sharp)', e todos pertencem à família de filtros Cubic Keys. Assim, os usuários podem escolher entre qualquer um desses três filtros para controlar o desfoque-nitidez dos resultados em situações próximas de 'no-distort'. Para detalhes deste filtro, veja a discussão BC-splines nos Fóruns do IM.
Filtro Robidoux Soft Cilíndrico
Este foi adicionado muito depois e é muito diferente dos outros filtros Cilíndricos vistos. Sim, ele é muito mais desfocado, para torná-lo mais útil para o aumento ou ampliação de imagens, o que lhe permite evitar alguns efeitos de escada em fotos de prédios de tijolos. Para mais informações sobre isso, veja este Post na Discussão de BC-splines, bem como esta discussão de um fórum de processamento de fotos.
Resumo dos Filtros Cilíndricos
Nicolas Robidoux, na longa e contínua discussão de fórum sobre o Escalonamento Adequado de um Filtro Jinc em EWA, dá o seguinte como um resumo dos filtros cilíndricos... Se o Robidoux for suave demais e o RobidouxSharp serrilhado demais, sugiro que você experimente o Mitchell (com distort Resize), que fica praticamente no meio do caminho.
Como o JPEG envolve uma Transformada de Cosseno (Discreta), não me surpreende que os filtros baseados em considerações de Fourier (os Lanczos et al, seja resize com Sinc ou distort com Jinc) geralmente se saiam melhor do que aqueles baseados em "boas aproximações de funções suaves" (aqueles baseados nas cúbicas de Keys: Robidoux, Mitchell, RobidouxSharp, CatRom, seja com resize ou distort). Essa vantagem parece ser menor com PNGs (que não destroem informação através do domínio de Fourier).
Nicolas tem muito mais a dizer. Tanto que ele tem sua própria seção, Reamostragem por Nicolas Robidoux, que agora é uma página separada e extensa por conta própria.
Magic Kernel Sharp 2013 + 2021
O Magic Kernel Sharp é um algoritmo de redimensionamento de imagens desenvolvido por John Costella, originalmente criado em 2013 para um projeto no Facebook. Ele inclui uma etapa de aguçamento de três taps que melhora a nitidez da imagem durante o redimensionamento, tornando-o rápido e eficiente. Esta versão vem sendo usada pelo Facebook para redimensionamento de imagens no servidor desde seu desenvolvimento. Em 2021, Costella refinou o Magic Kernel Sharp para melhorar sua precisão, fornecendo pelo menos nove bits de precisão e atendendo melhor aos requisitos de aguçamento. Esta versão atualizada continua a ser empregada pelo Facebook, Instagram e outras aplicações, como o motor de redimensionamento pica e o compressor de imagens RedKetchup, garantindo um redimensionamento de imagens de alta qualidade com notável fidelidade.
Controles Avançados de Filtro
Nas várias seções acima, apresentei um grande número de 'controles' avançados especiais, que permitem modificar os vários filtros de diversas maneiras. Você define essas configurações avançadas usando a Configuração Global Define (ou a Opção Set equivalente). Um resumo completo de todas as opções avançadas está na Página de Referência de Opções de Linha de Comando do IM para "[-filter](https://imagemagick.org/command-line-options/#filter)". A configuração "[-filter](https://imagemagick.org/command-line-options/#filter)" é, na verdade, usada apenas para consultar e definir os controles avançados de forma apropriada, de modo a definir o filtro de redimensionamento 'nomeado' dado. Essas configurações sobrescreverão os valores padrão especificados acima, no momento em que o filtro é configurado para uma operação específica de processamento de imagens por redimensionamento ou distorção. |
A configuração "[-filter](https://imagemagick.org/command-line-options/#filter)" 'Point' contorna completamente toda a configuração de filtro acima e degenera em uma consulta direta 'Nearest Neighbor' não escalada (resize), ou consulta interpolada (distort). Assim, essa configuração de filtro nomeado efetivamente desativa por completo o filtro de consulta de imagem escalada. |
|---|---|
| Ora, embora eles estejam disponíveis, gostaria de fazer uma observação final. |
A menos que você seja um especialista (ou esteja apenas brincando) -- É melhor NÃO usá-los!
Há poucas pessoas que são especialistas em processamento de imagens e, a menos que você saiba exatamente o que os filtros fazem e como alterá-los afeta o método de filtragem, tudo o que provavelmente conseguirá é destruir a eficácia do seu processamento de imagens e produzir resultados de aparência ruim. Especialmente em imagens diferentes dos seus casos de teste. Isso não quer dizer que os usuários não devam usá-los, e muitos dos Exemplos do IM de fato os utilizam, mas isso costuma ser feito para fornecer algum efeito especial. Quando uma opção especial é usada, a razão de seu uso também é explicada, e você deve seguir a receita dada para aquele efeito. Você é, é claro, bem-vindo para usá-los, e pode gerar alguns efeitos muito interessantes e altamente incomuns fazendo uso deles.
O Controle de Filtro 'verbose'
A configuração "filter:verbose" é talvez seu melhor amigo para descobrir e entender os outros controles de filtro. Por exemplo, você pode verificar que o filtro Lanczos é definido em termos de uma Sinc com janelamento Sinc de suporte 3.
magick null: -filter Lanczos -define filter:verbose=1 \
-resize 2 null: | grep '^#'
Note que, internamente, o filtro Lanczos é definido em termos de uma função polinomial equivalente rápida 'SincFast' (4 lóbulos), em vez de uma função 'Sinc' completa, que é definida em termos de funções Trigonométricas de Biblioteca muito mais intensivas em computação. Aqui vemos que o filtro Lanczos é definido como um filtro Jinc com janelamento Jinc quando usado como um filtro "-distort" cilíndrico (Algoritmo EWA).
magick null: -filter Lanczos -define filter:verbose=1 \
-distort SRT 0 null: | grep '^#'
A configuração 'filter:verbose' é a única maneira pela qual os usuários podem verificar exatamente qual é o filtro resultante final, devido ao uso das várias configurações avançadas. Após o cabeçalho de configurações do filtro comentado com '#', um conjunto de pontos de dados gerados pelo filtro é retornado. Esses pontos são fornecidos especificamente para traçar os dados dos filtros em gráficos, e permitem que você verifique melhor exatamente o que o filtro está produzindo, sem fazer conjecturas a partir dos resultados de imagens de teste. Por exemplo, extraia os dados de um Filtro Sinc com Janelamento Welch...
magick null: -filter Welch -define filter:verbose=1 \
-resize 2 null: > filter_welch.dat
Ou a Função de Janelamento Welch bruta que foi usada no exemplo acima, com a função de janela escalada em um alcance de suporte de 0 a 1.
magick null: -define filter:filter=Box \
-define filter:window=Welch \
-define filter:support=1.0 \
-define filter:verbose=1 \
-resize 2 null: > window_welch.dat
Você pode então plotar esses dados com o comando "gnuplot" (como fiz em Filtros Sinc com Janelamento acima)...
gnuplot
set grid
plot "window_welch.dat" with lines
Outros Exemplos de Controles Avançados de Filtro
Criar um filtro 'Sinc bruto de 8 lóbulos' pode ser feito usando...
-define filter:filter=Sinc
-define filter:lobes=8
Usar a função de janelamento Blackman diretamente como filtro (como o IM fazia por engano, antes da v6.3.6-3).
-define filter:filter=Blackman
-define filter:support=4.0
A função de janelamento assumirá o padrão 'Box' quando não definida. Uma função de janelamento 'Box' resultará em nenhum janelamento da função de filtro base. Por exemplo, um filtro 'Gaussian' tem, por padrão, uma função de janelamento 'Box'. O único efeito que uma função de janelamento box tem é um corte da área janelada da função. Veja o Controle Avançado do Suporte do Filtro acima. Force o uso de uma função Jinc bruta (definindo explicitamente o janelamento 'Box') usando...
-define filter:filter=Jinc
-define filter:window=Box
-define filter:lobes=3
Um filtro 'Lanczos' com janelamento de 12 lóbulos cortado apenas nos primeiros 8 lóbulos do filtro com janelamento resultante...
-filter Lanczos
-define filter:win-support=12
-define filter:support=8
Isso o torna cerca de quatro vezes mais rápido, ao ignorar (corte de suporte em 8) a 'cauda' modulada pela janela (até 12) do filtro sinc-com-janelamento resultante. Isso, porém, pode resultar em alguns artefatos extras, mas menores, como resultado do corte de suporte. Usar o Gaussian para 'desfocar' uma imagem! Isso é equivalente a uma operação -gaussian 5x2, mas usando um distort no-op!
-filter Gaussian
-define filter:sigma=2
-define filter:support=5
-distort SRT 0
Nota: você não pode usar -resize para isso, pois ele pode curto-circuitar a operação e resultar na operação não sendo realizada de forma alguma. Crie um filtro diferente a partir da pesquisa 'Mitchell-Netravali'.
-filter Cubic
-define filter:b=0.5
-define filter:c=0.5
Crie seu próprio filtro 'Keys Cubic' com valor α de 0.4...
-filter Cubic
-define filter:c=0.4
Nicholas Robidoux criando este filtro esquisito enquanto explorava 'Filtros EWA Interpolantes'
-define filter:blur=.7071067811865475
-define filter:c=.49257366
-define filter:b=2.089813051319261
-filter Cubic
Quando usado para ampliar imagens, os pixels são convertidos em padrões semelhantes a losangos, em um esquema semelhante ao Blend, mas usando losangos em vez de quadrados. Qualquer uso das opções avançadas é por sua conta e risco. Elas não se destinam ao uso em produção, mas como um método para explorar ou produzir funções de redimensionamento complicadas ou de outra forma impossíveis. Use por sua conta e risco!
Resumo dos Filtros de Redimensionamento
O que se segue é minha própria visão pessoal, após estudar, recodificar e documentar todos os filtros acima disponíveis no ImageMagick. Se você acha que posso estar errado ou gostaria de expressar sua opinião, convido-o a expressar seus pontos de vista no fórum do IM, e a me convidar a responder. Os Filtros de Interpolação, como o 'Hermite', são ideais ao ampliar muito imagens, produzindo um mínimo de desfoque no resultado final, embora a saída muitas vezes possa ser aguçada artificialmente ainda mais no pós-processamento. Os Filtros de Desfoque Semelhantes ao Gaussian, como o 'Mitchell', funcionam melhor para imagens que basicamente consistem em desenhos de linha e imagens do tipo desenho animado. Você pode controlar os efeitos de desfoque versus serrilhamento do filtro sobre a imagem usando a Configuração Especial de Blur do Filtro. Os Filtros Sinc/Jinc com Janelamento, e o equivalente Lagrange, são os melhores filtros a usar com imagens do mundo real e, especialmente, ao reduzir imagens. Todos eles são muito semelhantes nos resultados básicos. Um suporte maior, ou, melhor ainda, uma configuração de contagem de lóbulos, produzirá em geral um resultado ainda melhor, embora você possa obter também mais efeitos de ondulação, mas a um custo de cálculo maior. Os Filtros Cúbicos são uma mistura de filtros rápidos e simples, de suporte fixo (geralmente 2.0), que produzem de tudo, do filtro de interpolação suave 'Hermite', ao 'Mitchell' avaliado qualitativamente para ampliações de imagem, ao filtro 'Spline' semelhante ao Gaussian muito desfocado, ou a um filtro nítido do tipo sinc-com-janelamento usando o 'Catrom'. Em geral, se os resultados do redimensionamento são aceitáveis como estão, deixe as coisas em paz, pois você tem mais probabilidade de piorar do que de melhorar.
Comparação de Filtros
Ampliação... Para dar uma comparação final, apresento aqui uma seleção de 12 filtros de redimensionamento representativos. A imagem é uma ampliação de um degrau serrilhado em uma linha de um pixel de largura, sobre um fundo cinza escuro. A própria imagem original é 'serrilhada', então você deve conseguir ver o quão bem os vários filtros removem quaisquer efeitos de serrilhamento existentes.
magick -size 10x6 xc:grey20 +antialias -draw 'fill white line 4,0 5,5' \
-filter {_filter_type_} -resize 100x {_result_}
O exemplo acima começa com os Filtros Interpolados e continua com os Filtros de Desfoque Gaussian, mostrando quanto desfoque esses filtros produzem e, ao fazê-lo, removem o 'serrilhamento' da imagem original. Nenhuma ondulação é produzida por esses filtros. A segunda linha começa com três Filtros Sinc com Janelamento, mostrando os fortes efeitos de ondulação que eles podem produzir. Lembre-se de que esses filtros são realmente projetados para reduzir imagens, não para ampliar. Isso continua com o 'Lagrange' usando sua configuração 'interpolante' padrão, e o filtro cúbico interpolado 'Catrom'. A imagem final é o filtro 'Mitchell', mostrando o que os 'especialistas' concordaram subjetivamente ser o melhor filtro 'ideal' a usar para ampliar imagens, com um mínimo de todos os quatro Artefatos de Reamostragem presentes no resultado final. Eu mesmo concordo com suas conclusões, mas apenas para ampliações. É por isso que o 'Mitchell' é o filtro de 'ampliação' padrão usado pelo IM. Redução... Para ter uma ideia dos efeitos de serrilhamento, aqui reduzo o recorte da Imagem de Anéis Grande que fizemos antes (105x105 pixels de tamanho), para ver que tipo de efeitos de Moiré cada um dos mesmos 12 filtros representativos gera.
magick rings_crop.png -filter {_filter_type_} -resize 100x {_result_}
Como você pode ver, os Filtros Interpolados têm um efeito de moiré muito fortemente serrilhado, causado como efeito colateral dos artefatos de blocagem que eles produzem. Por outro lado, os artefatos de desfoque dos Filtros de Desfoque Gaussian removeram todos aqueles efeitos de Moiré por blocagem da imagem resultante, embora com um desfoque geral (linhas indistintas) na imagem resultante. O próprio Filtro '[Gaussian](#gaussian)' mostra um efeito de serrilhamento quase imperceptível, causado por seu filtro infinito (IIR) sendo cortado pela Configuração de Suporte do Filtro, mas isso é muito leve. Por outro lado, os Filtros Sinc com Janelamento produzem uma imagem de aparência muito nítida com efeitos de moiré circulares, de intensidade aproximadamente igual nos três filtros representativos. Isso é causado pelos artefatos de ondulação que esses filtros produzem, gerando padrões de interferência. Por fim, os filtros cúbicos também mostram alguns efeitos de moiré muito leves, mas apenas devido à ondulação do lóbulo negativo. O filtro '[Mitchell](#mitchell)' produz o menor efeito de ondulação. Note que o 'Mitchell' gera efeitos muito leves de quase todos os artefatos de redimensionamento. Ou seja: moiré em forma de grade - serrilhamento/blocagem, moiré em forma circular - ondulação, e desfoque das linhas. Todos os artefatos estão, no entanto, em níveis muito mínimos, e é por isso que ele é um bom filtro de uso geral. Aqui está outra comparação, mas desta vez reduzindo fortemente uma Imagem de Anéis Menor para um tamanho menor.
magick rings_sm_orig.gif -filter {_filter_type_} -resize 100x {_result_}
Como você pode ver, os Filtros Interpolados produzem muitos artefatos de serrilhamento, enquanto os Filtros de Desfoque Gaussian tendem a desfocar mais linhas do que os outros. Mas todos os outros filtros tendem a fazer um trabalho razoável.
O Melhor Filtro?
Isso é algo que você mesmo precisará descobrir. Muitas vezes, porém, depende do tipo de imagem e de redimensionamento que você está fazendo. Para ampliar imagens, o 'Mitchell' é provavelmente mais ou menos o melhor filtro que você pode usar, enquanto basicamente qualquer um dos Filtros com Janelamento (o padrão é o 'Lanczos') é bom para reduzir imagens, especialmente quando algum tipo de padrão de baixo nível está envolvido. No entanto, se você não tem padrões, mas muitas bordas retas (como transparência de GIF), pode ser melhor usar um Filtro Gaussian aguçado ou, novamente, um 'Mitchell', de modo a evitar fortes efeitos de ondulação. O filtro 'Lagrange' também é bastante bom, especialmente com uma Configuração de Suporte do Filtro maior, para reduzir imagens. Para os interessados, recomendo que olhem o tópico de Discussão de Usuários do IM a way to compare image quality after a resize?, que basicamente mostra que não há maneira de determinar quantitativamente "O Melhor Filtro", apenas um "Melhor Filtro" qualitativo ou subjetivo. A escolha é sua, e a escolha é uma característica-chave do ImageMagick.
O Filtro Padrão do IM...
É por essas razões que o 'Mitchell' é o filtro padrão para ampliação, bem como para reduzir imagens que envolvem transparência, ou imagens contendo uma Paleta (ou mapa de cores). No entanto, o 'Lanczos' será usado em todos os outros casos, ou seja, ao reduzir imagens normais (tipicamente fotografias). Para o Distort, a configuração de filtro assume por padrão o filtro 'Robidoux', que foi projetado especificamente para minimizar o desfoque da imagem quando nenhuma distorção real ocorre. Você pode, é claro, sobrescrever essas escolhas.
Nicolas Robidoux
Nicolas Robidoux é um especialista em processamento de imagens com muito mais a dizer e recomendar sobre como tentar obter os melhores resultados possíveis no redimensionamento de suas imagens. Tanto que ele tem sua própria seção...
Reamostragem por Nicolas Robidoux.
![[IM Output]](../static/img/filter/gray_edge.gif)
![[IM Output]](../static/img/filter/gray_edge_ringing.gif)
![[IM Output]](../static/img/filter/gray_edge_resize.gif)
![[IM Output]](../static/img/filter/graph_gaussian_support.gif)
![[IM Output]](../static/img/filter/graph_sinc_windowing.gif)
![[IM Output]](../static/img/filter/dot_resize_box_black.png)
![[IM Output]](../static/img/filter/dot_distort_box_black.png)
![[IM Output]](../static/img/filter/hash.png)
![[IM Output]](../static/img/filter/hash_removed.png)
![[IM Text]](../static/img/filter/filter_verbose.txt.gif)
![[IM Text]](../static/img/filter/filter_verbose2.txt.gif)
![[IM Output]](../static/img/filter/montage_enlarge.png)
![[IM Output]](../static/img/filter/montage_shrink.png)
![[IM Output]](../static/img/filter/montage_smaller.png)