我有两个函数,它们与int64的行为方式相同,但与uint8的工作方式不同:
A_int64 = np.array([1, 2, 3])
B_unit8 = A.astype(np.uint8)
def scale_image(image):
minv = np.amin(image)
maxv = np.amax(image)
result = (255 * (image - minv) / (maxv - minv))
return result.astype(np.uint8)
def scale_image_multiple_lines(image):
minv = np.amin(image)
maxv = np.amax(image)
image = image - minv
image = image / (maxv - minv)
image = image * 255
return image.astype(np.uint8)
print(scale_image(A_int64)) # [ 0 127 255]
print(scale_image_multiple_lines(A_int64)) # [ 0 127 255]
print(scale_image(B_unit8)) # [ 0 127 127]
print(scale_image_multiple_lines(B_unit8)) # [ 0 127 255]
不按预期工作的是print(scale_image(B_unit8)) # [ 0 127 127]
我的猜测是多行版本适用于这两种数据类型,因为它之前会进行转换。但是,因为我不相信我正在处理否定(我减去最小值但不超过这个,我不认为)为什么它会产生影响呢?
答案 0 :(得分:2)
你是对的。这也是操作的顺序。
在第一个函数中,首先乘以255,然后除以max-min。第一个在最后一个位置给出溢出 - > (0,255,254)然后我们用2进行判断并转换为uint8
第二个第一个被两个第一个(它需要一个转换为浮动),所以后续乘以255不会溢出。