为什么在 dtype=' 中使用最小-最大归一化会产生不准确的结果<i2' in python

问题描述 投票:0回答:1

我正在处理 X 射线图像,我正在尝试对图像进行最小-最大归一化,以在 [0,1] 之间切换图像中的值范围,以进行进一步处理。以下是我为此任务创建的函数。

def MinMaxNormalize(array):
    return (array - np.amin(array))/(np.amax(array) - np.amin(array))

该函数适用于任何其他类型的数据,但由于某种原因,在使用 dtype= ' 的图像时会产生奇怪的结果

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] 范围内,我收到以下警告:

运行时警告:标量减法遇到溢出 返回(数组 - np.amin(数组))/(np.amax(数组) - np.amin(数组))

我尝试手动处理每个值,但是当我执行这部分“np.amax(array) - np.amin(array)”时,我得到相同的警告和不准确的数字,但如果我使用原始数值没有问题。有人可以向我解释我错过了什么或做错了什么吗?

python image image-processing normalization
1个回答
0
投票

您的数组是 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)
© www.soinside.com 2019 - 2024. All rights reserved.