为什么在python中使用dtype='<i2'时Min-Max归一化会产生不准确的结果
我正在处理一张X光图像,想要对这张图像进行最小-最大归一化,也就是把图像中的值调整到[0,1]的范围,以便后续处理。下面是我为这个任务写的函数。
def MinMaxNormalize(array):
return (array - np.amin(array))/(np.amax(array) - np.amin(array))
这个函数在其他类型的数据上运行得很好,但不知为什么,当我用dtype= '<i2'
类型的图像时,结果却很奇怪。我使用这种数据类型是根据制造商提供的手册来做的。我加载图像的方式是:
datasetpath = 'folder_path/'
imagepath = 'Image_folder/'
image_name = 'Fish.raw'
# Specify the dimensions of your image
width = 4096 # specify width of the image
height = 4096# specify height of the image
# Read raw image data
with open(datasetpath + imagepath + image_name, "rb") as f:
raw_data = np.fromfile(f, dtype='<i2', count=width*height)
# Reshape raw data to match image dimensions
imarray = np.array(raw_data.reshape((height, width)))
image_norm = MinMaxNormalize(imarray)
图像加载得很好,但归一化后却产生了[-130,130]的值,并且我收到了以下警告:
RuntimeWarning: overflow encountered in scalar subtract
return (array - np.amin(array))/(np.amax(array) - np.amin(array))
我尝试手动处理每个值,但当我执行这段np.amax(array) - np.amin(array)
时,依然收到相同的警告,并且得到的数字也不准确。不过,如果我使用原始的数值,就没有问题。有人能告诉我我遗漏了什么或者做错了什么吗?
1 个回答
1
你的数组是16位有符号整数类型。就像这样:
array = np.array([-30000, 0, 30000], dtype=np.int16)
当你现在计算
np.amax(array) - np.amin(array)
时,你是在减去两个16位整数,这样又会得到一个16位整数:
<stdin>:1: RuntimeWarning: overflow encountered in scalar subtract
-5536
因为30000加30000的结果放不进一个有符号的16位整数里,所以在这个操作中会出现溢出。结果变成了一个没有意义的-5536。
因为你想要生成一个浮点图像(没有整数类型可以包含归一化到[0,1]的数据),你最简单的方法(也许是最有效的)是先把数组转换成浮点格式:
array = array.astype(np.float32)
现在你可以使用就地操作符来进行归一化:
array -= np.amin(array)
array /= np.amax(array)