本文介绍使用python中的scikit-image模块提供的功能来实现常用的颗粒分析功能。
在 ImageJ 中 Analyze Particles 是一个很有用的功能,网上这方面的教程很多,但基本逻辑是一致的:先获取感兴趣区域的mask,然后对mask中连通域(region)进行label,最后再统计每个region的各种属性(如 centroid,area,perimeter等)。
这个逻辑在python可以使用 scikit-image 模块提供的相应功能快速实现,并且在不同环节,都可以引入更加强大的工具来实现。例如mask可以使用 cellpose 图像分割获取,而不仅仅是阈值分割,再例如对于region的统计可以自定义统计指标,而不是一些region内置的common attributes。这里仅提供基于阈值分割的经典颗粒分析作为模板,代码如下:
import pandas as pd
from skimage import io
from skimage.morphology import label
from skimage.measure import regionprops
## 读取图像文件
img = io.imread(fp)
## 设置阈值范围获得mask
vmin = 20
vmax= 180
mask_img = (img<=vmax) & (img>=vmin)
# 保存mask临时文件
fp1 = fp+"_mask.tif"
io.imsave(fp1, mask_img.astype("uint8"), check_contrast=False)
## 标记连通域
label_img = label(mask_img)
# 保存label临时文件
fp2 = fp+"_label.tif"
io.imsave(fp2, label_img, check_contrast=False)
## 颗粒属性统计
results = regionprops(label_img)
box = []
for idx, region in enumerate(results):
row, col = region.centroid
area = region.area
perimeter = region.perimeter
box.append([idx, area, perimeter, row, col])
data = pd.DataFrame(box, columns=['id', 'area', 'perimeter', 'row', 'col'])
# 保存region统计结果
fp3 = fp+"_results.csv"
data.to_csv(fp3, index=None)
此处评论已关闭