0

我有一个地理参考分类(源自卫星图像),其值从 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

通过保留类信息。

我努力了:

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

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

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

4

2 回答 2

0

也许你可以这样使用 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 命令

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

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

于 2018-08-23T13:10:46.923 回答
0

我通过在标记后再次添加空间参考系统来解决问题。

# 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)
于 2018-08-31T12:35:24.647 回答