Средний цвет изображения без прозрачности с помощью Imagemagick - PullRequest
0 голосов
/ 06 декабря 2018

Используя интерфейс командной строки IM, я пытаюсь получить средний цвет изображения для изображения, исключая любые прозрачные пиксели.Обычно используемый -resize 1x1 info:- в этом случае бесполезен, поскольку очевидно, что прозрачные пиксели будут влиять на результат (и в некоторых случаях у вас будет полностью прозрачный пиксель)

Мой запасной вариант сейчас извлекает их, используя -define histogram:unique-colors=true -format %c histogram:info:- и вручную исключая прозрачные, но это кажется сложным для того, что IM может уже предоставить.

1 Ответ

0 голосов
/ 06 декабря 2018

В ImageMagick вы можете получить средний (средний) цвет без учета прозрачности на

convert image -scale 1x1! -alpha off -format "%[pixel:u.p]" info:

Пример:

convert logo: -transparent white -scale 1x1! -alpha off -format "%[pixel:u.p]\n" info:

srgb(100,81,99)


Если вы используете ImageMagick 7, тогда замените конвертацию магией.

ДОПОЛНЕНИЕ: Вот долгий путь.Вычислите среднее значение каждого канала изображения.Вычислите среднее значение альфа-канала.Затем разделите.

convert logo: -transparent white logot.png
convert logot.png -alpha extract mask.png

declare `convert logot.png -alpha remove -format "IR=%[fx:mean.r]\nIG=%[fx:mean.g]\nIB=%[fx:mean.b]\n" info:`
echo "IR=$IR; IG=$IG; IB=$IB"
IR=0.0651798; IG=0.0529989; IB=0.0641607

MM=`convert mask.png -format "%[fx:mean]\n" info:`
echo "MM=$MM"
MM=0.165872

convert xc: -format "srgb(%[fx:round(255*$IR/$MM)],%[fx:round(255*$IG/$MM)],%[fx:round(255*$IB/$MM)])\n" info:
srgb(100,81,99)


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...