与熊猫一起探索和可视化区域属性

这个玩具示例展示了如何在一系列10幅图像中计算每个标记区域的大小。我们先使用2D图像,然后使用3D图像。合成地生成斑点状区域。随着体积分数(即,斑点覆盖的像素或体素的比率)的增加,斑点(区域)的数量减少,并且单个区域的大小(面积或体积)可能变得越来越大。面积(大小)值以与熊猫兼容的格式提供,这有助于方便的数据分析和可视化。

除了面积,还有许多其他区域属性可用。

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()
fraction 0.05, fraction 0.5

在散点图中,许多点似乎在较低的面积值处重叠。为了更好地了解分布,我们可能想要在可视化中添加一些“抖动”。为此,我们使用 stripplot (从 seaborn ,致力于统计数据可视化的Python库)和参数 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()
plot regionprops table

3D图像

在3D中做同样的分析,我们发现了一个更戏剧性的行为:当体积分数超过~0.25时,斑点合并成一个巨大的单一碎片。这对应于 percolation threshold 在统计物理和图论方面。

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()
plot regionprops table

脚本的总运行时间: (0分2.479秒)

Gallery generated by Sphinx-Gallery