К сожалению, в отличие от вашего предыдущего вопроса о значках, есть много способов приблизиться к удалению фона с более сложными изображениями ... поэтому не может быть единственного "хорошего" решения. Тем не менее, для приведенного вами примера, вот несколько подходов, которые могут быть более удовлетворительными.
Хотя я даю свои предложения ниже, вероятно, есть гораздо лучшие способы сделать то, о чем я сейчас не знаю. Пожалуйста, прости любые ошибки, упущения или вещи, которые я мог упустить из виду. знак равно
Простая одноцветная прозрачность
Чтобы преобразовать один цвет (например, фон) в прозрачный, вы можете использовать:
convert fox.jpg -transparent white fox_transparent.png
Однако это приводит к тем же результатам, что и ваш плохой имидж, что нежелательно:
ех. fox_transparent
Это потому, что области белого цвета (выше) не совсем белые (они не совсем белые, в основном из-за сглаживания, как вы заметили). Чтобы исправить это, одним из возможных вариантов является использование -fuzz для выбора пикселей, которые почти (почти) белого цвета:
convert fox.jpg -fuzz 11% -transparent white fox_transparent_fuzzed.png
Это дает лучшие результаты:
ех. fox_transparent_fuzzed
Лучшие края (?)
Хотя простое использование -fuzz
может работать достаточно хорошо, все же может возникнуть нежелательная шероховатость:
ех. fox_transparent_fuzzed - Rough Edges
Чтобы решить эту проблему, мы можем использовать маску, которая была размыта, чтобы помочь смягчить края изображения. Чтобы сделать это за один шаг, мы можем взять некоторый код из этого сообщения на форуме и использовать его так:
convert fox.jpg ( -clone 0 -fuzz 11% -transparent white -blur 0x1 ) -compose copy_opacity -composite fox_transparent_fuzzed_blurry_mask.png
Эта команда создает размытую маску, которая затем комбинируется с исходным изображением. Это результат:
ех. fox_transparent_fuzzed_blurry_mask
Вы можете видеть, что края теперь мягче:
При необходимости мы можем сделать нечто подобное в два этапа:
convert fox.jpg -type Grayscale -negate -fill white -fuzz 11% +opaque "#000000" -blur 0x1 fox_blur_mask.jpg convert fox.jpg fox_blur_mask.jpg -compose copy_opacity -composite fox_transparent_blur_mask_result.png
Первая команда:
Создает черно-белую версию изображения (
-type Grayscale
).(Эффективно) инвертирует цвета для маскировки ( -negate ).
Используется,
-fill white -fuzz 11% +opaque "#000000"
чтобы залить голову лисы белым (чтобы мы могли видеть большую часть исходного изображения).Применяет свет
-blur 0x1
к изображению.
Это созданная маска, в которой все черное становится прозрачным на конечном изображении:
ех. fox_blur_mask
Вторая команда просто комбинирует исходное изображение и маску вместе, чтобы получить этот результат:
ех. fox_transparent_blur_mask_result
Вы заметите, что результат почти идентичен приведенному ранее примеру «все вместе»:
Предостережения
Как уже отмечалось, приведенные предложения - не единственные способы достижения цели, и могут быть альтернативные / лучшие версии данных команд.
В этих примерах предполагается, что в исходном изображении нет прозрачности. Если есть, возможно, вам придется использовать различные опции / команды. Аналогично, эти предложения были протестированы только с файлами .jpg в качестве формата ввода и файлами .png в качестве формата вывода.
Основным недостатком
-fuzz
является то, что его трудно применять последовательным способом.-fuzz 11%
это то, что лучше всего подходит для примера изображения.-fuzz 10%
илиfuzz 12%
, скорее всего, оставит нежелательные случайные пиксели. Другие-fuzz
значения, вероятно, будут необходимы для других изображений.Эти предложения не касаются каких-либо подходов к сохранению определенных частей изображения того же цвета, что и фон (например, белые глаза лисы). Для этого вы, скорее всего, захотите либо A) изменить маску в последнем примере, либо B) если вы хотите что-то наподобие второго примера сверху, используйте
convert fox.jpg -bordercolor white -border 1x1 -fuzz 11% -fill none -floodfill +0+0 white -shave 1x1 fox_flood_2_minimal.png
Обратите внимание, что приведенная выше команда была скопирована с уже предоставленной маскирующей ссылки.