Композиция предварительно умноженных изображений с помощью ImageMagick

У меня есть два изображения. Один фон без альфы. Другой — белое облако. Альфа-изображение облака предварительно умножается на черный цвет. Когда я их комбинирую, белое облако имеет черный цвет, поэтому оно выглядит серым, а не белым, как должно быть. Я делаю:

convert -gravity Center bg.tga whitecloud.tga -composite comp.tga

Есть ли способ скомпоновать предварительно умноженные изображения в ImageMagick или изображение должно быть без предварительного умножения? Могу ли я сделать предварительно умноженное изображение без предварительного умножения с помощью ImageMagick?

Обновление:
Хорошо, вот изображения в формате TGA для скачивания:

http://acatysmoof.com/posting/problems/imagemagick/premultiplication/bg.tga http://acatysmoof.com/posting/problems/imagemagick/premultiplication/whitecloud.tga http://acatysmoof.com/posting/problems/imagemagick/premultiplication/aftereffects.tga http://acatysmoof.com/posting/problems/imagemagick/premultiplication/imagemagick.tga

и в том же порядке, что и jpg для просмотра в браузере:

bg.jpgwhitecloud.jpg aftereffects.jpgimagemagick.jpg

Я пробовал все представленные режимы, но ни один из них не дал такого же результата, как After Effects.


person whereisalext    schedule 07.03.2015    source источник


Ответы (3)


Было бы проще, если бы вы показывали свои изображения, но попробуйте добавить -compose lighten перед -composite в своей команде, например:

convert a.tga b.tga -compose lighten -composite out.tga

По сути, это заставит ImageMagick выбирать более светлый пиксель из двух изображений в каждой точке.

Если это не сработает, попробуйте другие режимы наложения.

for b in $(identify -list compose); do 
   convert -label "$b" bg.tga whitecloud.tga -compose $b -composite miff:- 
done | montage - -tile 5x out.png

введите здесь описание изображения

Я думаю, что Atop, Dissolve, SrcAtop и SrcOver могут быть вашими друзьями, но посмотрите в полный размер и посмотрите, что вам нравится. Это было бы

convert a.tga b.tga -compose Atop -composite out.tga
person Mark Setchell    schedule 07.03.2015
comment
Нет, но я действительно ценю усилия. Режимы наложения не имеют ничего общего с предварительным умножением. RGB неверен до тех пор, пока не произойдет предварительное умножение, и никакой режим наложения не исправит это. Я провел некоторое исследование, и оба Imagemagick и Graphicsmagick не поддерживают предварительно умноженную альфу. Это действительно усугубляет ситуацию, поскольку большинство профессиональных программ для 2D и 3D по умолчанию создает изображения с предварительным умножением. Все профессиональные пакеты композитинга также предполагают предварительно умноженную альфа-версию, включая After Effects, Fusion, Nuke, Harmony и т. д. Imagemagick не предлагает этого. Почему? Я пойду поспрашиваю по их спискам. - person whereisalext; 13.03.2015
comment
Хорошо, спасибо за отзыв. Если есть формула, которая может выполнять/отменять предварительное умножение, ее можно реализовать в ImageMagick с помощью оператора -fx или модуля, поэтому, если вы узнаете больше и захотите добавить примечание или ссылку позже, возможно, выработать что-нибудь. - person Mark Setchell; 13.03.2015

Вот команда Imagemagick, которая делает то, что вы хотите:

convert -gravity Center whitecloud.tga -fx "u/max(u.a, 1/255)" bg.tga +swap -composite -fx "u*u.a" comp.tga

Что тут происходит?

  1. -fx команда №1: преобразовать whitecloud.tga из предварительно умноженного альфа-канала в нормальный. Оператор max() — это особый случай, позволяющий избежать деления на ноль.
  2. Команда +swap: сделайте bg.tga первым изображением, а исправленное whitecloud.tga вторым.
  3. -composite эти два обычных изображения без предварительного умножения.
  4. -fx команда №2: взять результат и вернуться к предварительно умноженному альфа-формату.

Это дает точно такой же результат, как After Effects.

Обратите внимание, что, как я уже писал, это работает только для непрозрачного bg.tga. Вам нужно будет проделать дополнительную работу для обработки прозрачного фонового изображения.

person David Pritchard    schedule 21.09.2020

Если вы хотите дублировать результат After Effects, то я считаю, что вы хотите сделать в ImageMagick следующее: скомпоновать фоновое изображение с белым изображением, используя облако в качестве маски:

convert bg.tga \( -clone 0 -fill white -colorize 100 \) whitecloud.tga -compose over -composite cloud_blue.tga

введите здесь описание изображения

Я опубликовал результат в формате JPG, но мой результат в формате .tga такой же.

person fmw42    schedule 21.09.2020