РЕДАКТИРОВАТЬ: Код работает сейчас, благодаря Марку и зефиру. Зефир также имеет два альтернативных рабочих раствора ниже.
Я хочу разделить смесь двух изображений с PIL. Я нашел ImageChops.multiply(image1, image2)
, но не смог найти похожую функцию divide(image, image2)
.
Объяснение режима разделения наложения (я использовал первые два изображения здесь в качестве моих тестовых источников.)
Есть ли встроенная функция разделения, которую я пропустил (PIL или иначе)?
Мой тестовый код ниже запускается и приближается к тому, что я ищу. Вывод результирующего изображения аналогичен приведенному здесь изображению примера разделения наложения: Объясненный режим разделения наложения .
Есть ли более эффективный способ выполнить эту операцию разделения на доли (меньше шагов и быстрее)? Сначала я попытался использовать лямбда-функции в Image.eval
и ImageMath.eval
для проверки черных пикселей и перевернуть их на белый во время процесса деления, но я не смог получить ни одного, чтобы получить правильный результат.
EDIT: исправлен код и сокращен благодаря Марку и зефиру. Вывод полученного изображения совпадает с выводом приведенных ниже решений зефира и змеи.
# PIL Divide Blend test
import Image, os, ImageMath
imgA = Image.open('01background.jpg')
imgA.load()
imgB = Image.open('02testgray.jpg')
imgB.load()
# split RGB images into 3 channels
rA, gA, bA = imgA.split()
rB, gB, bB = imgB.split()
# divide each channel (image1/image2)
rTmp = ImageMath.eval("int(a/((float(b)+1)/256))", a=rA, b=rB).convert('L')
gTmp = ImageMath.eval("int(a/((float(b)+1)/256))", a=gA, b=gB).convert('L')
bTmp = ImageMath.eval("int(a/((float(b)+1)/256))", a=bA, b=bB).convert('L')
# merge channels into RGB image
imgOut = Image.merge("RGB", (rTmp, gTmp, bTmp))
imgOut.save('PILdiv0.png', 'PNG')
os.system('start PILdiv0.png')