XOR-IN и суммирование двух черно-белых изображений - PullRequest
0 голосов
/ 28 января 2019

Начиная с двух изображений im1 и im2, созданных с помощью модуля PIL, мы получаем соответствующие черно-белые изображения

bw_im1 = im1.convert('1')      

и

bw_im2 = im2.convert('1')    

Каждый пиксельиз bw_im2 и bw_im2 - это либо 0, либо 256.

Предположим, что bw_im2 и bw_im2 имеют одинаковый размер.

Как выполнить XOR для всех соответствующихзаписи, а затем их суммировать?

Моя работа

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

import numpy as np

M = np.zeros((2, 3))
M[0,2] = 255
M[1,0] = 255
M[1,1] = 255    
print(M)

N = np.zeros((2, 3))
N = np.zeros((2, 3))
N[0,2] = 255
N[1,1] = 255  
N[1,2] = 255
print(N)

list_M = list(M)
list_N = list(N)
xor_signal = 0
for row in range(0, len(list_M)):
    for col in range(0,len(list_M[row])):
        xor_signal = xor_signal + int(bool(list_M[row][col]) !=  bool(list_N[row][col]))

print(xor_signal)

ВЫХОД

[[  0.   0. 255.]
 [255. 255.   0.]]
[[  0.   0. 255.]
 [  0. 255. 255.]]
2

1 Ответ

0 голосов
/ 28 января 2019

Вы можете использовать PIL ImageChops следующим образом:

#!/usr/local/bin/python3
import numpy as np
from PIL import Image, ImageChops

# Open images
im1 = Image.open("im1.png")
im2 = Image.open("im2.png")

result = ImageChops.logical_xor(im1,im2)
result.save('result.png')

Итак, если вы начнете с этих двух:

enter image description here

enter image description here

Результат будет:

enter image description here

Конечно,если вы физик, вы можете написать это так; -)

#!/usr/local/bin/python3
from PIL import Image, ImageChops 
ImageChops.logical_xor(Image.open("im1.png"), Image.open("im2.png")).save('result.png')

Или вы можете использовать XOR Numpy следующим образом:

#!/usr/local/bin/python3
import numpy as np
from PIL import Image

# Open images
im1 = Image.open("im1.png")
im2 = Image.open("im2.png")

# Make into Numpy arrays
im1np = np.array(im1)*255
im2np = np.array(im2)*255

# XOR with Numpy
result = np.bitwise_xor(im1np, im2np).astype(np.uint8)

# Convert back to PIL image and save
Image.fromarray(result).save('result.png')

Вы можете суммировать пикселидобавив это в конце:

print('Sum: {}'.format(np.sum(result)))

Или вы не можете написать какой-либо Python и просто наберите следующую команду ImageMagick в свой терминал:

magick im1.png im2.png -evaluate-sequence xor result.png

Если вы используете версию 6 или более раннюю, вместо этого используйте следующее:

convert im1.png im2.png -evaluate-sequence xor result.png
...