如何在 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),
)
我有一张路面的二值图像,我试图只隔离坑洼。使用 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),
)