如何使用 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" 的 - "ConnCompLabel" 但它工作起来非常慢,如果在 python.
中有一个方便的解决方案会很好
- 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)
我有一个地理参考 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" 的
- "ConnCompLabel" 但它工作起来非常慢,如果在 python. 中有一个方便的解决方案会很好
- 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)