如何在 Python 中的二值图像上使用 skimage.measure.regionprops 按面积或偏心率过滤

How do I filter by area or eccentricity using skimage.measure.regionprops on a binary image in Python

我有一张路面的二值图像,我试图只隔离坑洼。使用 skimage.measure.regionprops 和 skimage.measure.label 我可以为图像中的不同标签生成 table 属性。

然后如何使用这些值进行过滤? - 例如使用面积或轴长或偏心率来关闭某些标签。 Input, labled Image and properties table

使用 python 3

我会使用 pandas 和 skimage.measure.regionprops_table 来得到你想要的:

import pandas as pd
import imageio as iio
from skimage.measure import regionprops_table, label

image = np.asarray(iio.imread('path/to/image.png'))
labeled = label(image > 0)  # ensure input is binary
data = regionprops_table(
        labeled,
        properties=('label', 'eccentricity'),
        )
table = pd.DataFrame(data)
table_sorted_by_ecc = table.sort_values(
        by='eccentricity', ascending=False
        )

# print e.g. the 10 most eccentric labels
print(table_sorted.iloc[:10])

如果您想要,例如用只有最古怪的标签生成标签图像,你可以这样做:

eccentric_label = table['labels'].iloc[np.argmax(table['eccentricity'])]
labeled_ecc = np.where(labeled == eccentric_label, eccentric_label, 0)

您还可以做更复杂的事情,例如制作一个标签图像,其中只有高于某个偏心率的标签。下面,我们使用 NumPy 逐元素乘法生成一个数组,如果该标签具有高偏心率,则该数组为原始标签,否则为 0。然后,我们再次使用 skimage.util.map_array 函数将原始标签映射到它们自身或 0,具体取决于偏心率。

from skimage.util import map_array

ecc_threshold = 0.3
eccentric_labels = table['labels'] * (table['eccentricity'] > ecc_threshold)
new_labels = map_array(
        labeled,
        np.asarray(table['labels']),
        np.asarray(eccentric_labels),
        )