Python PIL - функция для разделения смешанных двух изображений?

РЕДАКТИРОВАТЬ: Код теперь работает, спасибо Марку и Зефиру. У zephyr также есть два альтернативных рабочих решения ниже.

Я хочу разделить смешивание двух изображений с помощью PIL. Я нашел ImageChops.multiply (image1, image2) , но не смог найти аналогичную функцию Divide (image, image2) .

Объяснение режима смешивания Divide (I Я использовал первые два изображения в качестве тестовых источников.)

Есть ли встроенная функция смешивания с разделением, которую я пропустил (PIL или иначе)?

Мой тестовый код, приведенный ниже, выполняется и приближается к тому, что я находясь в поиске. Результирующее изображение на выходе аналогично приведенному здесь в качестве примера изображения с разделением наложения: Объяснение режима смешивания с разделением .

Есть ли более эффективный способ выполнить операцию слияния с разделением (меньше шагов и быстрее)? Сначала я попытался использовать лямбда-функции в Image.eval и ImageMath.eval , чтобы проверить наличие черных пикселей и преобразовать их в белые во время процесса деления, но мне не удалось получить ни то, ни другое для получения правильного результата.

РЕДАКТИРОВАТЬ: Исправлен код и сокращен благодаря Марку и Зефиру. Результирующий вывод изображения совпадает с выводом решений zephyr numpy и scipy ниже.

# 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')

7
задан moski 9 April 2011 в 17:19
поделиться