本文介绍使用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 pdfrom skimage import iofrom skimage.morphology import labelfrom skimage.measure import regionprops
## 读取图像文件img = io.imread(fp)
## 设置阈值范围获得maskvmin = 20vmax= 180mask_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)