• 最近读到

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


    
    
    
    展开全文
  • 眼底图像处理1

    2017-10-12 11:47:01
    Multiscale sequential convolutional neural networks for simultaneous detection of fovea and optic disc原文链接:Multiscale sequential convolutional neural networks for simultaneous detection of fovea ...

    Multiscale sequential convolutional neural networks for simultaneous detection of fovea and optic disc

    原文链接:Multiscale sequential convolutional neural networks for simultaneous detection of fovea and optic disc

    1. Deep Learning的方法做视盘和黄斑中心凹的检测
    2. 基于的数据库MESSIDOR和Kaggle
    3. 图片预处理时,为了避免颜色引入的额外复杂度,都先预处理成灰度图像,然后再做图像增强

    这里写图片描述

    1. 网络结构中,先回归出两个矩形区域,分别是视盘和黄斑的矩形区域,然后分别回归出中心。

    这里写图片描述

    1. 网络采用比较简单的形式,降采样的程度也不深,只做了两层降采样,这也是可以理解的,毕竟在眼底图像中,黄斑和视盘的范围还是很大的。当然文章感觉也不是那么严禁,要想把4和5对上还挺难的。不过毕竟是提供一种思路,可以自己尝试下

    这里写图片描述

    展开全文
  • 眼底图像处理时,先进行图像的预处理,需要提取血管灰度图像进行分析,但图像可能比较暗,还有噪音。 需要进行灰度图像增强,对噪音区采取图像平滑,消除图像中噪声的干扰,或者降低对比度。 对眼底血管的边缘...

    在眼底图像处理时,先进行图像的预处理,需要提取血管灰度图像进行分析,但图像可能比较暗,还有噪音。

    需要进行灰度图像增强,对噪音区采取图像平滑,消除图像中噪声的干扰,或者降低对比度。

    对眼底血管的边缘末梢,需要进行图像锐化,提高对比度。

    即当邻域中心像素灰度低于它所在的领域内其它像素的平均灰度时,将此中心像素的灰度应进一步降低,

    当邻域中心像素灰度高于它所在的邻域内其它像素的平均灰度时,将此中心像素的灰度应被进一步提高,

    以此实现图像的锐化处理。

    大家知道,函数的一阶微分描述了函数图像是变化方向,即增长或者降低;

    而二阶微分描述的则是图像变化的速度,急剧增长下降还是平缓的增长下降。

    图像的一阶偏微分和推出的二元函数微分:

    一阶微分法能够用来检测图像边缘是否存在。

    那么二阶微分法,也就是拉普拉斯算子就可以确定边缘的位置。(有的文章中称下式为拉普拉斯掩膜中心系数)

    据此我们可以推出依据二阶微分能够找到图像的色素的过渡程度,例如白色到黑色的过渡就是比较急剧的。

    拉普拉斯锐化图像处理就是这个思想。

    根据图像中某个像素的周围像素到此像素的突变程度有关,我们可以进行图像边缘检测。运用拉普拉斯增强图像的细节,找到图像的边缘。但是有时候会把噪音也给增强了,所以在锐化前对图像进行平滑处理。

    这样可以找到一个模板矩阵:

    这个成为四邻域也就是上面的二阶微分法

    这个是八邻域。

    从上面的两种模板中就可以看出,如果一个黑色平面中有一个白点,那么模板矩阵可以使这个白点更亮。

    由于图像边缘就是灰度发生跳变的区域,所以拉普拉斯模板对边缘检测很有用。

    八邻域的表示法为:将算得的值替换原(x,y)处的像素值,可以得到类似边界的地方,然后根据下式得到锐化图像:

     

    大家下面可以从选取各拉普拉斯算子和执行的结果图像中体会。图1是源图

    图2中间有亮区,因为kernel1算子是小数。图3 没有这个问题,其kernel2算子是整数,

    图6 中部分血管有反常的白点,kernel 5算子中有-1的原因

    def laplasFilter(img_src):
    
        kernel1 = np.array(([0.0625, 0.125, 0.0625],
                           [0.125, 0.25, 0.125],
                           [0.0625, 0.125, 0.0625]),
                          dtype="float32"
                          )
        kernel2 = np.array(([1, 2, 1],
                           [2, 4, 2],
                           [1, 2, 1]),
                          dtype="float32"
                          )
    
        kernel3 = np.array(([1, 2, 1],
                           [2, 8, 2],
                           [1, 2, 1]),
                          dtype="float32"
                          )
    
        kernel4 = np.array(([0, 1, 0],
                           [1, 8, 1],
                           [0, 1, 0]),
                          dtype="float32"
                          )
        kernel5 = np.array(([-1, 1, -1],
                           [-1, 8, -1],
                           [-1, 1, -1]),
                          dtype="float32"
                          )
    
        img_dst1 = cv2.filter2D(img_src, -1, kernel1)      
        image_Enhance1 = img_src + img_dst1
        cv2.imshow("laplas1", image_Enhance1)
    
        img_dst2 = cv2.filter2D(img_src, -1, kernel2)     
        image_Enhance2 = img_src + img_dst2
        cv2.imshow("laplas2", image_Enhance2)
    
        img_dst3 = cv2.filter2D(img_src, -1, kernel3)      
        image_Enhance3 = img_src + img_dst3
        cv2.imshow("laplas3", image_Enhance3)
    
        img_dst4 = cv2.filter2D(img_src, -1, kernel4)     
        image_Enhance4 = img_src + img_dst4
        cv2.imshow("laplas4", image_Enhance4)
    
        img_dst5 = cv2.filter2D(img_src, -1, kernel5)     
        image_Enhance5 = img_src + img_dst5
        cv2.imshow("laplas5", image_Enhance5)
    源图像
    

           
     

    展开全文
  • 眼底图像-血管检测

    2019-09-22 11:53:55
    眼底图像中心区进行血管的检测。用了HoughLinesP()直线检测法,附上执行时的三张图 代码如下: # 分离出 图像中心的绿色通道 img_ori = cv2.imread('./dataset/1.jpg') img_resized = cv2.resize(img_ori, ...
    对眼底图像中心区进行血管的检测。用了HoughLinesP()直线检测法,附上执行时的三张图
    代码如下:
    # 分离出 图像中心的绿色通道
    img_ori = cv2.imread('./dataset/1.jpg')
    img_resized = cv2.resize(img_ori, (width, height), interpolation=cv2.INTER_CUBIC)
    cv2.imshow('resize', img_resized )
    b,g,r = cv2.split(img_resized)
    
    # 进行 CLAHE 处理,提取绿色通道
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
    img_clahe_green = clahe.apply(g)
    cv2.imshow('green', img_clahe_green)
    # 检测图像绿色通道中的血管,画直线
    line_detect_possible(img_clahe_green ,11)

    --------下面是血管检测函数 ------------------------

    在整图中提取各小窗口的图像,用HoughLinesP()来检测小窗口的直线,然后在整图中画出来,

    比在整图中用HoughLinesP()检测效果好。

    def line_detect_possible(img_src,size):
        width = img_src.shape[0] 
        height = img_src.shape[1]
        gaus = cv2.GaussianBlur(img_src, (3, 3), 0)
        edges = cv2.Canny(gaus, 40, 230, apertureSize=3)
    
        img_new1 = edges
        line_num = 0
    
        for i in range(0, width - size,size):
            for j in range(0, height - size,size):
                img_region_ij = img_new1[i:i + size, j:j + size]  # 提取 小窗口内图像
                # 函数将通过步长为1的半径和步长为π/180的角来搜索所有可能的直线
                cv2.imshow("regionij", img_region_ij)        # 调试时查看用,实际运行时删除。
                lines = cv2.HoughLinesP(img_region_ij, 1, np.pi / 180, 5, minLineLength=5, maxLineGap=5)
                if (lines is None) or (len(lines) == 0):
                    continue                 # 小窗口内无直线,继续到下一个窗口
                else:
                    for x1, y1, x2, y2 in lines[0]:
                        line_num += 1
                        cv2.line(img_new1, (i+x1, j+y1), (i+x2, j+y2), (0, 255, 0), 2)
    
        cv2.imshow("line1", img_new1)
        return line_num

    展开全文
  • 图像边缘检测总结 ...边缘检测图像处理和机器视觉最基本的操作,边缘检测不仅大小减少要处理的信息同时要保留了图像中物体的形状信息。 2. 边缘定义及类型 边缘在图像中是指,图像中灰度发生急

    图像边缘检测总结

    1. 前言

    边缘是图像最重要的特征之一,光线的变化显著影响了目标区域的外观,但是不会改变目标的边缘。人的视觉系统对边缘也是敏感的。边缘检测是图像处理和机器视觉最基本的操作,边缘检测不仅大小减少要处理的信息同时要保留了图像中物体的形状信息。

    2. 边缘定义及类型

    边缘在图像中是指,图像中灰度发生急剧变化的区域,或者周围像素灰度有阶跃变化或屋顶变化的像素集合。
    边缘可以看作一个区域的结束,另一个区域的开始。利用边缘的特征,可以对图像进行分割。根据定义可以知道,利用各种算法检测到的边缘,并不代表目标的实际边缘。由于图像是二维的,而目标实物是三维的,从三维到二维的投影,已经造成了信息的丢失,再加上成像过程受光照、噪声的影响,使得有边缘的地方不一定被检测出来,而检测出来的边缘也不一定代表实际边缘。
    图像的边缘有方向和幅度两个属性,沿边缘方向像素变化平缓,垂直于边缘方向像素变化剧烈。因此,利用图像边缘的变化特性,通过微分算子可以将边缘检查出来。
    常见的边缘种类有:

    • (1)阶梯状:边缘处于图像中两个具有不同灰度值的相邻区域之间;
    • (2)脉冲状:主要对应细条状的灰度突变区域;
    • (3)屋顶状:边缘上升或下降比较缓慢。
      在这里插入图片描述

    3. 边缘检测种类

    边缘检测通常用一阶或二阶导数来检测边缘。一阶导数以最大值对应边缘位置,二阶导数以过零点为边缘位置。常见的边缘检测算子有:Roberts算子、Prewitt算子、Sobel算子、LoG算子、Canny算子等等。

    4. 图像梯度及梯度算子

    边缘检测是检测图像局部显著变化的最基本运算,在一维的情况下,阶跃边缘同图像一阶导数局部峰值有关。梯度是函数变化的一种度量,而一幅图像可以看作是图像连续函数的取样点序列。梯度是一阶导数的二维等效式。设ff为输入图像GG为图像ff(x,y)(x,y)处寻找边缘的强度,图像梯度的矢量定义如下:
    G=[GxGy]=[xy](1) G = [\frac{G_x}{G_y}] = [\frac{\partial x}{\partial y}] \tag{1}
    f\triangledown f为图像的梯度,向量表示如下:
    f=grad(f)=[gxgy]=[fxfy](2) \triangledown f = grad(f) = \begin{bmatrix} g_x \\ g_y \end{bmatrix} = \begin{bmatrix} \frac{\partial f}{\partial x} \\ \\ \frac{\partial f}{\partial y} \end{bmatrix} \tag{2}
    其中f\triangledown f表示图像ff(x,y)(x,y)处的最大变化率的方向。
    G(x,y)G(x,y)为梯度f\triangledown f的大小,即梯度向量方向变化率的值,则:
    G(x,y)=mag(f)=gx2+gy2(3) G(x,y) = mag(\triangledown f) = \sqrt{g_x^2 + g_y^2} \tag{3}

    图像梯度的数学简单推导:
    对于以函数f(x)f(x)在点x处的导数近似:将函数f(x+x)f(x+\triangle x)展开为xx的泰勒级数,令x=1\triangle x = 1,且只保留该级数的线性项,则函数f(x)f(x)的梯度f\triangledown f计算为:
    f=fx=f(x+1)f(x)(4) \triangledown f = \frac{\partial f}{\partial x} = f(x + 1) - f(x) \tag{4}

    由梯度的推导及矢量分析可以知道,梯度的方向定义为:
    α(x,y)=arctangygx(5) \alpha(x,y) = \arctan\frac{g_y}{g_x} \tag{5}
    其中,gxg_x可以近似为:
    gx=f(x,y)x=f(x,y+1)f(x,y)(6) g_x = \frac{\partial f(x,y)}{\partial x} = f(x,y+1) - f(x,y) \tag{6}
    gyg_y可以近似为:
    gy=f(x,y)y=f(x,y)f(x+1,y)(7) g_y = \frac{\partial f(x,y)}{\partial y} = f(x,y) - f(x + 1,y) \tag{7}

    上述gxg_xgyg_y表达式的有关值可以使用:[11]\begin{bmatrix} -1 \\ 1 \end{bmatrix}[11]\begin{bmatrix} -1 & 1 \end{bmatrix}对图像f(x,y)f(x,y)滤波得到。
    用于计算梯度偏导数的滤波模板,通常称为梯度算子、边检检测算子。

    5. 图像边缘检测的一般步骤

    • (1)滤波:边缘检测算法主要基于一阶和二阶导数,但是导数对噪声很敏感,因此需要根据噪声的特点通过相应的滤波器来改善与噪声有关的边缘检测算子性能;
    • (2)增强:增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将邻域(或局部)强度有显著变化的点突出来,边缘增强一般通过计算梯度幅值来完成。
    • (3)检测:在图像中有许多点的梯度幅值比较大,而这些点在特定的应用领域中并不都是边缘,所以应该用某种方法来确定哪些是边缘点。最简单的边缘检测判据是梯度幅值阈值判据。
    • (4)定位:如果某一应用场合要求确定边缘位置,则边缘位置可以子像素分辨率上来估计,边缘的方位可以被估计出来。

    6. 图像边缘的意义

    对图像进行边缘检测的意义很重要。在医学图像处理领域,它在图像匹配、肿瘤病灶确定、造影血管检测、冠心病诊断、左心室边缘抽出等方面占有举足轻重的地位,它还广泛用于卢脑三维重建前的边缘抽取,尘肺的自动侦测,脑灰质脑白质的抽取,各种时期癌症细胞的识别,通过眼底视网膜来诊断糖尿病等,在疾病的辅助诊断及观察治疗效果等方面起了重要作用。 此外,边缘在模式识别、机器视觉等中有很重要的应用。边缘是边界检测的重要基础,也是外形检测的基础。边缘广泛存在于物体与背景之间、物体与物体之间、基元与基元之间,因此它也是图像分割所依赖的重要特征。边缘检测对于物体的识别也很重要的。主要有以下几个理由:首先,人眼通过追踪未知物体的轮廓而扫描一个未知的物体。第二,经验告诉人们:如果人们能成功得到图像的边缘,那么图像分析就会大大简化。图像识别就会容易得多。第三,很多图像并没有具体的物体,对这些图像的理解取决于它们的纹理性质,而提取这些纹理性质与边缘检测有着极其密切的关系。

    7. 常见图像边缘检测算法及实现

    展开全文
  • ​function varargout = Line(varargin)% LINE M-file for Line.fig% LINE, by itself, creates a new LINE or raises the existing% singleton*.%% H = LINE returns the handle to a new LINE or the handle to% ...
  • 最近在学习和使用 CV2 图像处理的各种方法,整理出如下功能列表。 前面18章的功能函数基本都使用了,后面几章的还没有使用过。加油吧! opencv-python 函数总览 函数名 函数 Chapter 1:图片 读入图像 cv2....
  • 图像的斑点检测

    2020-07-08 22:16:30
    对图像进行斑点检测,搞图像处理的人应该懂,是一本书上的源程序,嘿嘿
  • Unet是一种自编码器网络结构,用于图像分割任务,比如眼底图像血管分割。这位大佬已经开源了非常棒的该任务代码,但是代码比较复杂,我初学菜鸟硬是啃了好几天才啃下来。我把代码重写了一遍,仅保留最必要的代码,并...
  • 在 http://blog.csdn.net/piaoxuezhong/article/details/78385517 中介绍的自适应对比度增强...该方法如果投用到眼底血管图像中,理论上可以将血管增强,突出图像中血管部分。下面是我的测试结果: A Ret
  • .1 边缘检测技术概况 计算机视觉处理可以看作是为了实现某一任务从包含有大量的不相关的信息中抽出对我们有用的信息。这就意味着要扔掉一些不必要的信息,所以我们需要尽可能利用物体的不变性质。而边缘就是最重要...
  • 糖尿病眼底图片识别

    2019-03-30 16:43:38
    眼底图像中分量图像的提取与分析 为了开发更加适合不同来源图像的特征区域的分割提取,通常需要对不同的颜色空间进行转换,根据不同的算法选择合适的通道来处理,同时做为预处理操作之前的步骤,也为后面图像的...
  • 【英文说明】https://github.com/orobix/retina-unet#retina-blood-vessel-segmentation-with-a-convolution-neural-network-u-net 【更新】针对Python3版本对此... 【注意事项】 1.运行run_training.py或run_tes...
  • 眼底图像亮度校正后,依然存在渗出物和其他部分对比不明显的问题。尤其是小渗出物的边缘特性比较偏弱。 采用多尺度顶帽变换的方法进行图像对比度增强, 取亮度校正后的图像的对比度最高的绿色通道灰色图I_g。 ...
  • 视网膜眼底图的数据库介绍 **视网膜血管分割方法是眼科计算机辅助诊断和大规模疾病筛查系统的基础,针对彩色视网膜眼底图的分析,有助于医生在对于人体的无伤害医学诊断,尤其在人类的高血压、青光眼、糖尿病等疾病...
  • 项目流程主要分为两部分:预处理、分割提取。预处理的任务是滤除噪声、增强图像对比度及增强血管边缘,以便...分割提取的任务是处理经过预处理的眼底图像,提取分割出血管,包括:Frangi滤波、阈值处理、形态学处理
  • 膨胀、腐蚀、开、闭运算是数学形态学最基本的变换。 本文主要针对二值图像的形态学 膨胀:把二值图像各1像素连接成分的边界扩大一层(填充边缘或0像素内部的孔);...以下参考论文:《数学形态学在图像处理中的应
  • 医疗上对血管图像进行分割常用的方法有:基于血管跟踪的方法、基于匹配滤波的方法、基于形态学处理的方法、基于形变模型的方法和基于机器学习的方法等 。本篇将介绍基于匹配滤波算法。 匹配滤波器(matched filter)...
  • 首先从图像质量大的分类方法来看,可分为主管评价和客观评价! 其次,客观评价又根据其对参考图像的依赖程度, 可分成三类。 (1)全参考:需要和参考图像上的像素点做一一对应的比较; (2)半参考:只需要和参考图像上的...
  • 形态学是一种比较新的图像处理方法,它可以以一种特定的形态和结构元素作为样本提取出对应的形状,从而得到我们所需要的结构,且它包含有四种基本操作:膨胀、腐蚀、以及开闭操作。基于这些操作,我们可以实现对...
1 2 3 4 5 ... 20
收藏数 415
精华内容 166
关键字:

眼底检测图像处理