如何使用 python 标记图像分类的连接组件(补丁)

How to label connected components (patches) of an image classification with python

我有一个地理参考 classification(来自卫星图像),其值从 1 到 3。我想用唯一编号标记每个连接补丁。

例如

1 1 1 1 1 1 1 1 1 1 1
1 1 1 2 2 1 1 1 1 2 2
1 1 2 1 2 2 3 3 1 2 2
1 1 1 1 2 1 1 3 1 1 2
1 3 1 1 1 1 3 3 1 1 1
1 3 3 1 1 1 1 1 1 2 2

变成

1 1 1 1 1 1 1 1 1 1 1
1 1 1 2 2 1 1 1 1 3 3
1 1 2 1 2 2 4 4 1 3 3
1 1 1 1 2 1 1 4 1 1 3
1 5 1 1 1 1 4 4 1 1 1
1 5 5 1 1 1 1 1 1 6 6

通过保留 class 信息。

我试过:

    来自 "SDMTools" 的
  1. "ConnCompLabel" 但它工作起来非常慢,如果在 python.
  2. 中有一个方便的解决方案会很好
  3. sckit 命令 "measure.lable" 在此 post“https://www.scipy-lectures.org/packages/scikit-image/auto_examples/plot_labels.html”中推荐,但我不想丢失地理空间信息。

我可以使用光栅和洪水填充算法吗?

我需要这个来分别计算每个补丁的 Satial Metrics

也许您可以这样使用 scikit-image 命令:

  • 通过为第一张图像设置从1到0不同的值,将图像分成3张不同的二值图像,例如

    1 1 1 1 1 1 1 1 1 1 1
    1 1 1 0 0 1 1 1 1 0 0
    1 1 0 1 0 0 0 0 1 0 0
    1 1 1 1 0 1 1 0 1 1 0
    1 0 1 1 1 1 0 0 1 1 1
    1 0 0 1 1 1 1 1 1 0 0
    

2 和 3 相同

  • 在每个图像上应用 scikit 命令

  • 移动值,这样它们就不会混合和重构图像

我是否正确理解了你的问题?

空间参考系的问题我在标注后再次添加解决了。

# Labeling and losing geospatial information:
Classification= imageio.imread("C:/path/to/Classification/raster.tif") # read Classification 
labeled_Classifiation = measure.label(Classification, background=0) # label Classification

# steps for adding geospatial information:
labeled_Classifiation = np.array(ndci_EM_polished_labels)

dataset=gdal.Open(r"C:/path/to/Classification/raster.tif")
projection = dataset.GetProjection()
geo_transform = dataset.GetGeoTransform()

drv = gdal.GetDriverByName("GTiff")
dst_ds = drv.Create("C:/path/to/result/name_of_labeled_Classifiation.tif",
                    labeled_Classifiation.shape[1],
                    labeled_Classifiation.shape[0],
                                1,
                                gdal.GDT_Float32, ['COMPRESS=DEFLATE',
                                                   'BIGTIFF=YES',
                                                   'PREDICTOR=1',
                                                   'TILED=YES'])
dst_ds.SetProjection(projection)
dst_ds.SetGeoTransform(geo_transform)
dst_ds.GetRasterBand(1).WriteArray(labeled_Classifiation)