получить альфа, вычитая два изображения с разным фоном - PullRequest
5 голосов
/ 14 июля 2011

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

Моя идея заключается в том, что если я отрендерю изображение с черным фоном , а другое с белым , то я могу вычесть эти изображения друг от друга и получить альфа-канал . Но это всего лишь теория, я не знаю, как это сделать на практике и что, если существуют какие-либо стандартные методы / алгоритмы для извлечения альфа-информации из двух изображений путем вычитания их друг от друга.

Я бы хотел использовать программу командной строки (или очень простую в использовании библиотеку на C ++ ) для этой обработки. Ранее я использовал convert.exe из ImageMagick, но я никогда не использовал другие утилиты в ImageMagick.

Есть ли кто-нибудь, кто может порекомендовать мне, как это сделать на практике? То, что я ищу, - это какое-то решение для командной строки или библиотека C ++ с понятными примерами файлов, которые могут это сделать.

Обновление : Мои фоны созданы компьютером, сплошные цвета. Так что я могу установить его на 0,0,0 черного цвета. Вот пример.

sample image

1 Ответ

7 голосов
/ 14 июля 2011

это может быть достаточно хорошим, если ваш объект достаточно отличается от фона, но это выглядит так, как будто оно точно , что вы просили

РЕДАКТИРОВАТЬ: второй заканчивается этой командной строкой (замените материал в <> на ваши изображения)

  convert <image1> <image2> -alpha off \
          \( -clone 0,1 -compose difference -composite \
             -separate -evaluate-sequence max -auto-level -negate \) \
          \( -clone 0,2 -fx "v==0?0:u/v-u.p{0,0}/v+u.p{0,0}" \) \
          -delete 0,1 +swap -compose Copy_Opacity -composite \
          <output>

Вам нужно будет использовать формат, который поддерживает альфа на выходе, но это, вероятно, то, что вы хотите в любом случае. (ПРИМЕЧАНИЕ: я на самом деле не пробовал это для себя, поэтому он может не работать с последними версиями imagemagick, так как я не думаю, что документация всегда актуальна)

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

  convert <image1> <image2> -alpha off \
          \( -clone 0,1 -compose difference -composite -negate \) \
          \( -clone 0,2 +swap -compose divide -composite \) \
          -delete 0,1 +swap -compose Copy_Opacity -composite \
          <output>
...