下面是对整个K-means无监督分类代码的整合性详细说明,包括每个部分的功能、目的和关键概念,确保对整个流程有一个全面的理解。
代码整体结构
这段代码实现了对GeoTIFF格式卫星影像的无监督K-means分类。主要流程包括读取影像、预处理、应用K-means聚类、可视化分类结果以及保存分类结果为新的GeoTIFF文件。
导入所需库
import rasterio
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
rasterio
:用于读取和写入地理空间栅格数据(如GeoTIFF文件)。numpy
:用于高效的数值计算和数组操作。KMeans
:从sklearn.cluster
引入的K-means聚类算法,用于无监督分类。matplotlib.pyplot
:用于绘图和可视化数据。
读取GeoTIFF影像
def read_geotiff(file_path):
with rasterio.open(file_path) as src:
img = src.read() # 读取所有波段
profile = src.profile # 获取影像的元数据
return img, profile
- 功能:打开指定路径的GeoTIFF文件,读取影像的所有波段和元数据。
- 输入:
file_path
,指定GeoTIFF文件的路径。 - 输出:返回影像数据
img
(三维数组,形状为(bands, rows, cols)
)和影像的元数据profile
。
预处理影像
def preprocess_image(img):
bands, rows, cols = img.shape
X = img.reshape(bands, rows * cols).T # 转换为 (样本数, 特征数) 的形状
return X, rows, cols
- 功能:将多波段影像数据转换为适合K-means算法处理的二维数组。
- 输入:
img
,读取的影像数据。 - 输出:返回重塑后的数据
X
(形状为(样本数, 特征数)
)、行数rows
和列数cols
。
K-means分类
def kmeans_classification(X, n_clusters=5):
kmeans = KMeans(n_clusters=n_clusters, random_state=42)
kmeans.fit(X)
return kmeans.labels_
- 功能:使用K-means算法对处理后的数据进行无监督分类。
- 输入:
X
(处理后的二维数组)和聚类类别数n_clusters
(默认为5)。 - 输出:返回每个样本的类别标签
labels
,指示该像素所属的聚类。
重塑分类结果
def reshape_classification(labels, rows, cols):
return labels.reshape(rows, cols)
- 功能:将一维的聚类标签数组重塑回与原始图像相同的二维形状。
- 输入:
labels
(聚类结果),rows
和cols
(影像的行数和列数)。 - 输出:返回重塑后的分类图像
classified_img
。
主函数
def main():
file_path = "path/to/your/satellite_image.tif" # 替换为你的GeoTIFF文件路径
# 读取影像和预处理
img, profile = read_geotiff(file_path)
X, rows, cols = preprocess_image(img)
# 设置聚类类别数
n_clusters = 5 # 假设分为5类,可以根据实际情况调整
# 使用K-means进行分类
labels = kmeans_classification(X, n_clusters)
# 重塑分类结果
classified_img = reshape_classification(labels, rows, cols)
# 可视化结果
plt.figure(figsize=(10, 6))
plt.imshow(classified_img, cmap="tab20") # 使用tab20颜色表,区分不同类别
plt.title("Unsupervised Land Use Classification (K-means)")
plt.colorbar(label='Class ID') # 添加颜色条,用于显示类别ID
plt.show()
# 如果需要保存分类结果为新的GeoTIFF文件,可以使用以下代码
output_file_path = "path/to/output_classified_image.tif" # 替换为你希望保存的路径
with rasterio.open(output_file_path, 'w', **profile) as dst:
dst.write(classified_img.astype(rasterio.uint8), 1) # 保存为单波段影像
详细说明
- 设置文件路径:
file_path
:指定待处理的GeoTIFF影像文件的路径,用户需根据自己的文件位置进行替换。
- 读取影像和预处理:
- 调用
read_geotiff
函数读取影像数据和元数据,调用preprocess_image
函数将影像数据重塑为二维数组。
- 调用
- 设置聚类类别数:
n_clusters
:指定K-means聚类的类别数量(默认为5)。用户可以根据影像特征和分析需求进行调整。
- 使用K-means进行分类:
- 调用
kmeans_classification
函数,传入处理后的数据和类别数量,获取每个像素的聚类标签。
- 调用
- 重塑分类结果:
- 使用
reshape_classification
函数将聚类标签重塑回与原始影像相同的二维形状,以便于后续的可视化。
- 使用
- 可视化分类结果:
- 使用
matplotlib
绘制分类图像,设置图像大小、标题、颜色表和颜色条,以便用户直观地查看分类结果。
- 使用
- 保存分类结果:
- 如果需要,用户可以将分类结果保存为新的GeoTIFF文件,指定输出文件路径,并使用
rasterio
将分类结果写入文件。
- 如果需要,用户可以将分类结果保存为新的GeoTIFF文件,指定输出文件路径,并使用
程序入口
if __name__ == "__main__":
main()
- 这一行确保当脚本作为主程序运行时,
main()
函数会被调用,执行整个分类流程。
总结
这段代码以K-means算法为基础,实现了对GeoTIFF格式卫星影像的无监督土地利用分类。通过合理的模块划分和清晰的步骤,代码能够有效地读取影像、处理数据、进行聚类、可视化和保存结果,提供了一个完整的分类解决方案。用户可以根据具体需求进行参数调整,以适应不同的影像数据和分析目的。
Comments NOTHING