预处理之归一化和标准化

公式

归一化和标准化是两个不同的数据预处理技术。

归一化是将数据缩放到特定的范围,通常是将数据映射到0和1之间。这可以通过以下公式实现:

标准化是将数据转换为具有零均值和单位方差的分布。这可以通过以下公式实现:

其中,x 是原始数据,mean(x) 是数据的平均值,std(x) 是数据的标准差。

对于遥感影像处理,归一化和标准化可以用于将像素值映射到特定的范围或调整像素值的分布。

例子

一维数据:

当涉及到归一化和标准化数据时,Python的NumPy库提供了方便的函数和方法。以下是使用NumPy库进行归一化和标准化的示例代码:

import numpy as np

# 原始数据
data = np.array([2, 5, 10, 8, 12])

# 归一化
normalized_data = (data - np.min(data)) / (np.max(data) - np.min(data))
print("Normalized data:", normalized_data)

# 标准化
standardized_data = (data - np.mean(data)) / np.std(data)
print("Standardized data:", standardized_data)

输出:

Normalized data: [0.  0.25 0.625 0.375 1.]
Standardized data: [-1.26491106 -0.63245553  0.63245553  0.12649111  1.13841195]

在这个示例中,我们首先定义了一个包含一些原始数据的NumPy数组。然后,我们使用NumPy的np.minnp.max函数计算数据的最小值和最大值。通过将最小值减去数据并将其除以最大值和最小值之间的差异,我们实现了归一化。使用NumPy的np.meannp.std函数,我们计算了数据的平均值和标准差。通过将数据减去平均值并除以标准差,我们实现了标准化。

二维数据(图像)

对于二维数据,例如图像数据,归一化和标准化的过程与一维数据类似,只是要对每个维度(通道)进行操作。以下是使用NumPy库对二维图像数据进行归一化和标准化的示例代码:

import numpy as np

# 原始图像数据
image = np.array([[50, 100, 150],
                  [75, 125, 175],
                  [25, 75, 125]])

# 归一化
normalized_image = (image - np.min(image)) / (np.max(image) - np.min(image))
print("Normalized image:")
print(normalized_image)

# 标准化
mean = np.mean(image)
std = np.std(image)
standardized_image = (image - mean) / std
print("Standardized image:")
print(standardized_image)

输出:

Normalized image:
[[0.         0.5        1.        ]
 [0.25       0.625      0.875     ]
 [0.08333333 0.41666667 0.70833333]]
Standardized image:
[[-1.22474487 -0.40824829  0.40824829]
 [-0.81649658 -0.20412415  0.20412415]
 [-1.63299316 -0.81649658 -0.20412415]]

在这个示例中,我们定义了一个3x3的二维图像数据(灰度图像),其中每个元素表示像素值。我们使用相同的归一化和标准化公式,但是对每个像素进行操作。归一化后的图像数据将像素值映射到0和1之间,而标准化后的图像数据具有零均值和单位方差。

请注意,如果图像具有多个通道(例如RGB图像),则需要对每个通道分别进行归一化和标准化。这意味着需要对每个通道的像素值进行相应的计算。

遥感图像中的归一化

遥感图像的像素值通常存储为16-bit(即每个像素值的范围为0到65535)。然而,有时我们可能需要将这些图片转换为8-bit(即每个像素值的范围为0到255),例如为了显示图片或者与某些只能处理8-bit数据的算法兼容。

以下是一个使用Python和GDAL库将16-bit遥感图像归一化为8-bit的示例:

import numpy as np
from osgeo import gdal

# 读取遥感图像
dataset = gdal.Open('your_image_file.tif')
band = dataset.GetRasterBand(1)
image = band.ReadAsArray()

# 将16-bit图像归一化为0-1范围
min_val = np.min(image)
max_val = np.max(image)
normalized_image = (image - min_val) / (max_val - min_val)

# 将归一化的图像转换为8-bit
eight_bit_image = (normalized_image * 255).astype(np.uint8)

在这个例子中,我们首先读取遥感图像并获取其一个波段。然后,我们找到图像中的最小和最大像素值,并使用这些值将图像归一化到0和1之间。最后,我们将归一化的图像乘以255并转换为8-bit整数,得到最终的8-bit图像。

同样,这个例子只处理了图像的一个波段。如果你的遥感图像是多波段的,你可能需要对每个波段分别进行这个过程。此外,这个例子没有处理遥感图像中的无效或缺失数据,你可能需要在实际应用中对这些问题进行预处理。

解答粉丝的一个问题,所以写了这篇文章。

线性归一化是最简单的一种拉伸形式,它将原始图像中的最小值映射到8-bit范围内的最小值(通常为0),将最大值映射到最大值(通常为255),并将其他像素值按比例映射到这个范围内。

8-bit图像是一种数字图像格式,其中每个像素由8位二进制数字表示。这意味着每个像素可以有256(即$2^8$)个可能的值。对于灰度图像,这意味着图像可以有从黑色(通常表示为0)到白色(通常表示为255)的256个不同的灰度级别。

对于彩色图像,通常使用三个8-bit通道(红色、绿色和蓝色)来表示颜色,每个通道可以有256个不同的强度级别。这使得图像可以表示大约1677万种不同的颜色(即256 x 256 x 256)。

8-bit图像格式(如JPEG和PNG)在日常生活中非常常见,因为它们可以提供足够的颜色深度来满足大多数视觉需求,同时文件大小相对较小,易于存储和传输。大多数图像查看和编辑软件,以及网页浏览器,都可以轻松处理8-bit图像。

相比之下,16-bit图像提供了更大的颜色深度(每个通道可以有65536个不同的强度级别),但文件大小更大,并且可能需要专门的软件来查看和编辑。这些图像通常在需要高颜色精度的领域中使用,如遥感、医疗成像和专业级图像编辑。