Mkay, я удивил себя здесь, и я думаю, что нашел ответ. Это четыре команды ImageMagick, хотя, может быть, их можно как-то объединить ... хотя я в этом сомневаюсь.
convert input_on_white.png -channel RGB -negate /tmp/convert_negative.png && \
convert input_on_black.png /tmp/convert_negative.png -alpha Off -compose Plus -composite /tmp/convert_alpha.png && \
composite plasma2.png /tmp/convert_alpha.png -alpha Off -channel RGB -compose Divide /tmp/convert_division.png && \
convert /tmp/convert_division.png /tmp/convert_alpha.png -compose CopyOpacity -composite plasma_output.png
(Очевидно, когда это будет сделано, очистите эти временные файлы. Кроме того, используйте реальную систему временных файлов вместо жестко закодированных путей.)
Стратегия заключается в том, чтобы сначала создать изображение в градациях серого, представляющее альфа-маску. Мы будем эмулировать строку кода alpha = pixel_on_black.red - pixel_on_white.red + MAX_VALUE
, которую можно переписать как alpha = pixel_on_black.red + (MAX_VALUE - pixel_on_white.red)
.
Итак, строка 1: мы создаем изображение, представляющее второй член этого уравнения, отрицательную версию RGB-каналов изображения на белом. Мы сохраняем его как временный файл.
Затем, строка 2: мы хотим добавить это негативное изображение к изображению на черном. Используйте композицию ImageMagick's Plus и сохраните ее как временную альфа-маску. В результате получается изображение в градациях серого, где белый представляет области, которые должны иметь непрозрачность 100% в конечном изображении, а черный представляет области, которые впоследствии будут полностью прозрачными.
Затем, строка 3: вернуть изображение на черном цвете к исходным цветам RGB. Поскольку изображение на черном было создано путем наложения каналов RGB на альфа-отношение, мы делим изображение альфа-маски, чтобы отменить этот эффект.
Наконец, строка 4: возьмите изображение с цветовой коррекцией из строки 3 и примените альфа-маску из строки 2, используя функцию композиции ImageOagick CopyOpacity. Та да!
Моя оригинальная стратегия заняла где-то 5-10 секунд. Эта стратегия занимает меньше секунды. Намного, намного, намного лучше.
Неудивительно, что просьба о помощи - вот что заставило меня найти ответ самому. В любом случае, я оставлю этот вопрос открытым на 48 часов, чтобы посмотреть, найдет ли кто-нибудь чуть более оптимальное решение. Спасибо!