注意
转到末尾下载完整的示例代码。或通过 Binder 在浏览器中运行此示例
使用 Pandas 探索和可视化区域属性#
此玩具示例展示了如何计算一系列 10 张图像中每个标记区域的大小。我们使用 2D 图像,然后是 3D 图像。类 blob 的区域是合成生成的。随着体积分数(即 blob 覆盖的像素或体素的比率)增加,blob(区域)的数量减少,单个区域的大小(面积或体积)可能会越来越大。面积(大小)值以与 Pandas 兼容的格式提供,这使得数据分析和可视化变得方便。
除了面积之外,还有许多其他区域属性可用。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from skimage import data, measure
fractions = np.linspace(0.05, 0.5, 10)
2D 图像#
images = [data.binary_blobs(volume_fraction=f) for f in fractions]
labeled_images = [measure.label(image) for image in images]
properties = ['label', 'area']
tables = [
measure.regionprops_table(image, properties=properties) for image in labeled_images
]
tables = [pd.DataFrame(table) for table in tables]
for fraction, table in zip(fractions, tables):
table['volume fraction'] = fraction
areas = pd.concat(tables, axis=0)
# Create custom grid of subplots
grid = plt.GridSpec(2, 2)
ax1 = plt.subplot(grid[0, 0])
ax2 = plt.subplot(grid[0, 1])
ax = plt.subplot(grid[1, :])
# Show image with lowest volume fraction
ax1.imshow(images[0], cmap='gray_r')
ax1.set_axis_off()
ax1.set_title(f'fraction {fractions[0]}')
# Show image with highest volume fraction
ax2.imshow(images[-1], cmap='gray_r')
ax2.set_axis_off()
ax2.set_title(f'fraction {fractions[-1]}')
# Plot area vs volume fraction
areas.plot(x='volume fraction', y='area', kind='scatter', ax=ax)
plt.show()
在散点图中,许多点似乎在较低的面积值处重叠。为了更好地了解分布情况,我们可能希望在可视化中添加一些“抖动”。为此,我们使用 seaborn.stripplot
(来自 seaborn 库,用于统计数据可视化),参数为 jitter=True
。
fig, ax = plt.subplots()
sns.stripplot(x='volume fraction', y='area', data=areas, jitter=True, ax=ax)
# Fix floating point rendering
ax.set_xticklabels([f'{frac:.2f}' for frac in fractions])
plt.show()
/home/runner/work/scikit-image/scikit-image/doc/examples/segmentation/plot_regionprops_table.py:75: UserWarning:
set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
3D 图像#
在 3D 中进行相同的分析,我们发现了一个更显著的行为:当体积分数超过 ~0.25 时,blob 会合并成一个巨大的整体。这对应于统计物理学和图论中的 渗流阈值。
images = [data.binary_blobs(length=128, n_dim=3, volume_fraction=f) for f in fractions]
labeled_images = [measure.label(image) for image in images]
properties = ['label', 'area']
tables = [
measure.regionprops_table(image, properties=properties) for image in labeled_images
]
tables = [pd.DataFrame(table) for table in tables]
for fraction, table in zip(fractions, tables):
table['volume fraction'] = fraction
blob_volumes = pd.concat(tables, axis=0)
fig, ax = plt.subplots()
sns.stripplot(x='volume fraction', y='area', data=blob_volumes, jitter=True, ax=ax)
ax.set_ylabel('blob size (3D)')
# Fix floating point rendering
ax.set_xticklabels([f'{frac:.2f}' for frac in fractions])
plt.show()
/home/runner/work/scikit-image/scikit-image/doc/examples/segmentation/plot_regionprops_table.py:107: UserWarning:
set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
脚本的总运行时间:(0 分钟 2.532 秒)