Project introduction
眼底血管分割是一个成熟的分割主题任务,在网络上已经有很多的解决方案这里我只是记录一下我的解决方案,眼底血管有明显的形态学特征,但是血管的粗细不等给分割造成了难度,同时也会存在其他血管结构和视神经盘的干扰提高了分割任务的难度。
目前的解决方案有很多,使用各种方法都可以做到有效的提取,我才用比较常见的三种方法:
匹配滤波、形态学、深度学习,下面详细介绍
匹配滤波
使用匹配滤波也就是卷积滤波的方式,对血管边缘进行有效的提取从而提取出整个血管结构
优点:计算速度快,可以有效提取出血管,对于细小血管的检测能力尚可
缺点:错分是神经盘,对于细小血管分割能力较差(可以尝试调整卷积核大小)
这一段是参考的了我站的一篇帖子:
https://blog.csdn.net/qq_40511157/article/details/102770108?ops_request_misc=%7B%22request%5Fid%22%3A%22162641860416780357214110%22%2C%22scm%22%3A%2220140713.130102334…%22%7D&request_id=162641860416780357214110&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-102770108.first_rank_v2_pc_rank_v29&utm_term=眼底血管分割&spm=1018.2226.3001.4187
形态学处理
使用开包和闭包算法模糊图片然后使用减法突出血管结构
优点:简单,计算快,可解释性强
缺点:形态学操作噪点较多(中值滤波解决),二值化困难(硬搞吧)
这一段也是来源我站的一篇帖子
https://blog.csdn.net/virus1175/article/details/107126348?ops_request_misc=%7B%22request%5Fid%22%3A%22162641902416780357223650%22%2C%22scm%22%3A%2220140713.130102334.pc%5Fall.%22%7D&request_id=162641902416780357223650&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-2-107126348.first_rank_v2_pc_rank_v29&utm_term=眼底血管分割+形态学&spm=1018.2226.3001.4187
Unet
深度学习end to end的结构就十分不讲道理,不知道计算过程但是可以得到一个较好的分割结果
但是使用的数据集较小,需要数据扩增,分割任务对于原图像和mask需要做同样的操作才能保证训练的收敛。这里采用的扩增方式为patch进行扩增
优点:分割效果好,不受干扰
缺点:计算时间长,算力大
这一部分参考了隔壁的一篇帖子
https://zhuanlan.zhihu.com/p/346583714
预处理
Green Channel or GrayScale
可以使用绿色通道或者将图片做灰度化处理,此处没有详细对比两种方法的分割差异
Gamma Correction
提升图片整体亮度和暗度,也可以区分血管与周围组织的对比度
Contrast Limited Adaptive Histogram Equalization
可以有效地进行灰度拉伸提高血管与周围组织的对比度
Median Filter & Gaussian Filter
使用高斯滤波可以消除噪声,但是形态学操作不宜使用高斯滤波,形态学要使用中值滤波
预处理的流程有很大的发挥空间,我在处理图片时没有按照代码中的处理流程,选取了自己的处理方式,得到的结果也没有相差很多
Result & Summary
最后的结果对比
匹配滤波:DICE:0.74 TPR:0.70 TFR:0.97
形态学:DICE:0.74 TPR:0.70 TFR:0.98
UNet:DICE:0.87 TPR:0.87 TFR:0.97
最后UNet没有做完整数据集的验证仅验证了6张图片,所以整个数据集的值可能还会要再低一点
总的对比,两种非深度学习方法也取得了较好的结果,但是一味的使用深度学习也失去了一些意义……
Other Methods
还尝试了分水岭,不太行,但是提取掩膜倒是很方便
尝试了graphcut和region growth,均只能分割出较粗的血管对于细小的血管分割能力不足
但是以上两种方法在其他文献中均能够使用,至少region growth的方法是很符合常识的,或许可以尝试增加每次判断的点的个数,以半径为2的球形添加需要判断的点……但是region growth需要手动操作选出种子点,不太智能……
其他的使用svm进行分割,最朴素的分割思想,pixel by pixel 对于每一个像素点进行分类,最后拼出整张图片,考虑点周围的像素的信息,如均值,方差,余弦变换值等等,使用SVM需要注意的这是一个非平衡样本的处理所以对于样本点的选取也决定了训练模型的质量和分割能力,由于时间问题并没有在我的project里面解决这个问题……不过SVM的分类方法的确值得尝试,毕竟svm还是yyds……
感谢以上博主分享的开源代码,博文中如果有任何说的不妥当地方还请大家多多指教…… 图1 使用深度学习的分割结果 图2 匹配滤波的结果
图3 使用形态学分割的结果
|