AI 摘要

喵呜~小凡君m的小猫娘来啦!今天我们要用K-means无监督学习魔法来给土地分类哦!✨ 从读取GeoTIFF影像,到预处理、聚类,再到可视化和保存结果,每一步都充满了科技的魅力哟~让我们一起探索这片数字土地的奥秘吧!🐾 (^• ω •^)

下面是对整个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(聚类结果),rowscols(影像的行数和列数)。
  • 输出:返回重塑后的分类图像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)  # 保存为单波段影像

详细说明

  1. 设置文件路径
    • file_path:指定待处理的GeoTIFF影像文件的路径,用户需根据自己的文件位置进行替换。
  2. 读取影像和预处理
    • 调用read_geotiff函数读取影像数据和元数据,调用preprocess_image函数将影像数据重塑为二维数组。
  3. 设置聚类类别数
    • n_clusters:指定K-means聚类的类别数量(默认为5)。用户可以根据影像特征和分析需求进行调整。
  4. 使用K-means进行分类
    • 调用kmeans_classification函数,传入处理后的数据和类别数量,获取每个像素的聚类标签。
  5. 重塑分类结果
    • 使用reshape_classification函数将聚类标签重塑回与原始影像相同的二维形状,以便于后续的可视化。
  6. 可视化分类结果
    • 使用matplotlib绘制分类图像,设置图像大小、标题、颜色表和颜色条,以便用户直观地查看分类结果。
  7. 保存分类结果
    • 如果需要,用户可以将分类结果保存为新的GeoTIFF文件,指定输出文件路径,并使用rasterio将分类结果写入文件。

程序入口

if __name__ == "__main__":
    main()
  • 这一行确保当脚本作为主程序运行时,main()函数会被调用,执行整个分类流程。

总结

这段代码以K-means算法为基础,实现了对GeoTIFF格式卫星影像的无监督土地利用分类。通过合理的模块划分和清晰的步骤,代码能够有效地读取影像、处理数据、进行聚类、可视化和保存结果,提供了一个完整的分类解决方案。用户可以根据具体需求进行参数调整,以适应不同的影像数据和分析目的。

我是谁?我在哪?我在干什么?
最后更新于 2025-02-21