Python 为什么元素级加法/减法的输出不同,取决于我的numpy数组是int64还是uint8类型?

Python 为什么元素级加法/减法的输出不同,取决于我的numpy数组是int64还是uint8类型?,python,numpy,Python,Numpy,我正在进行图像比较和计算差异,并且注意到,只有当我使用dtype='int64'而不是dtype='uint8'以numpy数组的形式读取数据时,元素相减似乎才起作用。出于图像可视化的原因,我想切换到“unit8” image1 = np.array(plt.imread('fixed_image.jpg'), dtype='int64')[:, :, 0:3] image2 = np.array(plt.imread('fixed_image_2.jpg'), dtype='int64')[:

我正在进行图像比较和计算差异,并且注意到,只有当我使用dtype='int64'而不是dtype='uint8'以numpy数组的形式读取数据时,元素相减似乎才起作用。出于图像可视化的原因,我想切换到“unit8”

image1 = np.array(plt.imread('fixed_image.jpg'), dtype='int64')[:, :, 0:3]
image2 = np.array(plt.imread('fixed_image_2.jpg'), dtype='int64')[:, :, 0:3]
diff = image1-image2
在上面的代码中,仅使用dtype int64正确计算差异,而不使用dtype uint8。为什么呢

uint8
表示“8位无符号整数”,并且只有0-255中的有效值。这是因为256个不同的值是使用8位数据可以表示的最大值。如果将两个uint8图像添加到一起,很可能会在某个地方溢出255个。例如:

>>> np.uint8(130) + np.uint8(131)
5
类似地,如果减去两幅图像,很可能会得到负数,这又会回到范围的高端:

>>> np.uint8(130) - np.uint8(131)
255

如果需要添加或减去这样的图像,则需要使用不会轻易下溢/溢出的数据类型(例如int64或float),然后作为最后一步进行规格化并转换回uint8

您可以通过对某些数字范围执行
diff=(image1-image2).aType('uint8')
Compare
c-c[::-1]
来解决这个问题,例如对两个数据类型执行
np.arange(0256)