Soluzione
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
Spiegazione
Questo è un po 'più lungo delle semplici risposte fornite in precedenza, ma dà risultati molto migliori: (1) La qualità è superiore grazie all'antialias alfa e (2) viene rimosso solo lo sfondo rispetto a un singolo colore. ("Sfondo" è definito come approssimativamente dello stesso colore del pixel in alto a sinistra, utilizzando un riempimento dai bordi dell'immagine.)
Inoltre, anche il canale alfa viene eroso di mezzo pixel per evitare aloni. Ovviamente, le operazioni morfologiche di ImageMagick non funzionano (ancora?) A livello di subpixel, quindi puoi vedere che sto facendo esplodere il canale alfa al 200% prima di erodere.
Confronto dei risultati
Ecco un confronto tra il semplice approccio ("-fuzz 2% -transparent white") e la mia soluzione, quando eseguito sul
logo ImageMagick . Ho appiattito entrambe le immagini trasparenti su uno sfondo marrone chiaro per rendere evidenti le differenze (fare clic per gli originali).
Notate come la barba del Mago sia scomparsa nell'approccio semplice. Confronta i bordi della procedura guidata per vedere come l'alfa con antialias aiuta la figura a fondersi uniformemente con lo sfondo.
Naturalmente, ammetto completamente che ci sono momenti in cui potresti voler utilizzare la soluzione più semplice. (Ad esempio: è molto più facile da ricordare e se stai convertendo in GIF, sei comunque limitato a 1 bit alpha.)
script di shell mktrans
Poiché è improbabile che tu voglia digitare ripetutamente questo comando, ti consiglio di inserirlo in uno script. Puoi scaricare uno script di shell BASH da GitHub che esegue la mia soluzione suggerita. Può essere eseguito su più file in una directory e include commenti utili nel caso in cui si desideri modificare le cose.
bg_removal script
A proposito, ImageMagick in realtà viene fornito con uno script chiamato
"bg_removal"
che utilizza il riempimento inondazioni in modo simile alla mia soluzione. Tuttavia, i risultati non sono eccezionali perché utilizza ancora alfa a 1 bit. Inoltre, lo script bg_removal viene eseguito più lentamente ed è un po 'più complicato da usare (richiede di specificare due diversi valori fuzz). Ecco un esempio dell'output di bg_removal.
convert original.png -transparent white new.png
ma dopo averlo provato, non riesco a farlo funzionare. Per inciso, sei sicuro che il tuo sfondo sia effettivamente bianco (#FFFFFF), o è solo quasi bianco (ad esempio #FEFEFE)?