Retinex是上个世纪七十年代由Land提出的色彩理论。我认为其核心思想基于俩点

(1)在颜色感知时,人眼对局部相对光强敏感程度要优于绝对光强。

(2)反射分量R(x,y)储存有无光源物体的真实模样,一幅图像对其光照分量L(x,y)的估计越准确,求得的R(x,y)也就越准确。

先来说明第一点,人对颜色的认知并不是基于绝对光强,反应在图像上时可以理解成,人眼对一像素点(X0,Y0)的颜色的认知不是基于其RGB三通道绝对值大小,而是与俩个因素相关。

1、(X0,Y0)点三通道值的差异,它会致使色偏。

2、(X0,Y0)一个邻域内其余像素的RGB值,它会形成颜色的感觉,RGB三通道绝对值主导亮度感觉。

我目前无法定量定性分析他们的关系,因为它涉及感觉这种玄妙的东西,但是我们会用就行。

再说明第二点,在给定场景的时候,如果场景内无光源,那么R(x,y)应该是一常量。无论光照L(x,y)如何改变,R(x,y)该不变。也就是说,无论我光照是什么颜色什么强度,我都应该能将其矫正到标准光照情况下。这也是色彩恒常性的体现。

那么问题来了,基于上面推理该怎么办去矫正多光照图像。

关于Retinex的算法的发展,从最初的随机路径法,到McCann迭代法,到变分法再到中心环绕的。关于他们的说明在网上一找一大堆,这里我不在赘述。

让我们从single-scale-Retinex开始,在网上能找到的SSR算法,说实话基本效果很差,根本体现不出其色彩恒常算法的特点。其实如果你查阅过大量资料后,你会发现NASA的原文对SSR说明就不清不楚,网上代码对其的实现可以说是一种无参考复现,你甚至会发现他们对环绕函数地描述都不一致。SSR说到底就是认为光照局部不变,以一个邻域的加权值来估计光照。

一般SSR会选择高斯函数或者类高斯函数,你可以直接用matlab中的fspesical函数,也可以自己写一个,其实问题不大。一般刚遇到SSR最让人困惑的就是如何明晰何为尺度,当你多看几个SSR的实现,就会发现会有越来越多的疑惑。如何确定尺度,高斯函数的sigma值和尺度之间到底有和数量关系,最后在对数域是否需要返回到指数域,需不需要归一化,最后成像出现色偏问题该怎么解决。这些细节的处理会显著影响图片质量,特别是视觉效果。

在SSR的基础上发展起来的MSR和MSRCR,但说实话,因为他们的实现是基于SSR的,所以如果你SSR都没有写好,那么他们的实现一定也不会尽人意。

在MSR的基础上,为了实现真正的色彩恒常计算,我对MSR进行了改动。

步骤大致分为三步:

1、使用导向滤波代替高斯滤波,与传统MSR算法不同,这里不分通道处理而是三通道合一来估计光照。这是基于一个认知,自然界中的光是连续,而RGB三通道只是为了方便屏幕显示,用三通道处理与形成割裂。

2、对估计出来的光照进行自适应调整后,计算出对数域中的反射量r(x,y)

3、对r(x,y)进行调整,为了适应不同的环境,我使用了一个一个小技巧实现色彩保真,在算法中可选是否保真,保真的前提是原图质量足够好,图像中元素足够丰富,如果不满足这俩个前提推算真实颜色的时候就会出严重错误。至于为何这般,这与Retinex算法实质有关,因为对光照估计的越准确,矫正到标准光源后的质量也就越好。而Retinex对光照的估计是基于空间邻域的。

注意:2是在对数域实现的,而这与MSR相似

附上一些图来说明效果

原图由来着东南大学的一位朋友提供

未保真计算,可以看出其色彩恒常性的体现不好

进行保真,充分体现色彩恒常性

原图,同样由东南大学的朋友提供

未保真计算

保真计算

原图,来着网络

未保真,可见光照为红光

矫正后,深红光照被削弱,但图中可见的光源被放大,同时因为原图质量不高,致使保真计算后图像质量目视比不保真低

以上是我对Retinex的粗浅认识。

2019年11月7日于北京航空航天大学

自动化科学与电气工程学院 符云松

联系:734345993@qq.com

浅谈Retinex的更多相关文章

  1. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  2. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  3. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  4. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  5. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  6. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

  7. iOS开发之浅谈MVVM的架构设计与团队协作

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  8. Linux特殊符号浅谈

    Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...

  9. 浅谈Angular的 $q, defer, promise

    浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00  博客园-原创精华区 原文  http://www.cnblogs.com/big-snow/ ...

随机推荐

  1. 【原创】(六)Linux内存管理 - zoned page frame allocator - 1

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  2. Jetpack系列:应用内导航的正确使用方法

    今天小编要分享的还是Android Jetpack库的基本使用方法,本篇介绍的内容是Jetpack Navigation组件,让我们一起学习,为完成年初制定的计划而努力吧! *** 组件介绍 导航,是 ...

  3. 瀑布流实例及懒加载(echo.js)

    瀑布流布局: 图片等宽,不定高,按最低高度来顺序排列:实现方法:获取每次获取四行中最低高度对应的一行,将下一张加载的图片放在该位置,每次加载前都获取最低高度: ①请求图片的接口    地址此php文件 ...

  4. 5G 时代,云计算迎来新风口

    云计算是对传统IT模式从底层硬件到业务模式的颠覆,传统IT市场具备万亿级市场空间,目前云计算收入占IT支出占比尚小,渗透率较低,未来空间较大. 短期受到宏观经济等因素影响,云巨头资本开支增速有所波动, ...

  5. mac下的环境变量

    a. /etc/profile b. /etc/paths c. ~/.bash_profile d. ~/.bash_login e. ~/.profile f. ~/.bashrc 其中a和b是系 ...

  6. display——table-cell属性

    display的table和table-cell一般情况下用的不多,所以很少有人去关注它,但他们两个联手起来会给你惊喜! 当两个或者两个以上标签一起使用显示在同一行时,以前常用的是float.posi ...

  7. 算法学习之剑指offer(二)

    题目1 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. import java.util.Stack; public class Solution { ...

  8. Github 上热门的 Spring Boot 项目实战推荐

    最近经常被读者问到有没有 Spring Boot 实战项目可以学习,于是,我就去 Github 上找了 10 个我觉得还不错的实战项目.对于这些实战项目,有部分是比较适合 Spring Boot 刚入 ...

  9. STL的vector略解

    本文部分内容参考于这儿. vector 的基础知识,上文已经阐述地很详尽了.笔者谨给出 vector 的声明及其常用函数. 代码抬头需包含 #include<vector> using n ...

  10. 除法分块 luogu2261 (坑)

    除法分块 除法分块 是指使用分块计算的方法求S=∑i=1n⌊ki⌋S=\sum^{n}_{i=1}{\lfloor{\frac{k}{i}}\rfloor}S=i=1∑n​⌊ik​⌋的值. 举个例子. ...