文末有代码链接!!!!!
偷空写个帖子。
在处理全病理切片(WSI)的时候,经常会碰到一个问题。就是整个WSI很大,其中有很多空白的地方,深度学习或者传统的图像处理都不需要处理的,如何把这些空白区域去掉。
用的最多的是传统的灰度图OTSU分割,简单的说就是:
#img 是原始的RGB图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#添加高斯模糊是为了填补一些比较小的孔洞,而且使得边界更加平滑
blur = cv2.GaussianBlur(gray ,(20,20),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
后续还可以添加一些删除小连通域,填补孔洞的方式,使得掩膜更加合理。
但这种方式只能按照灰度值来提取组织区域,无法去除一些污染。比如说下面的:
类似的污染是由于临床医生为了方便查看,用马克笔画上去的。还有很多制片,扫描时导致的污染,在WSI处理的时候都非常普遍,用灰度的阈值很难去除。
那就有第二种方法。这个是来源于 Anant Madabhushi团队开发的工具,叫HistoQC。论文题目如下:
HistoQC: An Open-Source Quality Control Tool for Digital Pathology Slides
github上有开源的代码:
https://github.com/choosehappy/HistoQC 代码
其主要原理是利用图像的一些传统特征,比如说灰度直方图,熵值啥的对像素进行分类,从而判别是组织区域还是污染或者空白,论文中的效果如下:
这个工具在一些质量较好的片子上效果还是很不错的,而且速度还是比较快的。但我在别的肿瘤上用的时候效果就很让我失望,会删掉不少组织区域。
可以看到不少组织区域都被剔除了。
然后最近我用了第三种方法。
我自己挑了不少组织区域,空白和一些污染区域的图像,一共3万个patch左右,训练了一个分类模型。只分两类,一类是背景(包括空白和污染),另一类是组织。用的是resner34网络,训了10个epoches,大概10分钟吧(用的3090,所以比较快),就能得到一个很不错的分割结果。
可以看到,红框里面,有污渍的背景被很好的剔除了。在看一个:
红框中,马克笔和制片时的污渍都被很好的剔除了。
美中不足的是这个方式是基于patch来的,会有很明显的锯齿。但其实对我来说也无所谓,因为本来就是要切成patches来处理的,所以有锯齿也不影响。如果想要得到更加精细的边界,感觉可以用过CAM(也就是注意力机制的方式得到更加精细的轮廓)。
我自己的代码链接:github。