最近读到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的方法就能得到反射图像了。