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

Posted

技术标签:

【中文标题】如何使用 python 标记图像分类的连接组件(补丁)【英文标题】:How to label connected components (patches) of an image classification with python 【发布时间】:2019-01-29 20:19:16 【问题描述】:

我有一个值从 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

通过保留类信息。

我试过了:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

我的表述并不精确,标签与 scikit-image 一起使用。这种方法的问题是,空间参考信息会丢失。我现在尝试从原始分类中提取空间参考系统并将其投影到标记的分类中,但我想知道是否已经有更好的可能性。【参考方案2】:

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

# 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)

【讨论】:

以上是关于如何使用 python 标记图像分类的连接组件(补丁)的主要内容,如果未能解决你的问题,请参考以下文章

Python图像特征的音乐序列生成如何标记照片的特征

如何在openCV中对连接的组件进行分割?

如何以正确的顺序标记图像以进行 keras 图像分类?

如何使用未标记的图像训练 CNN?

基于像素的标签将2D像素阵列更改为图像

从图像中删除具有像素值总和<阈值的连接组件