【问题标题】:XOR-ing and Summing Two Black and White Images对两个黑白图像进行异或运算和求和
【发布时间】:2019-06-21 06:10:06
【问题描述】:

从使用 PIL 模块创建的两个图像im1im2 开始,我们有相应的黑白图像,

bw_im1 = im1.convert('1')      

bw_im2 = im2.convert('1')    

bw_im2bw_im2 的每个像素都是 0 或 256。

假设bw_im2bw_im2 的大小相同。

你如何对所有相应的条目进行异或运算,然后将它们相加 起来了吗?

我的工作

我编写了以下存根/概念证明 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

【问题讨论】:

  • 嗯?您提到的 2 张图片和 PIL 都没有出现在您的代码中?
  • @MarkSetchell 在 MyWork 下更新以使其更加清晰 - 该程序是“概念证明”。您是说最好的办法是编写一个可以“插入”的成熟程序?

标签: python image xor


【解决方案1】:

您可以像这样使用 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')

所以,如果你从这两个开始:

结果将是:

当然,如果你是物理学家,你可以这样写;-)

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

或者你可以像这样使用 Numpy 的 XOR:

#!/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

如果您使用的是 v6 或更早版本,请改用以下内容:

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

【讨论】:

  • 你能(直接)总结结果的内容:result = ImageChops.logical_xor(im1,im2)吗?尝试了sum(result),但得到了TypeError: 'Image' object is not iterable
  • 抱歉,我忘记了这一点,现在不在电脑前。您可以创建一个 Numpy 数组的结果并将其相加......类似于np.sum(np.array(result))
  • 如果图片不是黑白的,我们应该转换它们,否则我们会得到错误“ValueError:image has wrong mode”:im1 = Image.open("im1.png").convert ('1')
猜你喜欢
  • 2020-10-19
  • 2019-03-15
  • 2019-02-06
  • 2021-06-21
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多