Solução
color=$( convert filename.png -format "%[pixel:p{0,0}]" info:- )
convert filename.png -alpha off -bordercolor $color -border 1 \
\( +clone -fuzz 30% -fill none -floodfill +0+0 $color \
-alpha extract -geometry 200% -blur 0x0.5 \
-morphology erode square:1 -geometry 50% \) \
-compose CopyOpacity -composite -shave 1 outputfilename.png
Explicação
Isso é um pouco mais longo do que as respostas simples fornecidas anteriormente, mas dá resultados muito melhores: (1) A qualidade é superior devido ao alfa suavizado e (2) apenas o fundo é removido, em oposição a uma única cor. ("Plano de fundo" é definido como aproximadamente da mesma cor do pixel superior esquerdo, usando um preenchimento das bordas da imagem.)
Além disso, o canal alfa também é corroído em meio pixel para evitar halos. Claro, as operações morfológicas do ImageMagick (ainda?) Não funcionam no nível de subpixel, então você pode ver que estou aumentando o canal alfa para 200% antes de erodir.
Comparação de resultados
Aqui está uma comparação da abordagem simples ("-fuzz 2% -transparent white") com a minha solução, quando executada no logotipo do
ImageMagick . Eu aplainei as duas imagens transparentes em um fundo marrom escuro para tornar as diferenças aparentes (clique para ver os originais).
Observe como a barba do Mago desapareceu na abordagem simples. Compare as bordas do Assistente para ver como o alfa suavizado ajuda a figura a se mesclar suavemente com o fundo.
Claro, eu admito completamente que às vezes você pode querer usar a solução mais simples. (Por exemplo: é muito mais fácil de lembrar e, se você estiver convertendo para GIF, estará limitado a alfa de 1 bit de qualquer forma.)
script shell mktrans
Como é improvável que você queira digitar esse comando repetidamente, recomendo envolvê-lo em um script. Você pode baixar um script de shell BASH do github que executa minha solução sugerida. Ele pode ser executado em vários arquivos em um diretório e inclui comentários úteis caso você queira ajustar as coisas.
script bg_removal
A propósito, o ImageMagick na verdade vem com um script chamado
"bg_removal"
que usa o floodfill de maneira semelhante à minha solução. No entanto, os resultados não são bons porque ele ainda usa alfa de 1 bit. Além disso, o script bg_removal executa mais devagar e é um pouco mais complicado de usar (requer que você especifique dois valores difusos diferentes). Aqui está um exemplo da saída de bg_removal.
convert original.png -transparent white new.png
mas ao tentar, não consigo fazê-lo funcionar. Como um aparte, você tem certeza de que o fundo é realmente branco (#FFFFFF) ou é apenas quase branco (por exemplo, #FEFEFE)?