视网膜眼底图像的一种检测方法,学习笔记(一)

news/2024/11/21 2:24:05/

    最近读到H.Narasimha-Iyer, Ali Can等人的文章《Robust Detection and Classification of Longitudinal Changes in Color Retinal Funds Images for Monitoring Diabetic Retinopathy》,把自己的思路和想法整理整理,放在这里。

    好长的题目啊,好多生僻的词啊。总的来说这篇文章讲的是一种检测视网膜眼底图像病灶区域的一种算法。这篇文章实现的算法处理效果很好。引用一段作者自己的话,其实是我自己不想翻译了吐舌头“A multiobserver validation on 43 image pairs from 22 eyes involving nonproliferative and proliferative diabetic retinopathies, showed a 97% change detection rate, a 3% miss rate, and a 10% false alarm rate. The performance in correctly classifying the changes was 99.3%.”。

    算法的主要流程图如下:

    简要的说,就是先对每一幅输入的图像首先检测出血管,视神经盘(optic disk)和视网膜中央凹(fovea)。对于后两个结构下图可以看到,那个亮的圆圈就是视神经盘,最黑的那一块就是视网膜中央凹。检测出这三个结构后,接下来的操作要把这三个结构剔除,也就是设为特定的值(0)以示掩盖住,然后对图像进行配准。接下来就是要进行光照矫正,以去除光照的干扰,获得反射图像,即物体本来的面目。最后对获得的反射图像进行贝叶斯变化检测和分类。

两幅图像中央都有一块黑斑,这就是视网膜中央凹

    对血管的检测这些人把这个算法发表在了另一篇文章《Robust Model-Based Vasculature Detection in Noisy Biomedical Images》(他们的题目怎么都这么长啊...)。对视神经盘和视网膜中央凹的检测在本文中也有描述,基于血管脉络的配准方法在这帮人的另一篇文章《A feature based robust hierarchical algorithm for registration pairs of the curved human retina》也有描述。我在这里主要讲讲这篇文章中对光照建模的方法。

    物体光照模型如下描述:

    

    F代表的是接收到的图像,即待处理的图像,I代表的是图像的光照分布,R代表的是物体的反射图像,即物体真实面目,λ代表的是第几个光谱图像,可认为是R,G,B。我们看到这个模型和Retinex算法的模型是一样的,思路也一样,模拟出一个光照分布,然后在对数域中用待处理图像减去光照分量,得到反射分量再做个exp()返回正常的数域。Retinex算法是将原图的高斯模糊作为光照分量,而本文中的方法是多项式近似。

    如果不算病灶区域的话,我们去除了血管,视神经盘(白色亮圆盘)和视网膜中央凹(上图中央黑的区域)之后,可以认为剩下的是一种结构,所以造成剩下部分的图像亮度不一致的原因就是光照分布不同了,而恰巧这结构足够大所以我们就能用这些像素点来建模。

    文章中说,通过实验作者发现,用四阶的多项式来模拟光照因素效果最好。用高中的排列组合的知识知道,二元的四阶的多项式有15个待定系数。接下来就是一个模型训练的问题了。我们模型的类型确定了,是四阶15个系数的多项式。也就是说,我们提取了15个特征,然后我们的训练数据是这幅图像上的点(那三个结构的点除外),我们就用这些点来训练我们的模型。我们当然也可以用normal equation的方法来直接计算最优的系数。如下:

  

    P表示的是最优的系数向量,有15个元素。FL是列向量,它是N*1维的,N=n*m,图像大小是n*m,FL的值是对应位置的图像值的对数(对某一特定的通道)。当然,这个向量也应该把对应那些结构的点设为0值。S是N*15的矩阵,我们用S*P来近似FL,W是mask矩阵,是N*N维的,W是一个对角阵,如果FL(k,1)为0,则W(k,k)也为0,否则为1。

    经过上述运算我们就得到了光照的模型。回顾一下,这个方法所做的就是将mask之后的图像看作是关于(x,y)的一个个训练样本,我们就是通过这些样本训练出一个模型来拟合这些数据。但是,我们拟合的目的不是为了找到一个最好的模型以求最精确的表示什么东西。我们要做的就是有一定差别的表示这幅图像,模糊这幅图像并保持和原图的某些一致性。我们可以看到,文章中的做法是用多项式来拟合,如果我们用三角函数来拟合这不就是傅立叶变换么!所以,我们可以知道,文章用四阶的多项式实质是提取一些低频分量,用这些低频分量来表示光照分布。现在我们知道,为什么文章只取四阶了。当然,这些低频分量不仅仅是光照,还有一部分是图像的低频部分,文章还对这一点进行了矫正。矫正方法是将得到的反射图像调整到平均值为1。至于怎么调整,文章没说。原文如下:“After the attenuation and illumination source induced lighting pattern is corrected, the estimated retinal reflectance for each color channel has a mean value of 1. This is because the reflectance component in (2) has been modeled as a Gaussian process with mean 1.”(2)式即上述光照模型。

    以上都是假设病灶区域不大的前提下做的,当病灶区域大的时候文章中提出了一种迭代的把病灶区域也mask掉的方法。在G通道中操作,每次把G通道值很高的和很低的像素在W中的对应位置置0,即排除出去。依次操作,直到剩下的部分的置没有大的变化。说实话,我也不太理解这部分是怎么做的,所以就只能说的比较模糊了。

    把以上操作都做完,就得到了光照图像。然后按照类似Retinex的方法就能得到反射图像了。






http://www.ppmy.cn/news/651234.html

相关文章

智慧屏是什么意思?

智慧屏也叫智屏,“三条曲线论”表示电视行业存在三条曲线,第三条曲线则是设备属性的进化,电视将发生交互方式的革命,电视将不再是电视。 跟传统电视相比,智慧屏除了没有开机广告,可以观看电视节目&#xf…

ips细胞再生视网膜研究进展

2017年11月6日 全球首次:日本用他人iPS细胞完成视网膜移植手术 据日媒报道,日本理化学研究所等组成的团队近日透露,关于使用他人诱导多能干细胞(iPS细胞)制成的视网膜细胞移植给患有严重眼疾患者的全球首次临床研究,至今为止已…

在 Mac 上安装 K8S

本篇文章将介绍如何在 Mac 上使用 minikube 搭建单机版的 Kubernetes。 安装步骤 安装 Docker 安装 docker 主要是用于提供容器引擎。直接下载安装即可。 下载地址 安装 Kubectl 推荐使用 home brew 安装 brew install kubectl可以使用下面的命令查看是否已经安装完毕 …

移远通信再推模组新品,全新5G智能模组SG530C-CN智创全景智慧生活

6月28日,在2023 MWC上海展会首日,移远通信再次宣布推出模组新品。 此次推出的全新5G智能模组SG530C-CN在连接能力、算力、多媒体性能与成本效益等层面都呈现较高水平。该模组将在智慧零售、车载后装、娱乐/直播、手持终端、工业AI等行业与应用场景上大有…

单片机应用编程技巧---MCU专家答网友问

单片机应用编程技巧---MCU专家答网友问 单片机应用编程技巧 Holtek MCU专家--邓宏杰答网友问 (转自电子工程专辑网站) 1. C语言和汇编语言在开发单片机时各有哪些优缺点? 答:汇编语言是一种用文字助记符来表示机器指令的符号语…

单片机应用编程技巧100问

单片机应用编程技巧100问单片机应用编程技巧100问1.C语言和汇编语言在开发单片机时各有哪些优缺点?答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。…

【CesiumJS入门】(6)修改3D Tiles(tileset)的位置及高度

前言 在之前一篇博客中【CesiumJS入门】(4)加载3D Tiles并获取tileset,我们成功得加载了3D Tiles数据集,本篇中,将会向大伙儿介绍tileset位置的修改与恢复: 直接上代码了 /** Date: 2023-06-28 19:35:03*…

Iceberg从入门到精通系列之六:Flink集成Iceberg

Iceberg从入门到精通系列之六:Flink集成Iceberg 一、下载Flink二、解压Flink 安装包三、配置环境变量四、激活环境变量五、下载Iceberg flink jar包六、部署Iceberg flink jar包七、修改flink配置八、启动flink九、启动flink sql client 一、下载Flink 下载Flink&a…