Solution
couleur=$( convert nomdufichier.png -format "%[pixel:p{0,0}]" info:- )
convert nomdufichier.png -alpha off -bordercolor $couleur -border 1 \
\( +clone -fuzz 30% -fill none -floodfill +0+0 $couleur \
-alpha extract -geometry 200% -blur 0x0.5 \
-morphology erode square:1 -geometry 50% \) \
-compose CopyOpacity -composite -shave 1 nomfichierde sortie.png
Explication
C'est un peu plus long que les réponses simples données précédemment, mais il donne de bien meilleurs résultats: (1) La qualité est supérieure en raison de l'alpha anti-crénelé, et (2) seul l'arrière-plan est supprimé contrairement à une seule couleur. ("l'arrière-plan" est défini comme approximativement la même couleur que le pixel en haut à gauche, en utilisant un floodfill à partir des bords de l'image.)
De plus, le canal alpha est également érodé d'un demi-pixel pour éviter les halos. Bien sûr, les opérations morphologiques d'ImageMagick ne fonctionnent pas (encore ?) au niveau sous-pixel, alors vous pouvez voir que j'agrandis le canal alpha à 200% avant d'éroder.
Comparaison des résultats
Voici une comparaison de l'approche simple ("-fuzz 2% -transparent white") par rapport à ma solution, lors de l'exécution sur le logo ImageMagick. J'ai aplani les deux images transparentes sur un arrière-plan marron foncé pour rendre les différences apparentes (cliquez pour les originaux).
Remarquez comment la barbe du magicien a disparu dans l'approche simple. Comparez les bords du magicien pour voir comment l'alpha anti-crénelé aide la figure à se fondre en douceur dans l'arrière-plan.
Bien sûr, j'admets complètement qu'il y a des moments où vous préférerez peut-être utiliser la solution plus simple. (Par exemple : c'est beaucoup plus facile à retenir et si vous convertissez en GIF, vous êtes de toute façon limité à un alpha de 1 bit.)
Script shell mktrans
Comme il est peu probable que vous souhaitiez taper cette commande à plusieurs reprises, je vous recommande de l'envelopper dans un script. Vous pouvez télécharger un script shell BASH à partir de github qui exécute ma solution suggérée. Il peut être exécuté sur plusieurs fichiers dans un répertoire et inclut des commentaires utiles au cas où vous voudriez ajuster les choses.
Script bg_removal
Soit dit en passant, ImageMagick inclut en réalité un script appelé "bg_removal" qui utilise le floodfill de manière similaire à ma solution. Cependant, les résultats ne sont pas géniaux car il utilise toujours un alpha d'un bit. De plus, le script bg_removal s'exécute plus lentement et est un peu plus délicat à utiliser (il vous oblige à spécifier deux valeurs de flou différentes). Voici un exemple de la sortie de bg_removal.