2017-07-16 20 views
2

我正在做图像比较和计算差异,并已注意到,元素明智减法似乎只有在我读取数据为dtype ='int64'的numpy数组而不是dtype ='uint8'时才起作用。出于图像可视化的原因,我想切换到'unit8'。为什么元素明智的加法/减法的输出取决于我的numpy数组是int64还是uint8?

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正确计算diff,而不能用dtype uint8正确计算diff。这是为什么?

+0

你可以用'diff =(image1-image2).astype('uint8')' –

+0

比较'cc [:: - 1]'来解决某些范围的数字,比如'np.arange(0,256 )'为2 dtypes。 – hpaulj

回答

2

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

>>> np.uint8(130) + np.uint8(131) 
5 

同样,如果你减去两个图像,你很可能得到负数 - 这得到缠到范围的高端重:

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

如果您需要要添加或减去这样的图像,您需要使用不会像溢出/溢出那样容易下溢的dtype(例如int64或float),然后将其归一化并转换回uint8作为最后一步。

相关问题