病理切片TLS比例作为免疫治疗响应和预后的预测因子

article/2025/8/21 10:47:22

定义

三级淋巴结构 (TLS,Tumor Lymphoid Structure):是指在非淋巴组织中的慢性炎症部位(包括癌症)形成的异位淋巴细胞聚集体。

目前,分割和量化 TLS 的金标准是基于对 T(CD3: 用于标记T细胞) 和 B 淋巴细胞(CD20: 用于标记B细胞)使用多重免疫组织化学 (mIHC) 染色的病理特征。


临床意义

尽管肿瘤微环境中淋巴组织样结构(TLS)形成的确切机制尚未完全明确,但已有研究显示TLS与多种癌症类型的积极免疫治疗反应及改善的临床预后密切相关。因此,肿瘤病灶中TLS的存在可以作为预测患者临床预后和对免疫检查点阻断(ICB)治疗反应的重要指标。

淋巴浸润细胞是 TME 的常见成分(同时巨噬细胞通常也是肿瘤微环境中最为丰富的免疫细胞类型之一),大多数免疫细胞可以在肿瘤的中心区域或边缘区域以不同的比例被发现。因此,可以结合免疫微环境进一步分析。


文献证明TLS指导预后和免疫治疗反应

Chen Z, Wang X, Jin Z, Li B, Jiang D, Wang Y, Jiang M, Zhang D, Yuan P, Zhao Y, Feng F, Lin Y, Jiang L, Wang C, Meng W, Ye W, Wang J, Qiu W, Liu H, Huang D, Hou Y, Wang X, Jiao Y, Ying J, Liu Z, Liu Y. Deep learning on tertiary lymphoid structures in hematoxylin-eosin predicts cancer prognosis and immunotherapy response. NPJ Precis Oncol. 2024 Mar 22;8(1):73. doi: 10.1038/s41698-024-00579-w

- 指导预后

在这里插入图片描述

- 指导免疫治疗响应:估计的 TLS 比率与各种 TCGA 肿瘤类型的 B 淋巴细胞水平和 CXCL13 表达相关分析

CXCL13 是一种与 TLS 形成相关的趋化因子。CXCL13的表达增加通常促进B细胞和Tfh细胞在炎症部位的聚集。
在这里插入图片描述

- 指导免疫治疗响应:四个独立队列的 TLS 比率和免疫治疗结果进一步验证验证

在这里插入图片描述


基于深度学习预测TLS比例的方法:

本文近似TLS ratio 计算方法为:TLS 比率=预测的TLS面积/病理组织面积。
在这里插入图片描述

具体实现存在三个分支:(1)直接分割HE上的组织面积(OpenCV Python 包中的 OTSU 方法);(2)将HE切割成大小为1024或512的patch,采用HE 作为原图,mIHC作为TLS鉴定的金标准。构建TLS预测模型,输出为patch对应的黑白图,白色为TLS区域,黑色为组织区域。(3)采用hovernet保证每张patch上的淋巴细胞数量不低于80。最后将鉴定包括TLS区域的patch上的白色区域面积相加作为TLS面积。


具体代码实现 TLS ratio计算:

Step0:先修改一下get_slide_tls.py

  • 组织区域面积计算用的是最小分辨率,但patch分割是在level 0 ,代码为patch = slide.read_region((int(j * ExtractSize * (1 - RepetitionRate)), int(i * ExtractSize * (1 - RepetitionRate))), 0, (ExtractSize, ExtractSize)),因此,将level同样设置为0。

在这里插入图片描述

  • 这句代码用于分割组织区域和背景区域(默认组织块比背景块亮,组织块为白色,现实并不是如此)。因此,这里需要通过可视化(代码如下)确认前景区域(白色)是否为组织区域,若不是,则可以通过cv2.THRESH_BINARY_INV来实现或者直接计算像素点不为255的面积。
    在这里插入图片描述
import cv2
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import openslide# 打开病理切片图像
ref_img_path = "./slide/TCGA-4C-A93U-01Z-00-DX2.15B0C115-43F2-415E-AB24-315635E655AA.svs"
slide = openslide.OpenSlide(ref_img_path)# 获取图像的宽度和高度
width, height = slide.dimensions
print(width, height,width*height)# 选择最低分辨率级别
level = 0 #slide.level_count - 3# 从最低分辨率级别读取整个图像
tissue = slide.read_region((0, 0), level, (width, height))# 转换为RGB格式
tissue = tissue.convert('RGB')# 转换为NumPy数组
tissue = np.array(tissue)# 转换为灰度图像
tissue_gray = cv2.cvtColor(tissue, cv2.COLOR_RGB2GRAY)# 在图像处理中,将白色(值为255)视为前景,而将黑色(值为0)视为背景,这主要是基于一种约定俗成的视觉习惯和处理逻辑。
# 使用Otsu阈值化方法进行分割,cv2.THRESH_BINARY:将像素值大于阈值的像素设置为最大值(255),小于或等于阈值的像素设置为 0。
ret, tissue_thresh = cv2.threshold(tissue_gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # 使用matplotlib显示分割后的图像
plt.figure(figsize=(12, 6))# 显示原始图像
plt.subplot(1, 2, 1)
plt.title("Original Image")
plt.imshow(tissue)
plt.axis('off')# 显示分割后的图像
plt.subplot(1, 2, 2)
plt.title("Segmented Image (Otsu Thresholding)")
plt.imshow(tissue_thresh, cmap='gray')
plt.axis('off')plt.show()

在这里插入图片描述

# 方法一:反转颜色,大于阈值的设置为黑色,小于阈值的设置为白色
ret, tissue_thresh = cv2.threshold(tissue_gray, 0, 255, cv2.THRESH_BINARYN_INV | cv2.THRESH_OTSU) 
tissue_pixels = np.sum(tissue_thresh != 0) 
print("组织的像素点数量为:",tissue_pixels)# 方法二:直接计算黑色区域的像素点个数(面积)
ret, tissue_thresh = cv2.threshold(tissue_gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) 
tissue_pixels = np.sum(tissue_thresh != 255) 
print("组织的像素点数量为:",tissue_pixels)

Step1:切割病理切片为patch并分割patch上的淋巴结富集区域

#### 切割病理切片为patch并分割patch上的淋巴结富集区域 ###
# 输入目录:HNSC,放置原始病理切片文件(.ndpi或.svs)
# 输出目录1:predictions,每个切片会生成一个目录,目录下包含images(patch),lyms(基于hovernet识别的淋巴细胞)和masks(淋巴细胞富集区域)三个子目录。保存在上述子目录中的patch需要满足一定筛选标准(1.淋巴细胞数量大于或等于这个阈值(80);2. 非零像素比例大于10%,小于10%即认为该图像块主要是背景或空白区域)。
# 输出目录2:predictions/tissue_predictions/目录中的.txt文件记录了每个病理切片图像的组织区域大小,这个大小是通过计算组织掩码中非零像素的数量得到的,反映了整张病理切片图像上组织区域的面积。python get_slide_tls.py --cancer_type HNSC

在这里插入图片描述


Step2:统计病理组织面积为dataframe

result_dir = "./predictions/tissue_predictions/HNSC//"
df_tissue_area = pd.DataFrame(columns=["slide_id","tissue_area_slide_level"])
for tis_area_file in os.listdir(result_dir):tis_area_file = os.path.join(result_dir,tis_area_file)tmp_df = pd.read_csv(tis_area_file,sep="\t",header=None,names=["slide_id","tissue_area_slide_level"])df_tissue_area = pd.concat([df_tissue_area,tmp_df])
df_tissue_area.tissue_area_slide_level = df_tissue_area.tissue_area_slide_level.astype("float")
df_tissue_area

在这里插入图片描述


Step3:计算淋巴富集区域面积

def lyms_area_calculation(png_path,show = False):import cv2import numpy as npimport matplotlib.pyplot as plt# 读取图像image = cv2.imread(png_path, cv2.IMREAD_GRAYSCALE)# 应用Otsu阈值分割ret, thresh = cv2.threshold(image, 0, 255, cv2.THRESH_OTSU)# 计算白色区域的面积# 首先找到白色区域的轮廓contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 计算面积area = 0for contour in contours:area += cv2.contourArea(contour)print(f'Area of white region: {area}') #, Area of whole patch: {1024*1024})if show == True:# 显示原图和分割后的图plt.figure(figsize=(10, 5))plt.subplot(1, 2, 1)plt.title('Original Image')plt.imshow(image, cmap='gray')plt.axis('off')plt.subplot(1, 2, 2)plt.title('Otsu Thresholding')plt.imshow(thresh, cmap='gray')plt.axis('off')plt.show()return arearesult_dir = "./predictions/HNSC_Predictions/"
df_lym_area = pd.DataFrame(columns=["slide_id","patch_id","lyms_area"])for svs in tqdm(os.listdir(result_dir)):print(svs)## 计算淋巴细胞富集区域面积(白色区域面积)tis_path = os.path.join(result_dir,svs,"masks")for png_path in tqdm(os.listdir(tis_path)):png_path_ = os.path.join(tis_path,png_path)print(png_path_)lyms_area = lyms_area_calculation(png_path_,show = False)df_lym_area.loc[len(df_lym_area)] = [svs,png_path,lyms_area]
df_lym_area_slide = df_lym_area.groupby("slide_id").agg("sum").reset_index()
df_lym_area_slide.columns = ["slide_id","lyms_area_slide_level"]
df_lym_area = pd.merge(df_lym_area,df_lym_area_slide,how="left",on="slide_id")
df_lym_area.to_csv("slide_lyms_area.csv",index=False)
df_lym_area.head()

在这里插入图片描述

Step4:TLS ratio计算

TLS =  pd.merge(df_lym_area,df_tissue_area,how="inner",on=["slide_id"])
TLS = TLS[["slide_id","lyms_area_slide_level","tissue_area_slide_level"]].drop_duplicates()
TLS["TLS_ratio"] = round(TLS["lyms_area_slide_level"]/TLS["tissue_area_slide_level"]*100,2)
TLS

在这里插入图片描述


Reference

文献:

Deep learning on tertiary lymphoid structures in hematoxylin-eosin predicts cancer prognosis and immunotherapy responsehttps://github.com/zonechen1994/AI_TLS_segmentation

Tertiary lymphoid structures are critical for cancer prognosis and therapeutic response

代码:

GitHub - zonechen1994/AI_TLS_segmentation


http://www.hkcw.cn/article/yPfZBxbUCe.shtml

相关文章

Linux浅谈

Linux浅谈 一、什么是 Linux?先抛开 “内核”,看整体 可以把 Linux 系统 想象成一台 “组装电脑”: 最核心的零件是 “主板”—— 这就是 Linux 内核(Kernel),负责管理电脑里的所有硬件(比如 …

【模板-指南】

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

ICASSP2025丨融合语音停顿信息与语言模型的阿尔兹海默病检测

阿尔兹海默病(Alzheimers Disease, AD)是一种以认知能力下降和记忆丧失为特征的渐进性神经退行性疾病,及早发现对于其干预和治疗至关重要。近期,清华大学语音与音频技术实验室(SATLab)提出了一种将停顿信息…

吴艳妮获亚锦赛季军 妈妈:希望她恢复最佳状态 带伤参赛展现坚韧

因当地暴雨天气,原本计划于5月29日下午5时进行的亚洲田径锦标赛女子100米栏决赛延迟至当晚9时开赛。中国选手吴艳妮以13秒068的成绩获得季军。5月28日上午,吴艳妮以13秒07的成绩晋级决赛。赛后,她的母亲熊艳表示,比赛结果并不重要,只希望她尽快恢复,以最佳状态迎接未来的…

AMBA-AHB仲裁机制

前文 仲裁机制保证了任意时刻只有一个 master 可以接入总线。Arbiter 决定了哪个向其发出接入请求的 master 可以接入总线,这通过优先级算法实现。AHB规范并没有给出优先级算法,需要设计者根据具体的系统要求定义。一般情况下 arbiter 不会中断一…

长期口臭可能是你的身体在求救 三步教你自救

有些人表面光鲜亮丽一张嘴却让人“退避三舍”尤其在晨起、空腹时口臭问题更明显不仅尴尬还可能暗藏健康隐患科学应对口臭还你清新口气!先对号入座你的口臭是临时客串还是疾病信号?1、生理性口臭:临时“小插曲”饮食作祟:大蒜、洋葱、韭菜等含硫化合物的食物,会通过血液循环…

辰亦儒老婆曾之乔回应二胎计划 随缘就好

5月29日,女演员曾之乔出席活动时分享了她的产后生活,表示生完宝宝后感到非常幸福,并透露怀孕期间给儿子取的小名叫“甜蜜”。她还提到与丈夫辰亦儒采取“责任制”方式照顾宝宝,两人会排班负责。对于是否计划要二胎,她表示一切随缘。曾之乔和辰亦儒在2009年合作《爱似百汇》…

kafka学习笔记(三、消费者Consumer使用教程——从指定位置消费)

1.简介 Kafka的poll()方法消费无法精准的掌握其消费的起始位置,auto.offset.reset参数也只能在比较粗粒度的指定消费方式。更细粒度的消费方式kafka提供了seek()方法可以指定位移消费允许消费者从特定位置(如固定偏移量、时间戳或分区首尾)开…

旅客私自携带230万美元现金入境 折合人民币超1600万元

近日,皇岗海关在福田口岸旅检渠道查获一名旅客违规携带未申报的230万美元现金入境,折合人民币超过1600万元。皇岗海关关员在福田口岸旅检进境大厅对旅客及行李物品进行监管时,发现一名经“无申报通道”通关的旅客携带的行李机检图像异常。随后,该旅客被引导至查验区进一步检…

精度更高、速度更快!从RT-DETR到RF-DETR全面突破实时检测瓶颈

【导读】 YOLO虽快,但其依赖的非最大抑制(NMS)后处理拖累速度与精度。DETR架构首次实现无需NMS的“一对一”预测,却受限于计算成本。如今,RT-DETR 通过混合编码器、不确定性查询选择等创新突破实时瓶颈;RF…

提升搜索效率:深入了解Amazon Kendra的强大功能

从智能文档搜索到精准的自然语言处理,Amazon Kendra为企业提供了一个强大的解决方案,帮助我们突破传统搜索引擎的局限,快速实现信息的高效整合与检索,接下来让我们一起探索Amazon Kendra如何成为工作中的得力助手,提升…

社群营销:信任比流量值钱

你肯定见过那种群里天天甩链接的,动不动就所有人,点进去全是促销信息——这种玩意儿不叫社群营销,顶多是广告轰炸。 搞社群得先把自己当人,也把别人当人。别整那些机器人自动回复,谁半夜两点发消息都秒回,…

嵌入式工作项目中的线程管理(监控线程和重启线程的具体实现)

嵌入式工作项目中的线程管理(监控线程和重启线程的具体实现) 1. 背景 环境:ARMv7,Linux; 软件所处位置:应用层; 问题出现概率:偶先,概率极小; 问题描述: 一个负责校时的进程,里面有一个是网络校时的线程和一个 GPS 校时的线程,还有处理其他一些业务的线程;出现…

【图像处理基石】立体匹配的经典算法有哪些?

1. 立体匹配的经典算法有哪些? 立体匹配是计算机视觉中从双目图像中获取深度信息的关键技术,其经典算法按技术路线可分为以下几类,每类包含若干代表性方法: 1.1 基于区域的匹配算法(Local Methods) 通过…

Unity QFramework 简介

目录 什么是MVC模式? QFramework 架构提供了 Model 的概念 QFramework 架构引入 Command 的方式 QFramework 架构引入 Event事件机制 四个层:表现层、系统层、数据层、工具层 委托和回调函数的关系 命令和事件的区别 工具篇 QFramework整体基于M…

非线性声学计算与强化学习融合框架:突破复杂环境人机交互的新技术

随着人工智能的快速发展,尤其是在深度学习和强化学习领域,声学计算和人机交互进入前所未有的扩展和创新阶段。尽管传统声学方法取得了显著成功,但这些线性或准线性方法在实际环境中往往存在关键的不足,尤其在动态、复杂或混响环境…

广东河源再发3.0级地震 近期无大震风险

广东河源再发3.0级地震 近期无大震风险!中国地震台网正式测定,5月30日2时21分在广东河源市源城区(北纬23.72度,东经114.68度)发生3.0级地震,震源深度10千米。河源市地震局表示,目前未收到人员伤亡和财产损失报告。该局会商研判认为,本次地震是前一天5月29日13时17分发生…

极致视频压缩日记 - 1.2GB=>200MB - 低码率高画质 - 批量多目录自动转换脚本

效果图 格式av10.3M的码率,跟格式h.2645M的码率,画质竟然差不多! GPU拉满全速编码! 目标 1.视频瘦身储存,画质不变 2.自动批量压缩视频,多层目录递归处理 (脚本https://www.amjun.com/2327.html) 3.免费 (…

媒体:升学不再只有“独木桥” 职教贯通培养拓宽道路

媒体:升学不再只有“独木桥” 职教贯通培养拓宽道路!随着职教贯通培养模式的不断推进,我国学生的升学选择已经更加多元。高考不再是唯一的出路。5月28日,教育部公布2025年全国高考报名人数为1335万人,比2024年的1342万人减少7万人。这是自2017年以来高考报名人数首次减少。…

多地曝“谷子店”闭店消息 “谷子经济”面临转型挑战

手办模玩生产车间里,年轻人正在参与“谷子”涂装工作。消费者正在挑选“谷子”。“谷子经济”还能像过去那样“丰收”吗?挣“二次元”的钱,难不难?不只是做单一的“谷子”销售,还自主开发产品,做IP代运营,一步一步介入“谷子经济”全链条。自己开发App,为平台用户建立“…