Solución
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
Explicación
Esto es más bien un poco más que los simples respuestas dadas anteriormente, pero da mucho mejores resultados: (1) La calidad se debe superior a alfa suavizado, y (2) solamente se elimina el fondo en lugar de un solo color. ("Fondo" se define como aproximadamente del mismo color que el píxel superior izquierdo, utilizando un relleno de inundación desde los bordes de la imagen).
Además, el canal alfa también se erosiona medio píxel para evitar halos. Por supuesto, las operaciones morfológicas de ImageMagick no funcionan (¿todavía?) A nivel de subpíxeles, por lo que pueden ver que estoy haciendo explotar el canal alfa al 200% antes de erosionarlo.
Comparación de resultados
Aquí hay una comparación del enfoque simple ("-fuzz 2% - blanco transparente") versus mi solución, cuando se ejecuta en el
logotipo de ImageMagick . Aplané ambas imágenes transparentes sobre un fondo marrón para que las diferencias sean evidentes (haga clic para ver los originales).
Observe cómo la barba del mago ha desaparecido en el enfoque simple. Compare los bordes del asistente para ver cómo el alfa suavizado ayuda a que la figura se mezcle suavemente con el fondo.
Por supuesto, admito completamente que hay ocasiones en las que es posible que desee utilizar la solución más simple. (Por ejemplo: es mucho más fácil de recordar y si está convirtiendo a GIF, está limitado a alfa de 1 bit de todos modos).
script de shell mktrans
Dado que es poco probable que desee escribir este comando repetidamente, le recomiendo envolverlo en un script. Puede descargar un script de shell BASH de github que realiza mi solución sugerida. Se puede ejecutar en varios archivos en un directorio e incluye comentarios útiles en caso de que desee modificar las cosas.
script bg_removal
Por cierto, ImageMagick en realidad viene con un script llamado
"bg_removal"
que usa floodfill de manera similar a mi solución. Sin embargo, los resultados no son excelentes porque todavía usa alfa de 1 bit. Además, el script bg_removal se ejecuta más lento y es un poco más complicado de usar (requiere que especifique dos valores de fuzz diferentes). Aquí hay un ejemplo de la salida de bg_removal.
convert original.png -transparent white new.png
pero al intentarlo, no puedo hacer que funcione. Aparte, ¿está seguro de que su fondo es realmente blanco (#FFFFFF), o es casi blanco (por ejemplo, #FEFEFE)?