Exemplos do ImageMagick -- Tratamento de Fotos Digitais
- Prefácio e Índice dos Exemplos do ImageMagick
- Metadados da Câmera Digital, o Perfil EXIF
- Orientação da Foto Digital
- Melhorias de Cor
- Clarear Fotos Subexpostas
-
Binning - Reduzir o Ruído Digital (Em Construção)
-
Correção de Rotação Leve - corrigir uma foto que não está bem nivelada
- Efeito Tilt-Shift - fazer um cenário parecer um modelo em miniatura
- Imagens em Camadas PNG-JPEG - comprimir páginas mantendo o texto nítido
- Fotos Sobrepostas - sobreposições esbatidas de fotos anexadas
- Dupla Exposição - misturar várias fotos da mesma cena
- Proteger o Anonimato de Alguém - esbater parte de uma foto
- Adicionar uma Textura a uma Imagem
- Mascaramento por Chroma Key - Modificar por áreas de cor específica
- Imagens para Colorir Infantis
- Esboço a Lápis
- Remoção de Vinheta
Um dos principais usos do ImageMagick é o tratamento e a modificação de fotografias tiradas com as modernas câmeras digitais. Essas câmeras geralmente tiram fotos bastante grandes e de alta resolução, e incluem nelas metadados sobre a hora, a escala, o zoom, a câmera, a orientação, e assim por diante. Há até planos de ligar as câmeras a telefones celulares, de modo que ela possa até adivinhar onde você estava quando a foto foi tirada e quem poderia estar nela (a partir dos telefones celulares que estiverem à sua frente). Aqui examinamos o básico do tratamento de fotos digitais, e até a sua conversão para outros fins, como renderizações artísticas. Um agradecimento especial vai para Walter Dnes, usuário de câmera digital, pela sua ajuda no aprimoramento de fotos digitais.
Metadados da Câmera Digital, o Perfil EXIF
Quando uma câmera digital tira uma foto, ela também inclui muita informação extra no arquivo JPEG salvo. Esses metadados são conhecidos como perfil EXIF, e são fornecidos especificamente para laboratórios fotográficos e revelação. O "magick identify" do ImageMagick, com a configuração "[-verbose](https://imagemagick.org/command-line-options/#verbose)", exibirá essa informação Exif. Aqui está o dado EXIF de uma foto que tirei de um Pagode, no Zoológico de Kunming, no Sul da China.
magick identify -format "%[EXIF:*]" pagoda_sm.jpg |\
sed 's/\(.\{46\}\).*/\1/' | column -c 110
| O dado EXIF, ou qualquer saída do identify, deve ser processado de forma que não diferencie maiúsculas de minúsculas. Muitas versões mais antigas do IM, por exemplo, produzirão "EXIF:" (em maiúsculas) em vez de "exif:" (em minúsculas).
---|---
Aqui está um exemplo semelhante, mas usando uma expressão de 'globbing' (estilo shell) para limitar a saída aos campos EXIF que envolvem Time...
magick identify -format "%[exif:*time*]" pagoda_sm.jpg
Há muita informação sobre esta foto no perfil EXIF. Por exemplo
- Minha câmera é uma Panasonic ('
Make'), DMC-LZ1 ('Model') - A câmera foi girada ('
Orientation'). Mas eu devo ter corrigido essa rotação sem ajustar o dado EXIF. A câmera também estava ligeiramente inclinada para cima, mas essa informação não é registrada. - O '
FocalLength' de '37mmmostra que não usei o recurso de 'Zoom Óptico' da minha câmera. Minha câmera podia chegar a um zoom óptico de 6X para um 'FocalLength' de '366/10' ou '222mm'. - E o '
DigitalZoomRatio' mostra que também não usei zoom digital. - A câmera também usou um rápido '
ExposureTime' de 1/8 de segundo, e uma abertura 'MaxApertureValue' de 3mm, ou 'FNumber' de '5.6' e um 'ISOSpeedRating' de '64'. - O flash ('
LightSource') não foi usado. - A imagem original tinha 1728 por 2304 pixels ('
ExifImageLength' e 'ExifImageWidth'). Embora a imagem real, se você quiser verificar, seja menor, então eu devo ter recortado e/ou redimensionado-a. - E provavelmente o mais importante, foi tirada por volta das 14:05 do dia 9 de julho de 2005, de acordo com a string '
DateTime'. Isso pressupõe que eu tinha a hora da câmera definida corretamente (o que tinha). - Câmeras mais modernas podem até ter uma localização por GPS e possivelmente uma direção de bússola do enquadramento!
Também incluída, mas não listada acima, há uma pequena imagem de pré-visualização em 'miniatura' que a câmera usava em seu próprio visor. Há também recursos para marcar fotos que você quer que sejam 'reveladas' ou impressas por impressoras fotográficas, e para ajustar outros parâmetros de impressão. No entanto, isso raramente é usado pela maioria das pessoas. Muitas dessas configurações podem ser bastante úteis aos usuários, mas a mais útil para as pessoas costuma ser a data e a hora da foto. Isso, é claro, pressupõe que a data e a hora estavam definidas corretamente na câmera antes de a foto ser tirada. Muitas pessoas também se interessam pela orientação da imagem, para que ela possa ser girada corretamente quando exibida, e é justamente isso que veremos a seguir. Todos esses dados, e especialmente a imagem de pré-visualização, podem ocupar bastante espaço na imagem. E pode ser que eu não queira, na verdade, que todo o mundo saiba que estive em Kunming, na China, em julho de 2005. Assim, você pode querer remover os dados EXIF de suas imagens antes de realmente publicá-las na World Wide Web. Além disso, o tamanho de uma imagem de uma câmera digital costuma ser muito grande (e cada vez maior), permitindo imprimi-la em qualidade fotográfica, mas é grande demais para uso na WWW, e especialmente não para miniaturas. Assim, a menos que você queira que os usuários possam realmente imprimir imagens em qualidade fotográfica, eu não publicaria a imagem original diretamente. A imagem acima, por exemplo, foi recortada e redimensionada para uso nos exemplos do IM, mas deixei propositalmente o dado EXIF intacto para o exemplo. Normalmente eu removeria essa informação.
Orientação da Foto Digital
Disseram-me que o Photoshop gira automaticamente as imagens digitais com base na configuração 'Orientation' do EXIF; o IM também fará isso, incluindo um operador "[-auto-orient](https://imagemagick.org/command-line-options/#auto-orient)", depois de ler a imagem. No entanto, e isto é importante
O Formato JPEG é com Perdas (Lossy)
O que isso significa é que, toda vez que você decodifica e salva o formato de arquivo JPEG, você degrada a imagem ligeiramente. Como processador de imagens geral, o IM sempre decodifica e recodifica completamente o formato, de modo que sempre degradará as imagens JPEG quando as salvar novamente. Para mais informações sobre a natureza do formato JPEG, veja Formato de Arquivo de Imagem JPEG. O ponto é usar o IM para corrigir a orientação de fotos digitais (usando "[-auto-orient](https://imagemagick.org/command-line-options/#auto-orient)") apenas quando você também estiver realizando outras operações que modificam a imagem, como Criação de Miniaturas, Anotação de Imagens, Marca d'água ou mesmo Ajustes de Exposição. O IM pode extrair a orientação atual (como um número) da foto usando um Escape de Propriedade de Imagem... | |
magick identify -format '%[exif:orientation]' pagoda_sm.jpg
![[IM Text]](../static/img/photos/orient_show.txt.gif)
O IM fornece um operador especial "[-orient](https://imagemagick.org/command-line-options/#orient)" (use "[-list](https://imagemagick.org/command-line-options/#list) orientation" para ver os valores possíveis). | |
magick pagoda_sm.jpg -orient bottom-right \
-format '%[exif:orientation]' info:
![[IM Text]](../static/img/photos/orient_setting.txt.gif)
Esses métodos de definição de metadados permitem ajustar a orientação de fotos que você modificou, especialmente as que você girou. Note que uma foto orientada corretamente tem uma orientação de 'Top-Left' ou 1. É claro que você não deve remover os metadados EXIF (usando "[-strip](https://imagemagick.org/command-line-options/#strip)" ou "[-thumbnail](https://imagemagick.org/command-line-options/#thumbnail)") se planeja usar "[-auto-orient](https://imagemagick.org/command-line-options/#auto-orient)" mais adiante no processamento da imagem. Use-o antes de remover os metadados da imagem. Se você quer corrigir a orientação da sua foto sem degradar ou modificar de outra forma a sua imagem, sugiro que use o programa JHead. Por exemplo, aqui eu corrijo a orientação de uma foto e apago a miniatura de pré-visualização embutida de todas as fotos digitais em um diretório.
jhead -autorot *.jpg
| _A rotação sem perdas de JPEG só funciona corretamente para imagens que têm um tamanho divisível por 8 ou 16. Isso é verdade para a maioria (mas não todas) das fotos de câmeras digitais. Se você tentar isso com uma imagem de tamanho ímpar, os blocos da borda direita ou inferior (contendo o tamanho parcial) não ficarão posicionados corretamente na imagem final, pois esses blocos só podem existir na borda direita ou inferior.
Para um exemplo disso, veja esta discussão específica_
---|---
O programa JHead também permite ajustar a data das fotos (se a hora da sua câmera estava errada, ou se você viajou para fusos horários diferentes), extrair/remover/substituir a miniatura de pré-visualização, definir o campo de comentário da imagem, remover perfis do photoshop, e fazer recortes básicos de imagem (para remover aquele estranho se exibindo ;-) e assim por diante, sem degradar os dados da imagem JPEG. Recomendo esse programa, ou outros programas semelhantes (veja Outros Programas de Processamento de JPEG), para corrigir essa informação. Apenas certifique-se de que ele não decodifique/recodifique de fato os dados da imagem JPEG. Um último ponto sobre a orientação. Se você apontou a câmera quase diretamente para cima ou para baixo, a configuração de orientação do EXIF pode não ser resolvida corretamente. O mesmo vale para fotos anguladas ou inclinadas. A orientação (e as câmeras) simplesmente não têm sensibilidade para essas situações. Sua única opção para tais fotos é fazer as rotações você mesmo usando o "jpegtrans" de baixo nível e sem perdas, ou o "[-rotate](https://imagemagick.org/command-line-options/#rotate)" do IM, e então redefinir a configuração de orientação do EXIF (usando o JHead ou o operador "[-orient](https://imagemagick.org/command-line-options/#orient)" do IM), ou simplesmente remover o perfil EXIF.
Outras Modificações com Perdas do IM...
Se você também estiver redimensionando ou modificando de outra forma a imagem, como reduzindo
sua qualidade e tamanho para uso na web, então a perda de dados já é um fato.
Assim, durante essas operações o IM pode fazer coisas semelhantes, permitindo que você faça
todas as operações necessárias em um único ciclo de 'carregar-salvar'.
Girar TODAS as imagens para paisagem -rotate 90\<
retrato -rotate -90\>
Melhorias de Cor
Antes de prosseguir, recomenda-se que você primeiro veja Modificações de Cor para uma introdução às técnicas gerais de modificação de cor que serão usadas. Normalizar (usando "[-normalize](https://imagemagick.org/command-line-options/#normalize)") arte de linha e gráficos de alto contraste pode ser ótimo. Mas fotos normalizadas podem parecer irreais e, como foi dito antes, podem também não imprimir bem. O operador "[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)" pode limitar os "limites" da normalização, mas os operadores "[-levels](https://imagemagick.org/command-line-options/#levels)" e/ou "[-sigmoidal-contrast](https://imagemagick.org/command-line-options/#sigmoidal-contrast)" podem fazer ajustes "mais suaves" (veja Ajustes de Histograma para uma discussão de mais baixo nível sobre o que esses operadores fazem). A imagem de entrada acima é cortesia de "Tong" da Lista de Discussão do IM.
Clarear Fotos Subexpostas Contribuição de Walter Dnes
Às vezes simplesmente não há luz disponível suficiente para permitir uma exposição adequada. Em outras ocasiões, você pode ter de usar tempos de exposição mais curtos do que o ideal para eliminar o borrão de movimento. Fotos digitais subexpostas podem ter as áreas mais escuras clareadas preferencialmente, sem estourar as altas luzes, usando o operador "[-sigmoidal-contrast](https://imagemagick.org/command-line-options/#sigmoidal-contrast)" com um nível de limiar de '0%'. Veja Contraste de Não-linearidade Sigmoidal para mais detalhes. Aqui está um exemplo de subexposição leve, que foi tirado em um concerto gratuito depois do pôr do sol. Ele tem muitas áreas bem iluminadas, que estão nítidas, mas também áreas escuras que eu gostaria de tornar mais visíveis.
magick night_club_orig.jpg -sigmoidal-contrast 4,0% night_club_fixed.jpg
| _Como sempre, você deve usar um formato sem perdas como TIFF ou PNG para o trabalho intermediário. O formato JPEG é usado aqui apenas para reduzir o espaço em disco e a largura de banda de download para publicação na web.
Selecione a imagem para ver a versão ampliada realmente usada pelos exemplos, em vez da pequena miniatura mostrada._
---|---
E aqui está um exemplo de subexposição grave, que foi uma foto noturna da minha varanda olhando para o sul, em direção à cidade de Toronto.
magick night_scape_orig.jpg -sigmoidal-contrast 10,0% night_scape_fixed.jpg
O parâmetro principal controla a quantidade de clareamento. Quanto mais clareamento for necessário, maior o valor usado. E mais granulada a imagem de saída parecerá. Isso se deve a que os pequenos erros de pixel também são realçados. O clareamento por contraste sigmoidal tende a atenuar a extremidade vermelha do espectro. Você pode acabar tendo de selecionar um parâmetro que resulte nos tons de pele mais naturais, em vez do nível de brilho que você realmente quer. No caso de subexposição grave, você acabará com uma glorificada imagem granulada em preto e branco depois do clareamento. Essa é uma limitação física do aprimoramento de imagem digital. Se não houver dados de cor presentes, o IM não os gerará para você. Na vida real, os tijolos do lado direito da minha varanda são avermelhados, e as árvores abaixo são verdes.
Binning -- Reduzir o Ruído Digital Contribuição de Walter Dnes
Muitos fotógrafos sérios estão insatisfeitos com os efeitos colaterais da "corrida dos megapixels" pelos fabricantes de câmeras digitais. Os fabricantes empacotam mais megapixels no sensor de uma câmera digital tornando-os menores. Pixels menores resultam em uma imagem mais ruidosa na mesma configuração de ISO, o que força as pessoas a usar configurações de ISO mais baixas. Usar valores de ISO mais baixos para evitar ruído exige tempos de exposição mais longos. Isso, por sua vez, significa que a maioria das câmeras digitais de consumo é efetivamente inútil em ambientes internos além do alcance de 3 metros do flash embutido para qualquer coisa exceto uma foto de natureza-morta tirada com a câmera em um tripé. Muitos usuários de câmera digital de bom grado trocariam alguns pixels por fotos menos ruidosas em configurações de ISO mais altas, mas os profissionais de marketing que controlam as empresas se recusam a considerar isso como uma opção. Felizmente, a troca pode ser feita depois do fato em fotos digitais. O termo técnico é 'binning'. A teoria simplificada é assim...
- Pegue uma grade n-por-n de pixels e faça a média de seus componentes para obter um "super-pixel".
- O sinal é proporcional à área combinada de pixels, o que significa que a quantidade de sinal aumentou por um fator de n^2
- O ruído é aleatório. O que significa que ele é proporcional à raiz quadrada da área combinada de pixels, um fator de n. O resultado líquido é que a SNR (relação sinal-ruído) aumentou por um fator de n. Veja Glossário de Fotografia, Binning para mais detalhes.
| Quando uma foto digital de 1600x1200 é reduzida por binning para 800x600 (ou seja, uma grade 2x2), a relação sinal-ruído é dobrada. Da mesma forma, uma foto de 2560x1920 reduzida por binning 3x3 para 853x640 pixels terá uma melhoria por fator de 3 na relação sinal-ruído. | Para poder usar o binning, a imagem da foto deve ser um múltiplo inteiro do tamanho final desejado. |
|---|---|
No ImageMagick, a configuração especial "[-filter](https://imagemagick.org/command-line-options/#filter)" 'box' fará a média de grupos de pixels reduzindo-os a um único pixel quando você "[-resize](https://imagemagick.org/command-line-options/#resize)" uma imagem (veja Filtros de Reamostragem para detalhes). Isso significa que, para fazer um 'binning', você só precisa redimensionar a imagem corretamente. |
Em Construção
Walter Dnes também forneceu o script original binn para realizar os cálculos, recortar minimamente a imagem e realizar o 'binning'. Exemplos de binning 3Exemplos de binning 4
Livro de Receitas de Conversão de Fotos
Correção de Rotação Leve -- Deixar uma foto mais nivelada
Situação típica. Você tirou uma foto, mas a imagem não está nivelada, e você quer corrigi-la.
Por exemplo, aqui está uma foto que tirei usando uma câmera de mão em Pequim, em 2008, do alto da colina no Parque Jingshan, logo atrás da Cidade Proibida. Não, não é da Cidade Proibida em si, mas de um templo do outro lado da colina. Clique na miniatura para ver uma imagem maior. Sim, a imagem é pequena, e você deve aplicar a solução à imagem original e não a uma pequena miniatura, mas a técnica é a mesma para qualquer imagem. Neste caso, a imagem precisa ser girada em -1,8 graus para corrigi-la. Agora, se você simplesmente girar a imagem, obterá uma imagem um pouco maior contendo áreas de cor nos cantos, tornando a correção óbvia e horrível. |
magick beijing_tn.png -rotate -1.95 beijing_rotate.png
Mesmo que você recortasse a imagem de volta ao seu tamanho original, como demonstrado em Rotações Simples de Imagem, você ainda obteria alguns cantos coloridos. ![[IM Output]](../static/img/photos/beijing_rotate.png)
A solução mais simples seria então recortar esse resultado para remover essas bordas, mas então a sua imagem fica com um tamanho bastante estranho, o que de novo torna bastante óbvio que algo foi feito. Embora a fórmula para fazer esse recorte não seja simples, ela é demonstrada em Métodos de Rotação por Distorção. A melhor solução é não apenas girar a imagem, mas também escaloná-la ligeiramente para produzir uma imagem girada que tenha o mesmo tamanho da original. |
angle=-1.95
magick beijing_tn.png -distort SRT \
"%[fx:aa=$angle*pi/180;(w*abs(sin(aa))+h*abs(cos(aa)))/min(w,h)], $angle" \
beijing_rot_correction.png
![[IM Output]](../static/img/photos/beijing_rot_correction.png)
E a imagem fica com aparência limpa, com uma parede perfeitamente nivelada. O cálculo do ângulo é uma trigonometria razoavelmente simples, usando as posições dos pixels nas extremidades de uma longa linha reta na imagem. No entanto, descobri que simplesmente girar a imagem em vários ângulos pequenos por tentativa e erro encontra um bom ângulo de rotação relativamente rápido. Ao observar quão bom um determinado ângulo é, dê uma olhada bem aproximada e ampliada nos pixels ao longo da linha ou borda que você está usando. O topo da parede nesta foto. E lembre-se de que, em rotações de imagem, uma rotação para a esquerda ou anti-horária é negativa (devido ao eixo Y apontar para baixo). Lembre-se também de que, sempre que possível, aplique as operações à imagem original, evitando o uso de imagens intermediárias (e especialmente imagens JPEG intermediárias). É sempre melhor aplicar qualquer modificação de foto começando pela fonte original do que por qualquer cópia intermediária salva.
Efeito Tilt-Shift -- fazer um cenário parecer um modelo em miniatura
O 'Tilt-Shift' é uma técnica que faz uma imagem ser esbatida no topo e na base, deixando o centro da imagem sem esbatimento. Originalmente era feito em câmeras muito antigas do tipo fole, onde a lente era inclinada para tirar de foco o topo e a base da imagem. Graças à introdução do Mapeamento de Esbatimento Variável, adicionado ao ImageMagick na v6.5.4-0, isso agora é fácil de fazer. Se você acrescentar a isso um contraste muito alto para realçar as sombras, e saturar as cores, um resultado típico é que uma imagem normal pode ser feita para parecer artificial. Quase como se você estivesse tirando uma foto de um modelo pequeno, muito detalhado e bem iluminado.
A primeira coisa que precisamos fazer é realçar as cores na imagem para dar a ela um contraste muito alto, e talvez clareá-la um pouco para fazê-la parecer muito bem iluminada com fortes luzes de estúdio. |
magick beijing_md.jpg -sigmoidal-contrast 15x30% beijing_contrast.jpg
![[IM Output]](../static/img/photos/beijing_contrast_tn.gif)
Note como usei uma forte Operação de Contraste Sigmoidal para obter esses efeitos de cor. Não usei simplesmente um contraste linear, pois não queria 'cortar' as cores mais claras e mais escuras da imagem. O valor de contraste de '15' é um contraste muito, muito forte. Também clareei a imagem um pouco deslocando o centro do limiar de contraste para um valor de cinza de '30%'. Se as cores da imagem com contraste realçado não saírem caricaturais o suficiente, você pode querer tentar aumentar a saturação de cor da imagem, usando o Operador Modulate. Esta imagem não precisou disso, pois o telhado de telhas e as árvores de verde vivo já fornecem efeitos de cor suficientes. Se você olhar uma ampliação da imagem (Clique na miniatura), verá que mesmo apenas realçar as cores dá à imagem uma sensação de luzes artificiais, embora não pareça um modelo, com detalhes demais nos carros ao fundo e nas pessoas em primeiro plano. Agora o tilt-shift. Para isso preparamos uma imagem de gradiente que é branca no topo e na base, e preta no meio. Algumas pessoas podem usar um gradiente linear para isso, mas eu acho um gradiente parabólico melhor. |
magick beijing_contrast.jpg \
-sparse-color Barycentric '0,0 black 0,%h white' \
-function polynomial 4,-4,1 beijing_blurmap.jpg
![[IM Output]](../static/img/photos/beijing_blurmap_tn.gif)
Note que usei a própria imagem original com uma Coloração Esparsa Baricêntrica de dois pontos para gerar um gradiente linear sobre toda a imagem. Esse gradiente linear é então modificado usando uma Função Polinomial básica para torná-lo um gradiente parabólico com preto no meio. Agora é simplesmente uma questão de esbater a imagem de acordo com o mapa de esbatimento para criar um efeito 'tilt-shift'. O resultado é que a imagem original parece mais um modelo em escala do que um instantâneo rápido da coisa real.
magick beijing_contrast.jpg beijing_blurmap.jpg \
-compose Blur -set option:compose:args 10 -composite \
beijing_model.jpg
Como você pode ver na imagem final, as árvores e os edifícios parecem muito artificiais, devido às cores fortes, enquanto o esbatimento das partes próximas e distantes dá à imagem uma sensação 'pequena', de modelo. Embora este devesse ter sido um modelo muito detalhado! O resultado poderia ter sido melhorado ainda mais realizando uma Correção de Rotação (veja anterior) como parte do processamento de tilt-shift. Uma orientação de câmera perfeita simplesmente somaria à sensação artificial. É claro que você pode encadear todas essas operações para fazer tudo em um único comando, e evitar arquivos temporários, ou perda de qualidade.
magick beijing_md.jpg -sigmoidal-contrast 15x30% \
\( +clone -sparse-color Barycentric '0,0 black 0,%h gray80' \
-solarize 50% -level 50%,0 \) \
-compose Blur -set option:compose:args 10 -composite \
beijing_model.jpg
No exemplo acima, substituí o gradiente parabólico por um gradiente linear preto-branco-cinza mais tradicional (com a mesma inclinação) para o mapa de esbatimento do 'tilt-shift'. A técnica de Solarize & Level foi usada para fazer o gradiente linear atingir o pico na horizontal a cerca de 1/3 da base da imagem. No entanto, acho que a área de foco em um gradiente linear é pequena demais e não muito prática. Há muitas outras maneiras de gerar um gradiente adequado para um efeito tilt-shift. Por exemplo, usando Gradientes Redimensionados. Ou escalonando horizontalmente uma Cor Esparsa de Shepards de uma única coluna de pixels. Gradientes com curva senoidal também podem ser úteis.
Otimização de Velocidade
A operação de Mapeamento de Esbatimento Variável usa essencialmente um método de esbatimento bidimensional de passagem única (equivalente a um Esbatimento Gaussiano uniforme). No entanto, você pode obter um ganho geral de velocidade fazendo a operação de esbatimento em duas operações de esbatimento variável unidimensionais. Por exemplo, aqui eu primeiro esbato horizontalmente, depois verticalmente...
magick beijing_md.jpg -sigmoidal-contrast 15x30% \
\( +clone -sparse-color Barycentric '0,0 black 0,%h gray80' \
-solarize 50% -level 50%,0 -write mpr:blur_map \) \
-compose Blur -set option:compose:args 10x0 -composite \
mpr:blur_map \
-compose Blur -set option:compose:args 0x10 -composite \
beijing_model_2pass.jpg
O resultado é praticamente idêntico (embora difira um pouco), mas é muito mais rápido de processar. À PARTE: Acredito que trocar as operações (esbatimento vertical e depois horizontal) gerará um resultado mais preciso para esse tipo de mapeamento de esbatimento. Basicamente, como o esbatimento horizontal é uma constante na direção dessa passagem de esbatimento, ele deve ser feito por último.
Problemas do Efeito Tilt-Shift vs Um Modelo Real
Se você examinar a foto resultante com cuidado, será capaz de perceber que é um tilt-shift falso, e não uma foto de um modelo real. Você pode ver isso pelo fato de o telhado do edifício maior estar esbatido demais quando comparado à base do edifício. Ainda que esteja a cerca da mesma distância que a base. Da mesma forma, a base da 'parede' está mais esbatida do que o topo da parede. Ou seja, dá para perceber que é falso. O problema é que objetos verticais grandes deveriam ser esbatidos na mesma quantidade em toda a sua superfície, e não apenas esbatidos de forma variável conforme a altura. Lembre-se de que o gradiente de esbatimento pretende representar a profundidade de foco, ou a distância dos vários objetos na imagem, de modo que a superfície de um objeto vertical deveria estar toda à mesma 'distância' e, portanto, ser esbatida na mesma quantidade. Para corrigir isso, eu precisaria ajustar o gradiente de esbatimento para fazer essas áreas terem uma cor constante (ou quase constante) da 'base' desse objeto, em relação ao resto da imagem. Ou seja, superfícies verticais têm uma quantidade constante de esbatimento, enquanto todas as superfícies horizontais têm um gradiente de esbatimento. Basicamente, o gradiente esbatido deveria representar a 'profundidade' real de cada ponto na imagem, o que para a maioria das imagens é um gradiente muito complexo. Esse ajuste pode ser difícil de conseguir, pois muito provavelmente exige alguma interpretação humana do que é uma parede horizontal e de quão longe o objeto está na imagem. Também é improvável que seja facilmente automatizado. O que você pode fazer com esse efeito? Envie-me por e-mail suas imagens tilt-shift! Vou referenciá-las aqui. Ou talvez você possa corrigir as falhas do tilt-shift no exemplo acima.
Imagens em Camadas PNG-JPEG
Separando uma grande página de jornal ou revista em uma camada de texto salva como PNG, e uma camada de imagem salva como JPG, ambas usando apenas um fundo branco, é possível usar muito menos espaço em disco do que as duas imagens combinadas! O mais importante é que as imagens podem usar uma compressão com perdas (JPEG), enquanto os componentes de texto permanecem nítidos e claros (PNG). Parece bobo e estranho, mas é de fato verdade. As imagens separadas podem economizar de 3 a 4 vezes o espaço em disco usado por uma única imagem combinada. Normalmente as duas imagens são geradas durante o processo de publicação como camadas separadas. Mas você também pode separar imagens depois do fato. As imagens são simplesmente sobrepostas...
magick ny_family.jpg ny_family.png -composite ny_family_merged.jpg
![[IM Output]](../static/img/photos/ny_family_merged_tn.jpg)
Selecione as imagens resultantes para ver uma cópia maior.
Isso usa uma Composição Over normal, que exige que a imagem PNG (sobreposição) seja transparente. Essa transparência vem em duas formas. Seja como uma máscara booleana (pura de ligado/desligado), como visto acima. Código de exemplo para separação de imagens é bem-vindo.
Fotos Sobrepostas -- sobreposições esbatidas de fotos anexadas
Criar uma série de fotos sobrepostas (e não me refiro a um panorama) é uma tarefa comum, especialmente na criação de sites. Mas pode ser complicado de fazer a menos que você tenha o conhecimento certo dos operadores do IM. O método mais simples é usar uma Composição por Máscara das duas imagens, e uma máscara para selecionar qual imagem sobrepor. Primeiro, porém, você precisa fazer uma matemática simples. Para este exemplo, estou usando duas imagens em miniatura de 120x90 pixels de tamanho e quero sobrepô-las horizontalmente em 40 pixels. Isso significa que a imagem resultante deve ter 120 + 120 - 40 pixels de largura, ou uma imagem de 200x90 pixels. Em seguida, precisamos de uma máscara. Ela precisa ser preta de um lado, branca do outro, com um gradiente de 40 pixels no meio, do tamanho da imagem de saída final. Ou seja, 120 pixels - 40 pixels dá uma área de 80 pixels para cada uma das duas áreas não sobrepostas. Então vamos gerar uma imagem de máscara... |
magick -size 90x80 xc:white xc:black -size 90x40 gradient: \
+swap -append -rotate 90 overlap_mask.png
![[IM Output]](../static/img/photos/overlap_mask.png)
Uma forma alternativa de gerar a imagem de máscara é usar o script gerador de gradiente horizontal "[plmlut](http://www.fmwconcepts.com/imagemagick/plmlut/index.php)" de Fred Weinhaus. Ele tem controles mais finos para a curvatura do gradiente do que o gradiente linear abrupto que gero acima. Agora que toda a matemática está resolvida, tudo o que resta é fazer uma composição de três imagens por máscara, usando a máscara que acabamos de gerar. No entanto, também precisaremos ampliar a imagem de destino (esquerda) para fornecer espaço suficiente para a imagem direita sobreposta (qualquer cor), e posicionar a segunda imagem corretamente usando a gravity apropriada (direita, ou 'East').
magick holocaust_tn.gif -extent 200x90 spiral_stairs_tn.gif \
overlap_mask.png -gravity East -composite overlap_photos.jpg
E agora temos duas imagens, que são sobrepostas usando um gradiente linear. É claro que os dois comandos podem ser mesclados em um único comando, para que você não precise salvar a imagem intermediária da 'máscara'. Isso fica como exercício para o leitor. Uma leve melhoria é usar um gradiente mais curvado sobre uma sobreposição maior entre as imagens. Isso reduz a mudança abrupta visível no início e no fim da área de sobreposição da imagem final. Especialmente em imagens que contêm grandes áreas de cores muito diferentes. Por exemplo, isto usa algumas técnicas de Gradiente Distorcido para não apenas gerar uma curva de gradiente mais suave, mas também para girar esse gradiente de modo a ter uma sobreposição bastante angulada. |
magick -page +0-15 -size 1x30 gradient: \
-sigmoidal-contrast 5,50% -contrast-stretch 0 \
-set option:distort:viewport 180x90-90-45 \
+distort SRT 115 +repage \
holocaust_tn.gif -extent 180x90 +swap \
spiral_stairs_tn.gif +swap \
-gravity East -composite overlap_angled.jpg
![[IM Output]](../static/img/photos/overlap_angled.jpg)
Sim, o exemplo acima é bastante complexo, mas mostra exatamente o que é possível. Se você planeja fazer mais de duas imagens, um método melhor é usar a máscara para definir diretamente a transparência da segunda imagem e das posteriores. As múltiplas imagens podem então ser sobrepostas usando uma técnica vista em Exemplos de Imagem em Camadas. Algumas dessas técnicas não exigem que você calcule o tamanho da imagem final, pois o IM pode fazer isso por você. Você só precisa se certificar de posicionar as imagens corretamente. Por exemplo, aqui eu adiciono um gradiente de 30 pixels a uma segunda e a uma terceira imagem, exigindo que as imagens sejam colocadas a cada 90 pixels (largura 120 menos a sobreposição de 30 pixels) uma da outra. Quando todas as imagens recebem a transparência e o posicionamento apropriados, apenas fazemos o Mosaico das camadas juntas (todos os deslocamentos são positivos), deixando o IM descobrir o tamanho final da tela.
magick -size 90x90 xc:white -size 90x30 gradient: -append -rotate 90 \
hatching_tn.gif \
\( chinese_chess_tn.gif -clone 0 \
-compose CopyOpacity -alpha off -composite -repage +90+0 \) \
\( holocaust_tn.gif -clone 0 \
-compose CopyOpacity -alpha off -composite -repage +180+0 \) \
\( spiral_stairs_tn.gif -clone 0 \
-compose CopyOpacity -alpha off -composite -repage +270+0 \) \
-delete 0 -compose Over -mosaic overlap_series.jpg
Em vez de pré-calcular as posições das imagens sobrepostas mascaradas, você pode usar técnicas encontradas em Sobreposição por Anexação, bem como em Posições Calculadas Incrementalmente para sequências de imagens mais longas. Notas Finais: Sobrepor fotos dessa forma funciona melhor para imagens com uma cor geral razoavelmente comum. Você também pode notar que, para as imagens em qualquer uma das extremidades da sequência, um assunto centralizado pode não parecer muito centralizado devido à sobreposição em apenas um lado da imagem. Esse problema pode ser melhorado esmaecendo a borda externa dessas imagens até a transparência, ou cortando parte da borda externa para ajudar a recentralizar o assunto dessas imagens. À PARTE: Pode ser que fazer a composição em um espaço de cor diferente funcione melhor. Alguém gostaria de experimentar e relatar seus resultados, bons ou ruins?
Dupla Exposição -- misturar várias fotos da mesma cena
Com as antigas câmeras de filme, havia uma técnica em que uma imagem era tirada duas ou mais vezes sem 'avançar' o filme. Isso permitia criar o que era conhecido como dupla exposição, em que duas imagens tiradas em momentos ligeiramente diferentes eram mescladas. O resultado era muitas vezes um efeito fantasmagórico ou um escurecimento das partes da imagem que se moviam ou mudavam. No entanto, com o controle cuidadoso dos assuntos na imagem, os efeitos de iluminação, e até o processo de revelação, tornou-se possível fazer algumas fotos muito estranhas ou até 'impossíveis'. Com imagens digitais é ainda mais fácil, pois você tem um controle ainda melhor das imagens. Basicamente... Ver é crer, mas as câmeras mentem! Por exemplo, suponha que eu quisesse uma imagem em que eu aparecesse duas vezes! Bem, isso é fácil de fazer. Aqui, por exemplo, estão as miniaturas de duas fotos rápidas que tirei especificamente para este exemplo, usando um tripé e temporizador, que usarei diretamente.
![[IM Output]](../static/img/img_photos/anthony_2.jpg)
Talvez você possa fornecer um conjunto de fotos melhor e mais divertido?
Vou aplicar as técnicas de dupla exposição diretamente a essas miniaturas, embora, mais tipicamente, eu faria isso usando arquivos de imagem originais como entradas, para obter um resultado da mais alta qualidade. Agora, se eu usasse uma 'dupla exposição' tradicional, no estilo de filme, com uma câmera antiga, o resultado seria uma média dessas duas imagens, gerando 'fantasmas' translúcidos de mim mesmo. Aqui está a simulação digital dessa técnica... |
magick anthony_1.jpg anthony_2.jpg -evaluate-sequence mean anthony_ghosts.jpg
![[IM Output]](../static/img/photos/anthony_ghosts.jpg)
No entanto, e se eu não quiser fantasmas, mas imagens propriamente sólidas de mim mesmo. Bem, então você precisa usar uma máscara para selecionar quais partes você quer que venham de qual imagem. Essa máscara pode ser gerada de duas maneiras. Você pode simplesmente criar a máscara manualmente, dividindo a imagem ao longo das partes estáticas ou imutáveis. Uma questão bastante simples neste caso específico... |
magick -size 100x90 xc: -draw 'rectangle 0,0 50,89' \
-blur 0x3 anthony_mask.jpg
![[IM Output]](../static/img/photos/anthony_mask.jpg)
Note que esbati a máscara, para 'suavizar' (feather) a transição entre as duas imagens. E aqui eu uso uma Composição por Máscara para mesclar as imagens. |
magick anthony_1.jpg anthony_2.jpg anthony_mask.jpg \
-composite anthony_doubled.jpg
![[IM Output]](../static/img/photos/anthony_doubled.jpg)
E se você tivesse duas (ou mais) fotos de família, em que algumas pessoas estivessem com os olhos fechados, falando, fazendo caretas, ou simplesmente olhando para o lado. Você poderia escolher e selecionar cada 'cabeça' de imagens diferentes e mesclar as várias imagens para formar uma montagem, de modo a obter uma foto em que todos estejam olhando para a câmera e com os olhos abertos. Trocando as imagens de entrada, ou apenas negando a máscara, você pode remover a mim completamente da imagem, obtendo uma vista desobstruída do fundo estático. |
magick anthony_2.jpg anthony_1.jpg anthony_mask.jpg \
-composite anthony_removed.jpg
![[IM Output]](../static/img/photos/anthony_removed.jpg)
Isso pode ser útil ao tirar fotos de um monumento público, onde você não pode arcar com a despesa do controle de multidões. Basta tirar muitas e muitas fotos de um tripé e, com sorte, você poderá combiná-las para remover todos da cena! Uma alternativa a gerar uma imagem de fundo, quando você tem centenas de imagens (vídeo), é apenas criar uma média de todas as imagens. Isso transforma todas as pessoas ou outros objetos transitórios em uma leve névoa de 'fantasmas'. Isso pode ser um efeito interessante por si só, mas nem sempre é o que se quer. Uma imagem média pode ser uma etapa útil, pois, uma vez que você a tenha, pode compará-la com cada imagem individual para mascarar a pessoa (objeto transitório) de cada quadro, antes de combinar novamente os fundos, para criar uma imagem de fundo limpa (sem névoa). Uma grande discussão sobre gerar automaticamente um 'fundo limpo' a partir de imagens de vídeo está no Fórum de Discussão do IM em Criando uma Imagem de Referência e Extraindo eventos de mudança.
Com uma foto de fundo limpa, podemos aplicar um limiar a uma imagem de diferença para mascarar as partes da imagem que mudaram. Você pode precisar usar mais algum esbatimento e limiar para expandir essa máscara apropriadamente, de modo a cobrir não só o objeto dentro da imagem, mas também quaisquer sombras ou reflexos que ele possa projetar no cenário de fundo. Um pouco de tentativa e erro também pode ser necessário para acertar. |
magick anthony_removed.jpg anthony_2.jpg \
-compose difference -composite \
-threshold 5% -blur 0x3 -threshold 20% -blur 0x3 \
anthony_automask.jpg
![[IM Output]](../static/img/photos/anthony_automask.jpg)
Agora vamos usar essa máscara para misturar minha imagem de 'fantasmas' com a imagem original, para que pareça que minha consciência está me 'assombrando' por fazer imagens tão 'impossíveis'. |
magick anthony_1.jpg anthony_ghosts.jpg anthony_mask.jpg \
-composite anthony_haunted.jpg
![[IM Output]](../static/img/photos/anthony_haunted.jpg)
Como ponto final, todas as técnicas acima pressupõem que as fotos foram tiradas de uma câmera que estava firmemente fixada em um tripé estacionário. Se esse não foi o caso, mas as fotos foram apenas tiradas de uma posição de mão, garanto que as imagens não coincidirão nem se 'alinharão' corretamente, por mais que você tenha se esforçado para isso. Em tais casos, você pode precisar de alguma distorção Afim ou até de Perspectiva de pelo menos uma das duas imagens para conseguir alinhar os fundos corretamente. Quanto mais complexo o fundo, mais exigente será o realinhamento necessário. Se um flash foi usado, ou o dia estava nublado com luz variável, você também pode precisar de alguns ajustes de brilho na foto. A causa é que a maioria das câmeras 'auto-ajusta' o brilho das imagens, e um flash, ou luz variável, pode mudar o modo como ela lida com o ajuste de 'nível automático' para cada uma das imagens. Como exemplo final, aqui está outra imagem que criei a partir de duas fotos separadas, do meu sobrinho esgrimindo consigo mesmo, em frente a uma parede de escalada. Como eu estava segurando a câmera e usei um flash, precisei fazer alguns ajustes de distorção afim, bem como um leve ajuste de brilho, para obter o resultado sem emendas que você vê.
Se você estivesse tentando decidir se esta foto é falsa ou não, olharia para a iluminação, as sombras e os reflexos. Acima, um exame atento do chão mostrará que o 'Jacob' da direita não tem um reflexo adequado no chão (ele foi cortado pela borda da foto). Mas você realmente precisaria estudar bem a foto para notar isso! Agora pense nas possibilidades para as quais você pode usar essa técnica de 'dupla exposição'. Por exemplo, que tal alguns Espelhos Engraçados. Envie-me seus resultados por e-mail! Se você quiser se aprofundar nisso, o artigo de pesquisa "Interactive Digital Photomontage" aborda o uso de "Dupla Exposição" (ou, como o texto a chama, "fotomontagem"), mas fazendo uso de seleções do usuário expandidas por meio de "segmentação de imagem", para selecionar quais partes da imagem devem vir de onde. Um exemplo é quando você tem várias fotos de um grande grupo de pessoas, e em cada foto alguém não 'está bem'. Você pode usar essa técnica para selecionar qual pessoa vem de qual imagem, de modo a obter uma foto de grupo perfeita em que todos estejam: de frente, com os olhos abertos e sorrindo!
Proteger o Anonimato de Alguém -- esbater parte de uma foto
A técnica acima de usar uma máscara de composição de 3 imagens também pode ser usada de outras formas. Por exemplo, você pode 'pixelizar' uma imagem, e depois usar uma máscara para limitar o efeito apenas ao rosto de uma pessoa, de modo a "Proteger a sua Identidade".
magick zelda_tn.gif -scale 25% -scale 400% zelda_pixelate.gif
magick zelda_tn.gif -gamma 0 -fill white \
-draw 'circle 65,53 50,40' zelda_face_mask.gif
magick zelda_tn.gif zelda_pixelate.gif zelda_face_mask.gif \
-composite zelda_anonymity.png
É claro que você pode fazer tudo isso de uma vez, e até suavizar a transição de pixelizado para normal. Por exemplo.. |
magick zelda_tn.gif \( +clone -scale 25% -scale 400% \) \
\( +clone -gamma 0 -fill white \
-draw 'circle 65,53 50,40' -blur 10x4 \) \
-composite zelda_anonymity.jpg
![[IM Output]](../static/img/photos/zelda_anonymity.jpg)
É claro que, em vez de pixelizar a parte em questão, você também pode esbater a área. Basta substituir os dois operadores "[-scale](https://imagemagick.org/command-line-options/#scale)" por um único "[-blur](https://imagemagick.org/command-line-options/#blur)" para esbater os detalhes. Essa técnica de substituir uma área mascarada também pode ser usada para remover textos e logotipos indesejados de imagens. Para detalhes, veja Preenchimento de Buracos.
Adicionar uma Textura a uma Imagem
O método de composição alfa Hardlight, ou mesmo qualquer um dos vários Métodos de Composição de Iluminação, oferece formas de dar a uma imagem um padrão de textura. Por exemplo, aqui adiciono uma textura de tecido grosso a uma foto que tirei de um pagode no Zoológico de Kunming, no sul da China.
magick tile_fabric.gif -colorspace gray -normalize \
-fill gray50 +level 35% texture_fabric.gif
magick composite texture_fabric.gif pagoda_sm.jpg \
-tile -compose Hardlight photo_texture.jpg
Note que, se você quer realmente ladrilhar a textura sobre a imagem, precisa usar o comando "magick composite" em vez do mais versátil comando "magick", embora existam várias outras formas de Ladrilhar Imagens na Memória usando o convert. Note também que, ao adicionar uma textura como esta, os detalhes menores da foto original podem ser perdidos pelo excesso de ruído da textura sobreposta; as texturas devem ser mantidas simples, ou ter o seu efeito moderado apropriadamente, como o Ajuste de Nível para Reduzir o Contraste usado acima. Para usar um padrão de imagem como textura, ele deve ser modificado de modo que uma cor cinza perfeita seja usada para as áreas que permanecem inalteradas na imagem original. Ou seja, a cor média da imagem deve ser de cerca de 50% de cinza. No exemplo, demonstro uma forma pela qual você pode fazer isso com praticamente qualquer imagem ladrilhável, embora este método específico nem sempre funcione bem. Tais texturas podem ser encontradas por toda a web, como vários padrões de fundo para páginas web. Elas podem nem parecer uma textura, ser coloridas, ou mesmo muito claras ou muito escuras. Depois do ajuste, porém, você descobrirá que pode obter alguns efeitos muito interessantes. Assim como fizemos antes, você pode limitar quais partes de uma imagem são de fato texturizadas criando uma máscara apropriada. Por exemplo, vamos criar uma máscara apenas do céu quase 'branco' na foto do pagode.
magick pagoda_sm.jpg -fuzz 10% -transparent white \
-alpha extract -negate pagoda_mask.png
magick pagoda_sm.jpg photo_texture.jpg pagoda_mask.png \
-composite photo_texture_masked.jpg
Agora imagine uma foto de uma senhora usando um vestido. Você pode pegar qualquer padrão, sombreá-lo apropriadamente, e então sobrepô-lo à imagem original de modo a substituir o vestido por um desenho completamente diferente. É claro que há muitas variações do procedimento acima para chegar ao resultado final, e qual técnica específica você usa fica a seu critério, mas a ideia básica é a mesma. Texturize a imagem, mascare e sobreponha o resultado. À parte, também recomendo que você veja o método de composição alfa Overlay, que é simplesmente igual à composição Hard_Light, mas com as duas imagens trocadas. Há também muitos outros Métodos de Composição de Sombreamento que podem ser usados para texturizar uma imagem de várias formas.
Mascaramento por Chroma Key -- Modificar por áreas de cor específica
A foto à esquerda foi cedida por um usuário em uma Discussão no Fórum do IM. Ele queria mudar a cor da camisa da menina, que era um belo tom de 'rosa'. O problema é que a cor não é apenas 'rosa', mas toda uma faixa de diferentes tons de 'rosa'. Como você viu acima, para fazer alterações em uma imagem, o primeiro passo costuma ser gerar uma máscara apropriada da área na qual você está interessado. Aqui usarei uma técnica conhecida como Chroma Key para gerar a máscara dessa cor específica. Essa técnica geralmente procura uma cor específica em uma imagem para uso como máscara. É também a técnica usada para os efeitos de tela 'azul' e 'verde', amplamente utilizados na TV e no cinema.
Isso envolve basicamente extrair o 'Hue' (matiz) por meio da Separação de Imagens de Canal, e então procurar o 'tom de matiz' desejado. Por exemplo...
|
magick shirt.jpg -colorspace HSL -channel Hue -separate shirt_hue.jpg
No entanto, esta imagem de matiz tem alguns problemas.
- Primeiro, uma cor 'rosa' está muito próxima do 'vermelho', que fica na divisão onde o matiz 'dá a volta'. Para garantir que isso não seja um problema, uso o Modulate para afastar o matiz dessa 'descontinuidade' no matiz. Isso não é um problema para extrair um 'chroma key' de telas 'verdes' ou 'azuis'.
- Essa cor 'rosa' também não é uma cor de alta saturação, mas tem um valor de saturação muito baixo. Isso significa que o seu 'matiz' não é tão forte quanto deveria ser.
- O outro problema é o fundo cinza!!!!! O cinza tem muito pouco matiz, então preciso remover quaisquer áreas com pouca ou nenhuma saturação da minha máscara final, ou estarei mudando coisas no fundo. Note que isso tecnicamente não é necessário se eu limitar as alterações a deslocamentos de matiz, que não afetam cores não saturadas.
Em suma, a imagem de entrada teria funcionado melhor com uma cor mais brilhante e forte, que também não fosse tão semelhante à cor da pele (ou do cabelo). Uma camisa de azul ou verde forte, por exemplo. Mas vou trabalhar com o que me foi dado. ![[IM Output]](../static/img/photos/shirt_hue.jpg)
Então vamos extrair e combinar as duas máscaras de canal. Note que Hue = Gray64 depois que os matizes da imagem foram 'girados' usando o modulate, e Saturated = Black para o fundo cinza. |
magick shirt.jpg -modulate 100,100,33.3 -colorspace HSL \
-channel Hue,Saturation -separate +channel \
\( -clone 0 -background none -fuzz 5% +transparent grey64 \) \
\( -clone 1 -background none -fuzz 10% -transparent black \) \
-delete 0,1 -alpha extract -compose multiply -composite \
shirt_mask.png
Isso deixa apenas uma quantidade de pequenas 'manchas' isoladas, que podem ser removidas com algum Suavizamento por Morfologia (-morphology Smooth Square). Não é perfeito, mas dá conta do recado. A melhor forma seria editar a máscara à mão para limpá-la. Agora, uma máscara pode ser usada com a Mascaramento por Composição, muito parecido com o que fizemos nos exemplos de Dupla Exposição e Anonimato acima. No entanto, se você está usando uma máscara para modificar uma imagem existente (sem distorcer, ou alterar o tamanho da imagem), então é mais fácil usá-la para definir quais áreas não podem ser escritas. Essas são conhecidas como Máscaras de Recorte ou de Escrita (veja "[-mask](https://imagemagick.org/command-line-options/#-mask)" ![[IM Output]](../static/img/photos/shirt_mask.png)
Aqui eu limpo a máscara anterior dos pequenos defeitos (opcional), e a nego para definir quais áreas quero 'proteger contra escrita'. Então defino essa máscara, desloco os matizes para transformar o 'rosa' em uma cor 'azul-clara', e salvo a imagem resultante. |
magick shirt_mask.png -morphology Smooth Square \
-negate shirt_write_mask.png
magick shirt.jpg -mask shirt_write_mask.png \
-modulate 100,100,25 +mask shirt_blue.jpg
Sim, há uma leve borda 'rosa', especialmente na parte interna da manga. Além disso, uma pequena área de pele no braço dela ficou de um azul bastante escuro. Basicamente, esses são defeitos da máscara e, com um pouco mais de trabalho no aperfeiçoamento da máscara, você pode corrigir esses problemas. Mas não é um resultado ruim. Um método para gerar uma máscara melhor é usar uma imagem muito maior e de maior resolução. Quando a imagem resultante for depois redimensionada, esses pequenos defeitos também serão (com sorte) reduzidos a algo insignificante. ![[IM Output]](../static/img/photos/shirt_blue.jpg)
O verdadeiro problema deste exemplo específico é que a 'cor-chave' está tão próxima de uma cor de pele normal que você está realmente apenas pedindo por problemas! É por isso que as pessoas que usam essa técnica usam telas 'verdes' e 'azuis', pois essas cores são o mais diferentes possível da cor da 'pele' das pessoas em frente à tela. Note que é melhor NÃO usar JPEG como suas imagens de origem ou de trabalho. Na verdade, o JPEG só deveria ser usado para as suas imagens finais! Essa é parte da razão pela qual tantos 'defeitos de máscara' foram gerados em primeiro lugar.
Tela Verde
_Exemplo futuro, usando Mascaramento por Chroma Key de um 'fundo de tela verde'. Expandido a partir do artigo da Wikipedia,Chroma Key
Os verdadeiros problemas no tratamento da 'tela verde' são o 'vazamento de cor' (color spill), com cabelos finos de cor clara (loiros) e áreas semitransparentes produzindo os piores efeitos de vazamento de cor.
Remoção simplista do vazamento de cor (correção de cor)_
g(r,g,b) => (r, min(g, b), b)
Determinação do alfa...
a(r,b,g) => K0 * b − K1 * g + K2
_Usar valores de 1.0 para todos os coeficientes K é um bom palpite inicial.
Como a cor de Fundo é bem conhecida, e uma vez que o 'alfa' é conhecido, você pode usar técnicas mostradas em Remoção de Fundo usando Dois Fundos para remover qualquer 'halo de tela verde' que possa estar presente, melhor do que com a primeira fórmula de cor.
Esboço a Carvão Artístico da Imagem
A Transformação em Esboço a Carvão oferece aos usuários uma forma muito simples de gerar uma renderização simplificada em escala de cinza da imagem. Ela não funciona bem para 'imagens carregadas', mas para imagens mais simples pode produzir um resultado muito marcante.
magick holocaust_sm.jpg -charcoal 5 charcoal.gif
Imagem de Contorno para Colorir Infantil
Em uma longa discussão sobre Gerando Páginas para Colorir no Fórum de Usuários do IM, a seguinte receita de livro de receitas foi desenvolvida para transformar, com o magick, uma foto simples em algo que crianças possam colorir. Aqui está o melhor resultado que temos até agora, aplicado a uma foto que tirei do memorial do holocausto, em Berlim.
magick holocaust_sm.jpg \
-edge 1 -negate -normalize \
-colorspace Gray -blur 0x.5 -contrast-stretch 0x50% \
color-in.gif
# Para imagens muito sombreadas...
# #-segment 1x1 +dither -colors 2 -edge 1 -negate -normalize \
As operações finais na tentativa acima buscam suavizar as linhas e melhorar o resultado geral. É claro que a técnica acima só é útil para imagens com boas mudanças de cor nítidas e, de preferência, uma imagem de resolução mais alta do que a que usei acima. Para imagens de desenho animado que já têm contornos pretos com um fundo de cor clara, o uso da Detecção de Bordas com o método acima produzirá diretamente um efeito de 'duplicação' dos contornos pretos. Você pode ver esse efeito nas linhas duplicadas dos ladrilhos no caminho que leva ao memorial, no canto inferior esquerdo. Isso é um artefato da forma como a Detecção de Bordas funciona, e você pode ver mais exemplos disso naquela seção dos Exemplos do IM. A solução é negar imagens desse tipo antes de usar "[-edge](https://imagemagick.org/command-line-options/#edge)" para contornar as áreas coloridas.
magick piglet.gif -background white -flatten \
-colorspace Gray -negate -edge 1 -negate -normalize \
-threshold 50% -despeckle \
-blur 0x.5 -contrast-stretch 0x50% \
color-in_cartoon.gif
Também aplico "[-threshold](https://imagemagick.org/command-line-options/#threshold)" para poder então remover os pontos individuais que o "[-edge](https://imagemagick.org/command-line-options/#edge)" parece gostar de gerar. Depois disso, tento novamente suavizar as linhas com serrilhado (aliased) na imagem. A técnica acima recebeu acréscimos em uma discussão sobre o Filtro Photocopy do GIMP para fazer uso do método Compose Divide, para encontrar contornos.
magick taj_mahal_sm.png -colorspace gray \
\( +clone -blur 0x2 \) +swap -compose divide -composite \
-linear-stretch 5%x0% photocopy.png
A operação "[-linear-stretch](https://imagemagick.org/command-line-options/#linear-stretch)" acima ajusta o quão pretas ficarão as áreas escuras das imagens, enquanto o 'sigma' do "[-blur](https://imagemagick.org/command-line-options/#blur)" define a nitidez do sombreamento.
Esboço a Lápis
Usando um tutorial de Photoshop (PSP) sobre a conversão de imagens em Esboços a Lápis, dognose, do Fórum de Usuários do IM, conseguiu criar os comandos equivalentes do ImageMagick. Aqui está a conversão dele, simplificada em alguns comandos do IM, permitindo que você processe em lote muitas imagens em uma forma de 'esboço a lápis de artista'. Primeiro precisamos de uma imagem "pencil.gif" especial. Isso pode levar muito tempo, então, para este exemplo, eu a fiz um pouco menor, preservando a sua capacidade de ser ladrilhada por imagens maiores. Veja Modificando Imagens de Ladrilho para detalhes das técnicas. Isso só precisa ser feito uma vez, e depois pode ser reutilizado. Assim, você pode gerar uma bem maior para o seu próprio uso, de modo a evitar quaisquer efeitos de ladrilhamento. Idealmente, faça-a tão grande quanto as imagens que você planeja converter. |
magick -size 256x256 xc: +noise Random -virtual-pixel tile \
-motion-blur 0x20+135 -charcoal 1 -resize 50% pencil_tile.gif
![[IM Output]](../static/img/photos/pencil_tile.gif)
Agora é apenas uma questão de sobrepor e mesclar esta imagem de sombreamento a 'lápis' com uma foto. A imagem de lápis é ladrilhada para fazer uma tela do mesmo tamanho da imagem que estamos processando. Então ela é aplicada à imagem usando técnicas encontradas em Telas Ladrilhadas. Isso é então mesclado em uma cópia em escala de cinza da imagem original.
magick pagoda_sm.jpg -colorspace gray \
\( +clone -tile pencil_tile.gif -draw "color 0,0 reset" \
+clone +swap -compose color_dodge -composite \) \
-fx 'u*.2+v*.8' sketch.gif
Note que, como o operador "[-blend](https://imagemagick.org/command-line-options/#blend)" do comando "[composite](basics.html#composite)" não está disponível no comando "magick", optei por fazer o equivalente usando o operador "[-fx](https://imagemagick.org/command-line-options/#fx)" caseiro (DIY). Provavelmente há formas melhores, mais rápidas, mas mais complicadas de fazer isso. (sugestões são bem-vindas) Esta não é a versão final, pois o operador deixa de fora alguns aspectos de realce de bordas necessários para contornar algumas das mudanças de cor mais claras, porém nítidas, na imagem. Você consegue melhorar o que está acima? O algoritmo acima foi incorporado ao IM como uma transformação artística "[-sketch](https://imagemagick.org/command-line-options/#sketch)", embora sem o suavizamento por "[-resize](https://imagemagick.org/command-line-options/#resize)" para o 'ladrilho de lápis' gerado...
magick pagoda_sm.jpg -colorspace gray -sketch 0x20+120 sketch_new.gif
Remoção de Vinheta Ao tirar fotos (digitais ou não), a lente da câmera geralmente escurece as bordas e os cantos da imagem. Isso é chamado de 'vinhetagem'. Na verdade, esse efeito de lente é tão comum que muitas vezes é falsificado de propósito usando o operador "[-vignette](https://imagemagick.org/command-line-options/#vignette)". Veja a Transformação em Vinheta. Martin Herrmann Martin-Herrmann@gmx.de queria remover a vinhetagem da câmera das fotos. Basicamente, ele tirou uma foto de uma folha de papel branca sob uma luz forte, sem usar flash. Ele então queria combinar isso com as suas fotos reais para clarear as bordas e os cantos da imagem apropriadamente. Basicamente, o que queremos fazer é dividir a foto original pela imagem em escala de cinza da foto do pedaço de papel branco bem iluminado, e isso então clareará as partes da imagem na mesma medida em que a foto do 'papel branco' foi escurecida. Isso é basicamente o método de composição '[Divide](compose.html#divide)', que divide a imagem 'source' pela imagem 'background'. Por exemplo,
magick nikon18-70dx_18mm_f3.5.jpg vegas_orig.jpg \
-compose Divide -composite vegas_fixed.jpg
![[photo]](../static/img/photos/vegas_fixed.gif)
(clique para ver a imagem de foto maior)
No entanto, como a foto do 'papel branco' provavelmente não será um branco verdadeiro, e você provavelmente não quer clarear a imagem por essa cor 'quase branca'. Para corrigir isso, precisamos multiplicar a imagem divisora pela cor do seu pixel central. Aqui está a solução final fornecida a Martin, que usou o muito lento Operador FX DIY. Isso é anterior à adição do Método de Composição Divide, que pode ser usado para acelerar enormemente esse processo. A foto branca também foi passada para escala de cinza para remover qualquer distorção de cor; note que mudei a ordem, o que também preservará quaisquer 'metadados' que estivessem na original (pois ela é a imagem de 'destino' neste caso). |
magick vegas_orig.jpg \( nikon18-70dx_18mm_f3.5.jpg -colorspace Gray \) \
-fx '(u/v)*v.p{w/2,h/2}' vegas_fixed_fx.jpg
![[photo]](../static/img/img_photos/vegas_fixed_fx.gif)
Se você olhar com atenção as fotos ampliadas, particularmente os cantos superior esquerdo e superior direito do 'céu', poderá ver os efeitos de vinhetagem, e a correção que foi feita. Não é uma solução perfeita, e poderia usar um pouco mais de ajuste. Por exemplo, em vez de usar um pixel de escalonamento, poderíamos pré-processar a imagem do 'papel branco', e também ajustá-la para um resultado melhor de remoção de vinheta. Note que usar JPEG não é recomendado para nenhum tipo de trabalho fotográfico, pois o formato pode introduzir alguns artefatos e inconsistências nos resultados. O formato só é bom para o armazenamento e a exibição dos resultados finais. Uma grande discussão sobre a correção da vinhetagem está nos Fóruns de Usuários do IM, na discussão Correção algorítmica de vinhetagem para câmeras pinhole?. Coisas que podem afetar a vinhetagem incluem...
- Distância do filme em relação à lente; mais longe significa mais espalhamento da luz.
- Área do 'círculo' da abertura (lente ou pinhole) devido ao ângulo da luz.
- Disposição do material da câmera ao redor da abertura. Por exemplo, o suporte da lente ou a espessura do pinhole.
![[IM Text]](../static/img/photos/pagoda_sm_exif.txt.gif)
![[IM Text]](../static/img/photos/pagoda_sm_time.txt.gif)
![[IM Output]](../static/img/img_photos/night_club_tn.gif)
![[IM Output]](../static/img/photos/night_club_fixed.gif)
![[IM Output]](../static/img/img_photos/night_scape_tn.gif)
![[IM Output]](../static/img/photos/night_scape_fixed.gif)
![[IM Output]](../static/img/photos/beijing_model.jpg)
![[IM Output]](../static/img/img_photos/holocaust_tn.gif)
![[IM Output]](../static/img/img_photos/spiral_stairs_tn.gif)
![[IM Output]](../static/img/photos/overlap_photos.jpg)
![[IM Output]](../static/img/photos/overlap_series.jpg)
![[IM Output]](../static/img/img_photos/jacob_vs_jacob_md.jpg)
![[IM Output]](../static/img/img_photos/zelda_tn.gif)
![[IM Output]](../static/img/photos/zelda_face_mask.gif)
![[IM Output]](../static/img/photos/zelda_anonymity.png)
![[IM Output]](../static/img/images/tile_fabric.gif)
![[IM Output]](../static/img/photos/texture_fabric.gif)
![[IM Output]](../static/img/photos/photo_texture.jpg)
![[IM Output]](../static/img/photos/pagoda_mask.png)
![[IM Output]](../static/img/photos/photo_texture_masked.jpg)
![[IM Output]](../static/img/img_photos/holocaust_sm.jpg)
![[IM Output]](../static/img/photos/charcoal.gif)
![[IM Output]](../static/img/photos/color-in.gif)
![[IM Output]](../static/img/images/piglet.gif)
![[IM Output]](../static/img/photos/color-in_cartoon.gif)
![[IM Output]](../static/img/img_photos/taj_mahal_sm.png)
![[IM Output]](../static/img/photos/photocopy.png)
![[IM Output]](../static/img/img_photos/pagoda_sm.jpg)
![[IM Output]](../static/img/photos/sketch.gif)
![[IM Output]](../static/img/photos/sketch_new.gif)