最近在跟老师做视网膜病灶检测的一个项目,其中一个环节是将两张不同时刻的视网膜图像(灰度图像)亮度对齐以方便后续的处理,即保持相同的组织变化后的灰度值基本相同而病变区域仍有较大的差异。在这个对齐图像亮度的环节中我主要应用了Retinex算法,也测试了一些图像,现在把我对Retinex算法的一些理解记录下来,方便自己日后查阅,也欢迎大家一起讨论。下边的是一些原始图像。

为什么Retinex算法可以用于对齐图像亮度

根据Retinex理论,人眼感知物体的亮度取决于环境的照明和物体表面对照射光的反射,其数学表达式为:

I(x,y)=L(x,y)*R(x,y) (乘,非卷积)                    (2-1)

  式中: I(x,y)代表被观察或照相机接收到的图像信号;L(x,y)代表环境光的照射分量 ;R(x,y)表示携带图像细节信息的目标物体的反射分量 。

将(2-1)式两边取对数,则可抛开入射光的性质得到物体的本来面貌,即有关系式 :

Log[R(x,y)] = Log[I(x,y)]-Log[L(x,y)];                      (2-2)

要求得R(x,y)只需得到L(x,y)即可,但是根据数学的理论,L(x,y)是不能够求得的,只能近似求出。我们用I(x,y)和一个高斯核的卷积来近似表示L(x,y)。所以R(x,y)可用下式表示:

R(x,y)=exp(Log(I(x,y))-Log(I(x,y)*G(x,y)))                                                                                  (2-3)

上式中*代表卷积,G(x,y)代表高斯核,最后我们看到的图像是对R(x,y)映射到[0,255]上的结果,一般取线性映射。

所以,笼统的讲,Retinex算法是去掉光照的影响,还原图像的本来面目。而待处理的图像中非病灶区域可以视作没有变化,即他们的“本来面目”是一样的,所以我们用Retinex算法恢复出它们的“本来面目”自然相同区域也就相同,病变区域就体现出不同了。

从数学上也可以证明。

I(x,y)和G(x,y)的卷积可以看作是高斯平滑。即L(x,y)中每一个点的值是I(x,y)中对应点高斯平滑后的值,也可以看作是以该点为中心的某个区域内的I(x,y)的加权平均,而权重由G(x,y)给出。计算R(x,y)的式2-3又可写作I(x,)/L(x,y),即R(x,y)的值是I(x,y)的值与它周围的点的相对关系。

再看高斯核G(x,y)高斯核有两个参数,核的大小size和高斯分布的均方差sigma,sigma影响的是对输入图像的加权方式,可以这样理解,sigma越大周围像素的权值越大。size影响的是计算某个R(x,y)的时候该点周围区域的大小。即该点的R(x,y) 的值仅与它周围size大小的区域有关。如果我们size取得比较小就会造成一个问题,就是在size区域内的点太单一。例如,该区域内全是值为255的点,另外一个区域内全是值为0的点,这样经过Retinex变换的结果两个点的值是相等的。但是在我们要处理的图像中,视网膜图像足够复杂,所以我们可以把size的大小设定为30X30。而取这个值是因为对于大部分的病灶在图上的大小不超过30X30。

设我们有两幅待处理的图像A和B,取A中的一个点P1(x,y),同位置B中的点为P2(x,y),假设P1和P2处在相同的没有病变的组织,P1和P2的值可能由于成像时候光照的变化造成P1和P2的值不同,但是由于P1和P2所在区域没有实质性的病变,所以它们周围的点的相对关系仍然比较固定。所以P1在以它为中心点的31X31的区域内的相对值应该与P2相当,这样经过Retinex算法P1和P2的值就基本相同了。

另外,我们也尝试过其他的方法,比如将两幅图像都进行直方图均衡化,以一幅图像为标准进行直方图规定化。但是效果不如应用Retinex算法来的好。这一点的原因我们还没有研究过。直观上的感觉就是Retinex保持了一些的局部特性吧,而均衡化和规定化是对全局做的。

下面是上边四幅图像经过Single Scal Retinex算法处理之后的图像。高斯核大小为30X30,sigma是30。对于上图中黑的非视网膜部分直接设定R(x,y)为1。当然还是残存了一些边界的。

Retinex的一些讨论

上述的讨论是在非常理想的情况下进行的。下面我们讨论一下有噪声的情况。可以看到,对于噪声点经过Retinex算法处理得到的仍然是噪声点,我们不讨论如何去除这些噪声点,只讨论这些噪声点对于变换后的图像的整体亮度的影响。

假设整幅图像只有一个噪声点(多个类似),这个噪点的值高于周围的点。经过Retinex算法处理后的该点的R1(x,y)(未映射到[0,255])必定高于正常情况的R(x,y)。现在考虑整幅图像中R1(x,y) 的值。由于是线性拉伸,所以如果R1(x,y)的值未达到整幅图像的处理后的最大值,它便不影响图像的灰度范围,只是一个亮的噪点。如果图像处理后的最大值由R1(x,y)决定,则其他点的值会由[0,255]被压缩到一个较小的范围内,范围的大小视R1(x,y)而定。但相对的比例关系不变。

虽然一个小小的噪点就会把我们看似美好的理论打破了,但是它只是将非噪声点的灰度值从原来的映射到[0,255]变成了另外一个值。并且重要的是我们将光照这个量基本去除了,因为光照的分布是不确定的,并且从某种意义上说,我们提取出了一些不变的局部特征。并且,如果想将处理后的图像对齐那直方图规定化就是一个很好的选择了,因为直方图规定化是从全局出发的,个别噪点影响不了大局。

另外,我们还要认识到,由于光照的不确定,即便是相同区域的对应点,它们的值也不一定相同。因为有了光照的影响之后,不同图像的对应点得到的R(x,y)会有差异,但一般来说,这个差异相不影响整幅图像R(x,y)的最大最小值。

Retinex在彩色图像上的一些局限性

下面简要介绍一下Retinex在彩色图像上的一些局限,这也是我为什么只用Retinex处理灰度图像的原因。

一般来说,应用Retinex处理彩色图像是分别对 R,G,B通道进行Retinex处理将得到的结果作为R,G,B通道。这种方式对于三个通道比较均衡的图像来说效果比较好。但是有的图像就是某一通道,如R通道分量特别小,然后经过Retinex强行将R通道调整到[0,255]区间,这样效果想想也不会太好。

为了克服这个缺点,人们开发了带彩色恢复的多尺度Retinex算法(MSRCR,Multi-Scale Retinex with Color Restoration), 具体算法我没有仔细研究过。http://www.cnblogs.com/Imageshop/archive/2013/04/17/3026881.html,这篇文章是一个关于Retinex算法的综述,里面介绍了一种MSRCR算法,并实现了且附有下载。我试验过几幅图像,改进不是很大,结果就不放在这里了。

以上是我对Retinex算法的一些理解,欢迎批评指正。



对Retinex算法的一些理解相关推荐

  1. Retinex、log对数变换、直方图均衡化区别,边缘增强Retinex算法与拉普拉斯算法联系、均衡化与亮度调节算法、大津阈值计算

    1.其中Retinex算法具有的功能:动态范围压缩(即滤掉了低频部分,提取了高频).色调再现(即还有图像色彩):具有锐化.颜色恒常性.动态范围压缩大.色彩保真度高等特点.     从算法公式上的个人理 ...

  2. 图像增强去雾之直方图均衡化/同态滤波/Retinex算法

    图像增强去雾之直方图均衡化/同态滤波/Retinex算法 最近撸了一发图像去雾的算法,主要举四个例子,分别用了全局直方图均衡化,局部直方图均衡化,同态滤波,Retinex增强算法.感兴趣的可以一起讨论 ...

  3. 【图像增强】基于matlab双边滤波retinex算法暗光图像增强【含Matlab源码 2305期】

    ⛄一.简介 1 Retinex 1.1 理论 Retinex理论始于Land和McCann于20世纪60年代作出的一系列贡献,其基本思想是人感知到某点的颜色和亮度并不仅仅取决于该点进入人眼的绝对光线, ...

  4. 重磅MIT开源人工智能算法评估和理解对抗Logit配对的稳健性

    重磅MIT开源人工智能算法评估和理解对抗Logit配对的稳健性摘要:我们评估了对抗性Logit Pairing的稳健性,这是最近针对广告范例提出的防御措施. 我们发现,使用Adversarial Lo ...

  5. [react] 说说你对React的reconciliation(一致化算法)的理解

    [react] 说说你对React的reconciliation(一致化算法)的理解 就是启发式Diff算法 ,时间复杂度从N的三次方下降到N ,通过博客途径了解到实现的策略是 tree diff , ...

  6. 协同过滤算法的简单理解《推荐系统实践》

    协同过滤算法的简单理解 本文主要是讲解一下<推荐系统实践>中UserCF和ItemCF这两种基于领域的推荐算法,写出自己的理解. UserCF(基于用户的协同过滤算法) 这种推荐算法的出发 ...

  7. Mean-shift算法的直观理解

    Mean-shift算法的直观理解 0 前言 暑假的时候参加移动计算竞赛打了下酱油,接触到了Mean-shift算法,用于做目标跟踪.在那段时间也在网上查阅了不少关于这个算法的资料,可是总感觉它们都比 ...

  8. 工作6年,谈谈我对“算法岗”的理解

    文 | Severus 编 | 小轶 写在前面:本文完全基于我个人的工作经验,没有经过任何形式的行业调研,所以我的理解也有相当浓厚的个人印记,可以认作一家之言.如果能对读者朋友们起到任何帮助,都是我的 ...

  9. 国密SM2算法的只求理解不求甚解 (4/5)SM2算法加解密协议

    国密SM2算法的只求理解不求甚解 (1/5)前置数学知识:模运算 国密SM2算法的只求理解不求甚解 (2/5)前置数学知识:平面几何 国密SM2算法的只求理解不求甚解 (3/5)SM2算法数学模型 国 ...

  10. Hamiltonian Monte Carlo抽样算法的初步理解

    Hamiltonian Monte Carlo抽样算法的初步理解 接受拒绝采样算法 MCMC回顾 Hamiltonian dynamics 拉格朗日方程 从牛顿方程出发推导拉格朗日方程 勒让德变换 哈 ...

最新文章

  1. ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
  2. C# redis 分布式session存储
  3. Spring Boot 入门与实战笔记
  4. 今日腊八节,祝福送上!
  5. 安装数据库windows 安装redmine 详解
  6. 技术转管理?这些“坑”你要绕道走
  7. CSS基础必备知识点04
  8. splay区间翻转(bzoj 3223: Tyvj 1729 文艺平衡树)
  9. leetcode(153)寻找旋转排序数组中的最小值
  10. linux环境中,检查是否安装某个软件包的几种查看方式
  11. 什么是shell和shell编程
  12. 常用电子元器件基础知识总结
  13. ZYNQ+FPGA读取SD卡BMP图片并通过HDMI显示
  14. Linux 下串口编程入门
  15. 清理打印机连接数bat_通过批处理bat解决局域网打印机共享问题
  16. 陈强老师公开课笔记2——中介效应的原理与检验
  17. 胖客户端、瘦客户端与智能客户端
  18. E. Array Shrinking
  19. android x86 安装it,Android X86 虚拟机安装手册
  20. 解决Win10局域网共享问题:请检查名称的拼写 否则 网络...

热门文章

  1. MSP430 MSP430单片机软件开发集成环境CCS
  2. WPF 使用MSCHART 控件代码
  3. QT实现内录-电脑没有立体声混音,通过虚拟声卡实现内录
  4. matlab r2008a下载,Matlab+R2008a下载地址及安装教程
  5. 天联服务器虚拟网卡未启动,天联未检测到虚拟网卡
  6. 分布式系统的基本特征
  7. 吾爱破解crackme 023 024
  8. eclipse配置java环境_java环境搭建(Eclipse)
  9. 关于keil注册机的问题
  10. OpenCL编程入门