python - 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 对象。
解决方案
这是因为图像的类型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)
当您创建数组时。
推荐阅读
- eclipse - 安装 Eclipse 时出现“NLS 丢失消息”错误
- reactjs - 在 TextInput 中忽略子项的 onPress
- excel - Convert stock transactions into daily holdings in Excel
- javascript - using uibModal in angularJS v1.48 applcation
- dart - Dart - Hide method from parent class / call private method from parent class
- javascript - handle find property in array if undefined
- javascript - Uncaught TypeError: downloadButton is null
- javascript - Change List of objects in position using map for Reactjs
- python - Pytest在导入模块时需要指定文件夹项目
- python - 如何使用 Python 和 Selenium 将多个文件上传到网站?