一个基于python3的图像分析软件包,实现生物医学显微镜图像的完全文档化和可复制的可视化和分析。

mplex-image的Python项目详细描述


cmIF公司

作者:英杰

日期:2020-04-13

许可证:GPLv3

语言:Python3

描述:cmIF是一个Python3库,用于多重免疫荧光图像的自动图像处理和分析

示例代码

1导入库和设置路径

在包含代码的目录中,cmIF将为原始图像(未注册的tiff)自动生成文件夹, QC输出、注册图像、自荧光减影图像和分割输出。所以只是 codedir和{}变量应该被修改,保留标准化的文件夹结构。在

列出要作为ls_sample处理的幻灯片的名称。在扫描过程中,每张幻灯片可以有一个或多个场景。在

# Import libraries
from cmIF import preprocess, mpimage, cmif, process
import os
import sys
import javabridge
import bioformats
import numpy as np
import pandas as pd


# Set Paths
codedir = '/home/groups/graylab_share/Chin_Lab/ChinData/Cyclic_Workflow/cmIF_2019-09-11_NP029'
czidir = '/home/groups/graylab_share/Chin_Lab/ChinData/Cyclic_Images/cmIF_2019-09-11_NP029'
tiffdir = f'{codedir}/RawImages'
qcdir = f'{codedir}/QC'
regdir = f'{codedir}/RegisteredImages'
subdir = f'{codedir}/SubtractedRegisteredImages'
segdir = f'{codedir}/Segmentation'
cropdir = f'{codedir}/Segmentation/Cropped'
preprocess.cmif_mkdir([tiffdir,qcdir,regdir,segdir,subdir,cropdir])

# List slides to be processed
ls_sample = ['HER2B-K174',
 'JE-TMA-35',
 'NP029',
 ]

2从.czi导出暴露时间元数据

使用单独的函数从有场景或无场景的扫描导出曝光时间。 每张幻灯片中的所有图像都应位于czidir内的单个子文件夹中。在

^{pr2}$

3个QC原始图像

使用显微镜软件将所有原始TIFF导出为16位原始图像。放在单独的文件夹里, 每张幻灯片一张,位于codedir内的rawmimages文件夹中。本节将生成所有轮的概述,以供质量控制之用。在

preprocess.cmif_mkdir([f'{qcdir}/RawImages'])

for s_sample in ls_sample:
    os.chdir(f'{tiffdir}/{s_sample}')
    #investigate tissues
    df_img = mpimage.parse_org(s_end = "ORG.tif",type='raw')
    cmif.visualize_raw_images(df_img,qcdir,color='c1')

4寄存器图像

本节创建一个用于注册的Matlab脚本,并在我们的服务器(ohsuexacloud)上启动一个作业。 在本例中,我通过输入new_scene_id : '[upperleftXcoord upperleftYcoord width height]'作为键:值对在d_register字典中。将字典留空将开始注册而不进行裁剪。每个注册的场景都会被放入一个单独的文件夹。在

d_register = {'HER2B-K174':{}, #TMA registration
    'JE-TMA-35':{},
    'NP029':{1:'[0 2000 15000 18000]',2:'[15000 14000 15000 6000]'}, #large registration
 }
ls_order = ['R1','R0','R2','R3','R4','R5','R5Q','R6','R7','R8','R9','R10','R11','R12','R12Q'] 

for key,item in d_register.items():
   #run registration
   cmif.run_registration_matlab(d_register, ls_order, f'{tiffdir}/{key}', f'{regdir}/')

5支票登记

本节将生成每个注册图像堆栈的所有轮的概览,以供质量控制之用。在

cmif.visualize_reg_images(f'{regdir}',qcdir,color='c1')

6a创建AF减影图像

通过获取的背景自荧光图像按曝光时间缩放并从相应通道中减去,生成新图像。d_channel指定要从每个频道中减去的背景标记的名称。ls_exclude列出不执行任何AF减法的标记(通常是c5图像)。在

图像输出到每个注册场景的单独文件夹中的AFSubtracted文件夹。这些场景随后被合并到6b中的一个文件夹中。这将是一个很好的点,以生成一些tiff的完整图像堆栈。在

#parameters
d_channel = {'c2':'R5Qc2','c3':'R5Qc3','c4':'R5Qc4','c5':'R5Qc5'}
ls_exclude=['DAPI','BMP2', 'CD20', 'CD3', 'CD44', 'CD45', 'CK19',
 'ColI', 'Ecad', 'FoxP3', 'GRNZB', 'LamAC', 'PgR', 'R0c5', 'R12Qc5',]

#subtract
df_img, df_exp,df_markers,df_copy = cmif.autofluorescence_subtract(regdir,codedir,d_channel,ls_exclude)

6b移动AF减影图像

将同一张幻灯片中的所有场景移动到one folder,进行分段。在

for s_sample in ls_sample:
    cmif.move_af_img(s_sample, regdir, subdir, dirtype='tma',b_move=True)

7分割准备

首先,重命名使用非标准标记名的文件名。在

然后,自动生成用于分割的所有输入,包括复制所需的任何附加图像(例如DAPI通道),验证分割阈值,并准备用于分割的输入文件(即。RoundCyclesTable.txt以及集群.java专门针对Guillaume Thibault的细分软件)

#parameters
d_rename = {}
dapi_copy={'-R12_':112}
marker_copy ={} #'CK19':['CK5','CK7'],'CD44':['CD45']
d_segment = {'CK19':1002,'CK5':1002,'CD45':2002,'Ecad':1302,'CD44':3002,'CK7':1002,'CK14':1002}

#cmif.rename_files(d_rename,dir=subdir,b_test=True)
#cmif.copy_files(dir=subdir,dapi_copy=dapi_copy, marker_copy=marker_copy,b_test=False)
#cmif.segmentation_thresholds(subdir,qcdir, d_segment)
cmif.segmentation_inputs(subdir,segdir,d_segment,tma_bool=False,b_start=False, i_counter=5)

8获取数据帧

使用纪尧姆软件分割后,输出的是每个标记的单独特征文件。在这里,我们从单独的.txt文件中提取所有标记的特征到single.tsv;其中一个用于单细胞荧光强度(平均强度.tsv)以及其他关于细胞位置的信息(形心X.tsv, 质心.tsv). 在

for s_sample in ls_sample:
   cmif.extract_dataframe(s_sample, segdir,qcdir)

9过滤器数据

后处理包括基于最后一轮DAPI染色过滤掉丢失的细胞,并根据所需的生物标记子细胞位置选择数据帧列(这些是硬编码的,并链接到标准化标记名)。在

#parameters
s_dapi = 'DAPI12_Nuclei'
dapi_thresh = 1000
d_channel = {}
ls_exclude=[]

for s_sample in ls_sample:
    cmif.prepare_dataframe(s_sample,s_dapi,dapi_thresh,d_channel,ls_exclude,segdir, codedir)

10获取单元格标签文件

将所有单元标签(盆地)文件收集到一个文件夹中,以便可以轻松地用于下游分析。在

#paramter
s_sampleset = 'HER2BK174_JETMA35_NP29_31_32_34_35_36_analysis'
s_slide = 'NP029'
es_scene = None  # this will fetch the basin files from any scene form s_slide.
s_ipath = './Segmentation/NP029_Segmentation/'

cmif.fetch_celllabel(s_sampleset, s_slide, s_ipath, s_opath='./', es_scene=es_scene, b_test=True)

11生成裁剪覆盖

裁剪图像和分段的较小区域Station盆地,并创建自定义叠加,以有效查看相关标记。在

#parameters
#crop 2000,2000 x, y upper corner
d_crop = {'HER2B-K174-Scene-02': (1500,3500),
 'HER2B-K174-Scene-08': (2500,1500),
 'JE-TMA-35-Scene-01': (1500,1500),
 'NP029-Scene-001': (8500,9500),
 'NP031-Scene-002': (2000,8500),
 'NP032-Scene-001': (8500,7000),
 'NP034-Scene-001': (6500,6500),
 'NP035-Scene-001': (800,8500),
 'NP036-Scene-001': (3500,9500)}

tu_dim=(2000,2000)

s_dapi = 'DAPI12_Nuclei'

d_combos = {
        'Stromal':{'PDPN','Vim','CD31','PDGFRa','aSMA','CD44','ColI','ColIV','BMP2'}, 
        'Tumor':{'HER2', 'ER', 'PgR','AR','EGFR','Ecad','CD44','Ki67'},
        'Proliferation':{'Ki67','pHH3','pRB','PCNA'},
        'Immune':{'CD45','CD20','CD68','CD44','PD1', 'CD8', 'CD4','FoxP3','CD3','GRNZB'},
        'Differentiation':{'CK8','CK7','CK19','CK14','CK17','CK5','CD44','Vim'},
        'Nuclear':{'LamB2', 'LamB1', 'LamAC','H3K4','H3K27'},
        'Growth': {'pAKT', 'pS6RP', 'CoxIV', 'pERK', 'Glut1','Ki67'},
        #'Other': { 'gH2AX', 'HIF1a', 'cPARP','53BP1'},
    }

cmif.multipage_tiff(d_combos,d_crop,tu_dim,s_dapi,subdir,b_crop=True)
cmif.crop_basins(d_crop,tu_dim,segdir,cropdir,s_type='Cell')

下一步行动

现在一切都准备好了,可以使用我的cmIF Jupyter笔记本进行可视化。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在tex文件中以读/写方式拆分一行?   java Ping选项s的值不正确,有效范围为1到4   java我需要在Eclipse中设置/配置哪些环境变量(对于SeleniumWebDriver)?如果我不设置/配置它们呢?   java将经过筛选的第二个表的两列映射到一个集合成员   垃圾收集Java:增加YoungGen大小以提高GC性能   JavaHibernate对复杂连接执行两个查询,而不是一个查询   foreach Java 8:映射而非简单循环   java指定ThreadPoolExecutor问题   java如何解决此错误:二进制运算符“&&”的操作数类型错误   JavaJPA+MariaDB:排序规则如何影响unicode支持?   在循环中RxJava中变量延迟前后的java执行函数   java初始化数组中的数组   java在LWJGL中绘制四边形时,我做错了什么?   java错误找不到符号变量id   java组织。阿帕奇。log4j。jmx不具备生产质量?(log4j 1.2)