Это ответ Pure PIL на ваш вопрос.
Чтобы получить разницу между двумя изображениями: -
from PIL import Image, ImageChops, ImageEnhance
img1 = Image.open(r"base.png")
img2 = Image.open(r"light.png")
diff = ImageChops.difference(img2, img1)
ImageChops.difference()
принимает два объекта изображения в качестве аргументов, ивозвращает абсолютную величину попиксельной разницы между ними.Короче говоря, он вычисляет разницу между двумя изображениями .
ВЫХОД diff.show()
: -
Теперь, поскольку мы теперь получили точки различия обоих изображений, теперь мы можем создать составное изображение из diff изображения и исходного base image
Добавление этой строки кода к предыдущему коду: -
overlaid_img1 = Image.blend(img1, diff, 0.5)
Image.blend()
принимает в качестве аргумента два объекта изображения и порог и создает новое изображение путем интерполяции между двумявходные изображения, используя постоянную альфа (пороговый аргумент)Вывод руководствуется формулой: -
image1 * (1.0 - альфа) + image2 * альфа
Где image1 & image2 - объекты изображения, а alpha - порог,Поскольку мы используем 0.5
в качестве порогового значения, формула меняется на: -
(image1 * 0.5) + (image2 * 0.5)
Это означает, чтомы берем половину значения цвета image1 (base) и половину image2 (diff).Поскольку разностное изображение (diff) содержало в основном черные пиксели, из-за этого значение яркости цветных пикселей нашего базового изображения уменьшается вдвое (или становится темнее, чем раньше).
ВЫХОД overlaid_img1.show()
: -
Теперь, чтобы пиксели базового изображенияЧтобы получить исходные значения яркости, нам нужно удвоить яркость в выходном изображении, полученном с помощью Image.blend()
.
Добавление этой строки к исходному коду: -
bright_overlay_img1 = ImageEnhance.Brightness(overlaid_img1).enhance(2.0)
ImageEnhance.Brightness()
являетсякласс, используемый для регулировки яркости изображения.ImageEnhance.Brightness.enhance()
- это функция, используемая для этого.
, что enhance(2.0)
сделал, это то, что он удвоил значение яркости каждого пикселя в overlaid_img1
объекте изображения.
ВЫХОД bright_overlay_img1.show()
: -
PS: - Исходный код, создается путем добавления всехпредоставил код в ответе.Я сегментировал исходный код, чтобы я мог объяснить работу каждой функции и причины этого.Так что для полноценной работы просто добавьте каждый код, указанный в ответе.
РЕДАКТИРОВАТЬ: -
Только что увидел ваши комментарии к ответу @ fmw42, получаетсяВыяснилось, что ваше требование отличается от вашего вопроса.
Из того, что я понял, вам нужно, чтобы diff
(изображение, сохраняющее разницу обоих изображений) в формате, который поддерживает альфа (прозрачность), а не полностью черное изображение.
Для этого используйте этот код: -
# This is the full code
from PIL import Image, ImageChops, ImageEnhance
img1 = Image.open(r"base.png")
img2 = Image.open(r"light.png")
diff = ImageChops.difference(img2, img1).convert("RGBA")
pixels = diff.load()
for x in range(diff.size[0]):
for y in range(diff.size[1]):
if pixels[x, y] == (0, 0, 0, 255):
pixels[x, y] = (0, 0, 0, 0)
diff.save("alpha_difference.png") # saving the difference image (having alpha channel)
overlaid_img1 = Image.blend(img1.convert("RGBA"), diff, 0.5)
bright_overlay_img1 = ImageEnhance.Brightness(overlaid_img1).enhance(2.0).convert("RGB")
Чем вышеупомянутый код отличается от того, который я упоминал ранее, так это то, что он преобразует разностное изображение diff
в изображение альфа-канала, куда он превратитсяпрозрачный пиксель, если он будет иметь полностью черный цвет (без различий с исходным изображением).
разностное изображение (с альфа-каналом): -
Выходы обоих фрагментов кода будут одинаковыми.
PS: - Я бы порекомендовал вам изменитьназвание / описание вопроса и четко изложите свою проблему там.