Solution
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
Explanation
This is rather a bit longer than the simple answers previously given,
but it gives much better results: (1) The quality is superior due
to antialiased alpha, and (2) only the background is removed as
opposed to a single color. ("Background" is defined as approximately
the same color as the top left pixel, using a floodfill from the
picture edges.)
Additionally, the alpha channel is also eroded by half a pixel to avoid halos. Of course, ImageMagick's morphological operations don't (yet?) work at the subpixel level, so you can see I am blowing up the alpha channel to 200% before eroding.
Comparison of results
Here is a comparison of the simple approach ("-fuzz 2% -transparent
white") versus my solution, when run on the
ImageMagick logo. I've flattened
both transparent images onto a saddle brown background to make the
differences apparent (click for originals).
Notice how the Wizard's beard has disappeared in the simple approach.
Compare the edges of the Wizard to see how antialiased alpha helps the
figure blend smoothly into the background.
Of course, I completely admit there are times when you may wish to use
the simpler solution. (For example: It's a heck of a lot easier to
remember and if you're converting to GIF, you're limited to 1-bit
alpha anyhow.)
mktrans shell script
Since it's unlikely you'll want to type this command repeatedly, I
recommend wrapping it in a script. You can download a BASH shell
script from github which
performs my suggested solution. It can be run on multiple files in a
directory and includes helpful comments in case you want to
tweak things.
bg_removal script
By the way, ImageMagick actually comes with a script called
"bg_removal"
which uses floodfill in a similar manner as my solution. However, the
results are not great because it still uses 1-bit alpha. Also, the
bg_removal script runs slower and is a little bit trickier to use (it
requires you to specify two different fuzz values). Here's an example of the output from bg_removal.
convert original.png -transparent white new.png
but upon trying it, can't get it to work. As an aside, are you sure your background is actually white (#FFFFFF), or is it just almost-white (e.g. #FEFEFE)? – Veta