备注
单击 here 下载完整的示例代码或通过活页夹在浏览器中运行此示例
与熊猫一起探索和可视化区域属性¶
这个玩具示例展示了如何在一系列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()

在散点图中,许多点似乎在较低的面积值处重叠。为了更好地了解分布,我们可能想要在可视化中添加一些“抖动”。为此,我们使用 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()

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

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