Python 为什么PIL.ImageChops.difference和np.array difference有不同的结果?

Python 为什么PIL.ImageChops.difference和np.array difference有不同的结果?,python,python-imaging-library,Python,Python Imaging Library,为什么PIL.ImageChops.difference和np.array绝对差有不同的结果?枕头文件说ImageChops.difference的作用就像绝对差异() 结果(顶部:1,底部:2): 有趣的是,如果我将diff转换为np.array,然后再对对象进行图像处理,它会显示为#1。我遇到了类似的问题。解决方案非常简单,转换后的numpy数组的数据类型为uint8。通过减去较大的值,位将完全翻转,得到一些奇怪的结果 因此,解决方案是将图像转换为具有适当范围的数据类型,如int8 im

为什么PIL.ImageChops.difference和np.array绝对差有不同的结果?枕头文件说ImageChops.difference的作用就像绝对差异()

结果(顶部:1,底部:2):


有趣的是,如果我将
diff
转换为np.array,然后再对对象进行图像处理,它会显示为#1。

我遇到了类似的问题。解决方案非常简单,转换后的numpy数组的数据类型为
uint8
。通过减去较大的值,位将完全翻转,得到一些奇怪的结果

因此,解决方案是将图像转换为具有适当范围的数据类型,如
int8

img1=np.array(tamp_image,dtype='int8')
img2=np.array(原始图像,dtype='int8')
差异=np.abs(img1-img2)
Image.fromarray(np.array(diff,dtype='uint8')).show()

数组的组成部分很可能是无符号8位整数,因此从较小的值中减去较大的值将导致环绕。对结果应用
abs()
完全没有任何作用,无符号类型中不可能有负值
ImageChops.difference()
显然在中间结果中使用了更大的有符号类型来避免这个问题(至少在理论上,可能有一些聪明的技巧可以完全使用8位值进行操作)。请看一看,例如,
np.array([1,127,255],dtype=np.uint8)-np.array([255,128,1],dtype=np.uint8)
,您将看到可能出现的问题。您可以发布原始图像,以便我们重现问题吗?
tamp_image = Image.open(tamp_file_path).convert("RGB")
orig_image = Image.open(orig_file_path).convert("RGB")
diff = ImageChops.difference(orig_image, tamp_image)
diff.show() #1
Image.fromarray(abs(np.array(tamp_image)-np.array(orig_image))).show() #2