首页 > 解决方案 > PIL.ImageChops.subtract 和首先转换为 numpy 数组然后减去它们有什么区别?

问题描述

所以我想用 Pillow从Image1中减去Image2 。我首先尝试通过将它们转换为 numpy 数组,减去它们然后将数组转换回图像来做到这一点。但这给了我很奇怪的行为st很大一部分差异图片变成了白色。我发现我可以直接使用 PIL.IamgeChops.subtract 做同样的事情,效果很好,但我想了解为什么数组方式不起作用。 这是我的代码:

import os.path
from PIL import Image, ImageShow, ImageChops

root = os.path.abspath(os.path.curdir)

Image1 = Image.open(
    root + "\\Messwerte\\Messungen_20_11\\AOM_Copy\\1.bmp"
).convert("L")

Image2 = Image.open(
    root + "\\Messwerte\\Messungen_20_11\\B Feld Abh\\hintergrund_B_3.bmp"
).convert("L")

DiffImage = ImageChops.subtract(Image1, Image2)  #this way works perfectly
DiffImage.show()
DiffImageArray = np.array(DiffImage)

arr1 = np.array(Image1)
arr2 = np.array(Image2)
diff = arr1 - arr2   #this doesn't work
Image.fromarray(diff).show()

print(np.max(DiffImageArray)) #this gives me 77
print(np.max(diff))  # and this 255

我还检查了错误不在于从数组转换为 Image 对象。

标签: pythonarraysnumpypython-imaging-library

解决方案


这是因为图像的类型unit8以及当您进行减法时,任何负值都会被圈回至 255,因为数据格式无法处理负整数。也就是说,7-8将存储为 255 而不是 -1,7-9将是 254 而不是 -2,依此类推。您将需要更大的数据类型,并且您还需要将减法结果的绝对值(或根据用例将负值剪辑为零)而不是简单的减法。

你可以通过简单地解决这个问题

arr1 = np.array(Image1).astype(np.int32)
arr2 = np.array(Image2).astype(np.int32)
diff = np.abs(arr1 - arr2)

当您创建数组时。


推荐阅读