Python实现GFP细胞扫描图像细胞核检测的方案咨询
GFP细胞扫描图像细胞核检测实现方案
问题背景
- 需求:检测GFP通道细胞扫描图像中的细胞核,实现逐细胞追踪的分割效果
- 现有基础:已基于Cellpose库实现全细胞掩码检测,暂未支持细胞核识别,现有代码如下:
############################### # 本代码基于cellpose库实现2张GFP通道细胞扫描图的全细胞掩码生成 ############################### #~~~~~~~~~~~~~~~~~~~~~~~~~ # GFP细胞检测依赖库 from skimage.io import imread import numpy as np import time, os, sys import matplotlib.pyplot as plt import matplotlib as mpl import fnmatch mpl.rcParams['figure.dpi'] = 300 from cellpose import utils, io from skimage.measure import label, regionprops, regionprops_table import pandas as pd from PIL import Image, ImageChops #~~~~~~~~~~~~~~~~~~~~~~~~~ # GFP细胞核检测依赖库 from skimage import (filters, measure, morphology, segmentation) from scipy import ndimage as ndi from skimage import data, color from skimage.transform import hough_circle, hough_circle_peaks from skimage.feature import canny from skimage.draw import circle_perimeter from skimage.util import img_as_ubyte import cv2 #~~~~~~~~~~~~~~~~~~~~~~~~~ # 加载图像 print("依赖库导入完成") GFP_files = [] GFP_files.append('03152021_GFP_cells_1_lowesy_quality.tif') GFP_files.append('03152021_GFP_cells_2_lowesy_quality.tif') GFP_files= sorted(GFP_files) #文件排序 plt.figure(figsize=(2,2)) img = np.array(Image.open(GFP_files[0])) img2 = img wid = img.shape[0] hei = img.shape[1] #~~~~~~~~~~~~~~~~~~~~~~~~~ # 初始化GFP细胞检测模型 from cellpose import models, io import random model = models.Cellpose(gpu=True, model_type='cyto') channels = [2,0] #~~~~~~~~~~~~~~~~~~~~~~~~~ # 批量处理文件循环 #初始化统计数组 imgname=[0]*len(GFP_files) n_cell= [[2, 0]]*len(GFP_files) seg_masks=np.zeros((len(GFP_files), wid,hei)) #存储所有图像的分割掩码为3维数组 i=-1 #索引计数 kernel = np.ones((5,5), np.uint8) print('开始运行...') # 主处理循环 for filename in GFP_files: i+=1 img = np.array(Image.open(filename)) masks, flows, styles, diams = model.eval(img, diameter=30, channels=channels) n_cell[i]= [filename,np.max(masks)] seg_masks[i,:,:]= masks imgname[i]=[filename] im = np.copy(img[:,:,0]) im[masks==0]=0 #应用背景阈值 # 'im' 为单通道图像,仅保留单个细胞区域,其余区域为背景
可行实现方案
现成Python库方案(零训练,仅需修改少量代码)
- 优先使用Cellpose原生细胞核模型:现有代码加载的是
cyto胞质分割模型,Cellpose官方提供了专门针对荧光显微图像训练的nuclei预训练模型,和现有代码逻辑完全兼容,仅需将模型初始化参数中的model_type='cyto'替换为model_type='nuclei',调整通道参数指向GFP核信号通道,即可直接输出细胞核掩码,常规GFP核标记场景下精度完全够用。 - 备选工具:
- StarDist:专门针对荧光显微图像优化的分割模型,对形态不规则、存在重叠的细胞核检测精度优于通用模型,提供开箱即用的预训练权重
- CellProfiler:适合批量处理场景,内置可视化配置的细胞核检测流程,检测结果可直接导出为numpy数组对接后续Python分析流程
基于现有代码的无训练改进方案
既然已经拿到了全细胞掩码,不需要在全图范围做核检测,限定在单个细胞ROI区域内做分割能大幅提升准确率:
- 遍历
seg_masks中每个独立细胞的掩码,将掩码外像素全部置0,裁剪出单个细胞的图像块 - 对单块图像使用
skimage.filters.threshold_local做局部阈值分割——GFP标记样本中,细胞核区域信号强度普遍高于周围胞质,阈值后筛选连通域中面积匹配正常细胞核尺寸、圆形度最高的区域,即为目标细胞核 - 用形态学开运算去除细碎噪点、填充区域内部孔洞,即可得到干净的细胞核掩码
自定义训练模型方案(适配低质量等特殊成像场景)
如果现成预训练模型在低质量成像样本上效果不达预期,自定义训练的成本非常低:
- 数据标注:仅需手动标注20-50张自有样本,用LabelMe圈出细胞核区域即可,不需要大规模数据集
- 模型选型:优先在Cellpose官方
nuclei模型基础上做微调,收敛速度、精度都优于从零训练;如果需要更高定制自由度,搭建轻量U-Net分割网络即可满足需求 - 训练技巧:训练时加入随机旋转、亮度扰动、高斯噪声类数据增强,适配显微图像常见的成像偏差,单GPU训练10-20轮即可得到适配自有场景、效果优于通用预训练模型的权重
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

