imagemagick: как изменить цвет фона изображения с помощью сглаживания

1870
dengApro

лиса

Я хочу оставить только лису. То есть изменить белый цвет фона изображения на прозрачный с помощью imagemagick.

Сглаживание неразрешимо, край изображения - пилообразный.

Я попробовал это.

Вот код:

convert fox.jpeg -alpha set -channel RGBA \ -fill none -opaque white fox_one.jpeg   convert fox.jpeg -matte -fill none \ -draw 'color 0,0 replace' fox_two.jpeg 

Оба потерпели неудачу с этим

imagemagick: как изменить цвет фона изображения с помощью сглаживания

Я сделал это в соответствии с color_basics / # replace .

Любые более точные документы рекомендуется? И как это исправить?

1

1 ответ на вопрос

1
Anaksunaman

К сожалению, в отличие от вашего предыдущего вопроса о значках, есть много способов приблизиться к удалению фона с более сложными изображениями ... поэтому не может быть единственного "хорошего" решения. Тем не менее, для приведенного вами примера, вот несколько подходов, которые могут быть более удовлетворительными.


Хотя я даю свои предложения ниже, вероятно, есть гораздо лучшие способы сделать то, о чем я сейчас не знаю. Пожалуйста, прости любые ошибки, упущения или вещи, которые я мог упустить из виду. знак равно


Простая одноцветная прозрачность

Чтобы преобразовать один цвет (например, фон) в прозрачный, вы можете использовать:

convert fox.jpg -transparent white fox_transparent.png 

Однако это приводит к тем же результатам, что и ваш плохой имидж, что нежелательно:

ех. fox_transparent

fox_transparent_nofuzz

Это потому, что области белого цвета (выше) не совсем белые (они не совсем белые, в основном из-за сглаживания, как вы заметили). Чтобы исправить это, одним из возможных вариантов является использование -fuzz для выбора пикселей, которые почти (почти) белого цвета:

convert fox.jpg -fuzz 11% -transparent white fox_transparent_fuzzed.png 

Это дает лучшие результаты:

ех. fox_transparent_fuzzed

fox_transparent_fuzzed


Лучшие края (?)

Хотя простое использование -fuzzможет работать достаточно хорошо, все же может возникнуть нежелательная шероховатость:

ех. fox_transparent_fuzzed - Rough Edges

fox_transparent_fuzzed_jaggies

Чтобы решить эту проблему, мы можем использовать маску, которая была размыта, чтобы помочь смягчить края изображения. Чтобы сделать это за один шаг, мы можем взять некоторый код из этого сообщения на форуме и использовать его так:

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

fox_transparent_fuzzed_blurry_mask

Вы можете видеть, что края теперь мягче:

fox_transparent_fuzzed_nojaggies

При необходимости мы можем сделать нечто подобное в два этапа:

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_blur_mask

Вторая команда просто комбинирует исходное изображение и маску вместе, чтобы получить этот результат:

ех. fox_transparent_blur_mask_result

fox_transparent_blur_mask_result

Вы заметите, что результат почти идентичен приведенному ранее примеру «все вместе»:

fox_transparent_fuzzed_blurry_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 
  • Обратите внимание, что приведенная выше команда была скопирована с уже предоставленной маскирующей ссылки.

Довольно доволен. Я разработчик iOS. Я хочу знать OX, особенно OS X. Поэтому я пробую что-то интуитивное. Я не знаю, как задавать вопросы, как профессионал или правильно. dengApro 6 лет назад 0
Думаю, любопытство - замечательная черта. Кто-то никогда не узнает правильные вопросы, если они вообще не задают. =) В любом случае, я рад, что это было полезно. Удачи! знак равно Anaksunaman 6 лет назад 1

Похожие вопросы