Решение
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
Объяснение
Это немного длиннее, чем простые ответы ранее,
но это дает намного лучшие результаты: (1) качество выше из-за
для сглаженного альфа, и (2) только фон удаляется как
в отличие от одного цвета. («Фон» определяется как приблизительно
того же цвета, что и верхний левый пиксель, используя заливку из
края изображения.)
Кроме того, альфа-канал также размыт на полпикселя, чтобы избежать ореолов. Конечно, морфологические операции ImageMagick (пока?) Не работают на уровне субпикселей, поэтому вы можете видеть, что я увеличиваю альфа-канал до 200%, прежде чем разрушить.
Сравнение результатов
Вот сравнение простого подхода ("-fuzz 2% -прозрачный
белый ") по сравнению с моим решением, когда запустить на
Логотип ImageMagick . Я сгладил
оба прозрачных изображения на седло-коричневый фон, чтобы сделать
очевидные различия (нажмите для просмотра оригиналов).
![Antialiased alphachannel and floodfill looks much better](https://i.imgur.com/Exrm0tD.png)
Обратите внимание, как борода Волшебника исчезла при простом подходе.
Сравните края Волшебника, чтобы увидеть, как сглаженная альфа помогает
фигура плавно сливается с фоном.
Конечно, я полностью признаю, что иногда вы можете использовать
более простое решение. (Например: чертовски много проще
помните, и если вы конвертируете в GIF, вы ограничены 1-битным
альфа во всяком случае.)
сценарий оболочки mktrans
Поскольку вряд ли вы захотите набрать эту команду несколько раз, я
рекомендуем обернуть его в скрипт. Вы можете скачать оболочку BASH
скрипт от github который
выполняет мое предложенное решение. Он может быть запущен на нескольких файлах в
каталог и содержит полезные комментарии на случай, если вы хотите
подправить вещи.
bg_removal script
Кстати, ImageMagick на самом деле поставляется со скриптом под названием
"bg_removal"
который использует заливку таким же образом, как мое решение. Тем не менее
результаты не велики, потому что он все еще использует 1-битную альфа. Так же
Скрипт bg_removal работает медленнее и его немного сложнее использовать (он
требует, чтобы вы указали два разных значения fuzz). Вот пример вывода из bg_removal.
![The bg_removal script: has beard, but lacks antialiasing](https://i.imgur.com/BYb8rxR.png)