К сожалению, в отличие от вашего предыдущего вопроса о значках, есть много способов приблизиться к удалению фона с более сложными изображениями ... поэтому не может быть единственного "хорошего" решения. Тем не менее, для приведенного вами примера, вот несколько подходов, которые могут быть более удовлетворительными.
Хотя я даю свои предложения ниже, вероятно, есть гораздо лучшие способы сделать то, о чем я сейчас не знаю. Пожалуйста, прости любые ошибки, упущения или вещи, которые я мог упустить из виду. знак равно
Простая одноцветная прозрачность
Чтобы преобразовать один цвет (например, фон) в прозрачный, вы можете использовать:
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
Обратите внимание, что приведенная выше команда была скопирована с уже предоставленной маскирующей ссылки.