带色彩恢复的多尺度视网膜增强算法(MSRCR)的原理、实现及应用。
原文:https://www.cnblogs.com/Imageshop/p/3026881.html
Retinex这个词是由视网膜(Retina)和大脑皮层(Cortex) 两个词组合构成的。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)
对上面的理论的进行一个简单的注释吧。把这个技术运用到图像处理上,就是针对我们现在已经获得的一副图像数据I(x,y),计算出对应的R(x,y),则R(x,y)认为是增强后的图像,现在的关键是如何得到L(X,Y)。Retinex理论的提出者指出这个L(x,y)可以通过对图像数据I(x,y)进行高斯模糊而得到,很多论文中都列出了那个中心/围绕函数以及需要归一化的K值,搞的很多新手都不明白是什么了,其实就是一个模糊而已。从实际运用的角度来说,也可以用均值模糊来代替高斯模糊。
因此这个算法的细路就很简单了,具体步骤如下:
1、输入: 原始图像数据I(x,y),尺度(也就是所谓的模糊的半径)
2、处理:(1) 计算原始图像按指定尺度进行模糊后的图像 L(x,y);
(2) 按照2-2式的计算方法计算出 Log[R(x,y)]的值。
(3) 将 Log[R(x,y)]量化为0到255范围的像素值,作为最终的输出。
可以看得出,算法很简单,其核心的东西还是在于高斯模糊的实现。关于高斯模糊,网上有很多快速优化的文章参考,具体的参考代码可能很少有好人提供的。
注意到一点,似乎在量化的时候没有谁会将 Log[R(x,y)]进行Exp函数的运算而直接得到R(x,y),至于为什么,我无法给出明确的答案。
量化的方式其实有很多种,而这个方法在很大的程度上对处理的效果有着决定性的影响。至今我没看到有哪一篇论文对这一块讲的很清楚,也不知道他们的那些结果是如何取得的,一种最简单的方式就是计算出Log[R(x,y)]的最大值Max和最小值Min,然后对每一个值Value,进行线性量化,公式为:
R(x,y) = ( Value - Min ) / (Max - Min) * (255-0) (2-3)
效果测试:
原图 经过Retinex(尺度为10)增强后的图像 经过Retinex(尺度为300)增强后的图像
原图 经过Retinex(尺度为10)增强后的图像 经过Retinex(尺度为300)增强后的图像
论文中说,尺度取值较小时, 能够较好地完成动态范围的压缩,暗区域的细节能得到较好地增强,但输出颜色易失真;取值较大时,色感一致性较好。 我倒是没看出尺度小有什么好处。
以上算法所实现的过程通常倍称作为SSR(Single Scale Retinex,单尺度视网膜增强);
为了得到更好的效果,人们又开发出所谓的多尺度视网膜增强算法(MSR, Multi-Scale Retinex),最为经典的就是3尺度的,大、中、小,既能实现图像动态范围的压缩,又能保持色感的一致性较好。同单尺度相比,该算法有在计算Log[R(x,y)]的值时步骤有所不同:
(1) 需要对原始图像进行每个尺度的高斯模糊,得到模糊后的图像Li(x,y),其中小标i表示尺度数。
(2) 对每个尺度下进行累加计算 Log[R(x,y)] = Log[R(x,y)] + Weight(i)* ( Log[Ii(x,y)]-Log[Li(x,y)]); 其中Weight(i)表示每个尺度对应的权重,要求各尺度权重之和必须为1,经典的取值为等权重。
其他的步骤和单尺度的没有区别。
原图 经过SSR(尺度为300)增强后的图像 经过MSR(最大尺度为300,尺度数为3)增强后的图像
原图 经过SSR(尺度为300)增强后的图像 经过MSR(最大尺度为300,尺度数为3)增强后的图像
SSR和MSR在最大尺度相同的时候谁好谁坏我还真讲不清。
在以上的两幅测试图像中,特别是第二幅,我们看到明显的偏色效果,这就是SSR和MSR普遍都存在的问题。给一段比较经典的论文中的原话供大家参考:
The general effect of retinex processing on images with regional or global gray-world violations is a “graying out” of the image, either globally or in specific regions. This desaturation of color can, in some cases, be severe (see Fig. 4, middle). More rarely, the gray-world violations can simply produce an unexpected color distortion (see Fig. 4,top left).
为此,研究者又开发出一种称之为带色彩恢复的多尺度视网膜增强算法(MSRCR,Multi-Scale Retinex with Color Restoration) ,具体讨论的过程详见 <A Multiscale Retinex for Bridging the Gap Between Color Images and the Human Observation of Scenes>这篇论文,这里要说的是,我认为论文里的方法不起任何作用,并且论文里为了这个又引入了太多的可调参数,增加了算法的复杂性,不利于自动化实现。
从我目前的了解来看,GIMP的contrast-retinex.c文件里使用的算法很好,效果也很好。他直接从量化的方式上入手,引入了均值和均方差的概念,再加上一个控制图像动态的参数来实现无色偏的调节过程,简要描述如下。
(1)分别计算出 Log[R(x,y)]中R/G/B各通道数据的均值Mean和均方差Var(注意是均方差)。
(2)利用类似下述公式计算各通道的Min和Max值。
Min = Mean - Dynamic * Var;
Max = Mean + Dynamic * Var;
(3) 对Log[R(x,y)]的每一个值Value,进行线性映射:
R(x,y) = ( Value - Min ) / (Max - Min) * (255-0) ,同时要注意增加一个溢出判断,即:
if (R(x,y) > 255) R(x,y) =255; else if (R(x,y) < 0) R(x,y)=0;
就是经过这么简单的处理,实践证明可以取得非常好的效果,下面贴出一些处理后的效果。
MSR(最大尺度为300,尺度数为3)增强图像 MSRCR(最大尺度为300,尺度数为3,Dynamic=2)增强图像 MSRCR(最大尺度为300,尺度数为6,Dynamic=2)增强图像
MSR(最大尺度为300,尺度数为3)增强图像 MSRCR(最大尺度为300,尺度数为3,Dynamic=2)增强图像 MSRCR(最大尺度为300,尺度数为6,Dynamic=2)增强图像
由以上三幅图的效果得出的结论:
(1)MSRCR效果要比MSR好很多,基本消除了色偏。
(2)对于MSRCR,尺度数对结果的影像不是特别大,但是随着尺度数的增加,算法耗时会线性增加,因此,一般尺度数取3就较为合适了。
继续贴图做比较:
MSRCR(Dynamic=1)增强图像 MSRCR(Dynamic=2)增强图像 MSRCR(Dynamic=5)增强图像
MSRCR(Dynamic=1)增强图像 MSRCR(Dynamic=2)增强图像 MSRCR(Dynamic=5)增强图像
由以上三幅图的效果得出的结论:
(3)Dynamic取值越小,图像的对比度越强。
(4)一般来说Dynamic取值2-3之间能取得较为明显的增强效果,即能取得很自然过渡效果,又能保持图像的清晰度适度增强。
关于最大尺度,个人建议取值以大于100为佳。
retinex算法的效果对于一些正常的图像处理后的效果并不佳,我们可以认为他就是为那些在外界环境不理想的状态下拍摄的图像增强而设计的,特别的,对于航拍的雾天图片,医学上的成像图片等成像条件恶劣的图有很明显的效果,再列出一些照片处理效果。
原始图像 MSRCR增强的效果 NASA的Retinex增强结果
上述照片均使用最大尺度为300,尺度数为3,Dynamic=2时的效果。
由以上几组照片,可以看到,Retinex在图像去雾、宇航图、医学图像、老照片等图像的处理上效果很是明显。
NASA的处理效果要比我这里的MSRCR好一些,这当然无可厚非,人家是什么单位啊。
关于NASA对Retinex技术的应用,可以参考:http://dragon.larc.nasa.gov/retinex/
关于去雾效果,我们在来和美图秀秀、可牛影像、光影魔术手等现有的软件做个简单的比较:
原图 MSRCR 美图秀秀
可牛影像 光影魔术手
原图 MSRCR 美图秀秀
可牛影像 光影魔术手
关于谁是谁非,为避免不必要的口舌之争,这里还是交给给位看管去分辨吧。
同样,提供个编译好的文件给有兴趣研究该算法的朋友看看效果:
http://files.cnblogs.com/Imageshop/Retinex.zip
关于Rentinex,在共享两篇比较经典的英文论文:
Multi-Scale Retinex for Color Image Enhancement
A Multiscale Retinex for Bridging the Gap Between Color Images and the Human Observation of Scenes
关于实现代码,提供GIMP的contrast-retinex.c的下载链接(要像完全看懂其中的所有代码的意思很困难,但是要提取其中的算法部分就不那么复杂了)。
http://files.cnblogs.com/Imageshop/contrast-retinex.rar
***************************作者: laviewpbt 时间: 2013.4.17 联系QQ: 33184777 转载请保留本行信息*************************
带色彩恢复的多尺度视网膜增强算法(MSRCR)的原理、实现及应用。相关推荐
- msrcr(Multi-Scale Retinex with Color Restoration) 带色彩恢复的多尺度视网膜增强算法 整理
本文主要总结整理msrcr算法相关,包括基本原理,效果和实现代码 为了提高低亮度条件和背光条件下拍摄图像的效果,尝试了各种常规的数字图像处理方法,包括: 线性变换 对数变换 直方图均衡等 对yuv分量 ...
- OpenCV图像增强(一)——多尺度视网膜增强
前言 1.在处理摄像头时,或者在图像中物体轮廓提取时,常常会碰到一些背景偏暗的图像,为了更好的得到效果,那么图像增强会是一个不错的选择. 2.我这里使用的库OpenCV版本是3.30,关于opencv ...
- 图像多尺度对比增强算法
多尺度对比增强算法的基本观点是将图像分解成代表图像单个细节的像素,然后立 即在这些像素上提高对比度,因此要求选择一种图像分解方法. 在图像分解方法的选择上要遵循以下两个基本条件: ...
- 多尺度视网膜图像增强_视网膜图像怪异的预测
多尺度视网膜图像增强 If you've ever been to see an opthamologistst, you've probably undergone a routine proced ...
- MUSICA(多尺度图像对比度增强)算法的简要原理及VC实现-1[r]
MUSICA的专利文档:MUSICA_patent - Original document.pdf 算法原理: 图像增强的一般方法是对比度拉伸和直方图均衡,这两种方法对于灰度级过于集中, 还有 ...
- 雷蛇灵刃系列原厂预装系统恢复重建恢复分区,带一键恢复
雷蛇灵刃系列原厂预装系统恢复重建恢复分区,带一键恢复 文件分享地址https://pan.baidu.com/s/1snKOsH3OMl3GZLqeAf-GLA?pwd=8888 支持系列: Raze ...
- 华硕幻16 2023星空版 GU604V 原厂Win11工厂模式带ASUSRecovery恢复功能
ROG|玩家国度 幻162023星空版 GU604V原厂Windows11系统 工厂安装带ASUSRecovery恢复功能 文件地址 https://pan.baidu.com/s/1uBsydP5t ...
- Alienware外星人原装系统出厂系统原机开箱系统远程安装,带F12恢复功能SupportAssist OS Recovery
戴尔和外星人原厂系统安装过程展示,带Support Assist OS Recovery出厂重置功能 [1]远程安装原机预装系统,专用Alienware系统部署工具,恢复原机开箱系统状态,自带外星人壁 ...
- AliCloudDenoise 语音增强算法:助力实时会议系统进入超清音质时代
简介:近些年,随着实时通信技术的发展,在线会议逐渐成为人们工作中不可或缺的重要办公工具,据不完全统计,线上会议中约有 75% 为纯语音会议,即无需开启摄像头和屏幕共享功能,此时会议中的语音质量和清晰度 ...
- 基于小波变换的语音增强算法简单综述
前言: 语音通信是人类传播信息,进行交流时使用最多.最自然.最基本的一种手段.而这种通信中的信息载体-语音信号却是一种时变的.非平稳的信号,只有在很短的一段时间内(通常为10~30ms)才被认为是平稳 ...
最新文章
- C++中相对路径和绝对路径
- Fragment崩溃后重启
- Python程序开发——第八章 文件
- 公司c语言面试题目,c语言面试最必考的十道试题,求职必看!!!
- cookie 百科_cookie是什么
- linux写一个ls命令,linux 下 如何自己写 ls 命令
- python机器学习2021年6月19日09:35:06
- windows守护进程_在Linux的Windows子系统上(WSL)使用Docker(Ubuntu)
- 机器学习实战(MachineLearinginAction) 第三章 决策树
- 自制简易前端MVC框架
- 01-vue项目之滚动加载数据
- 加入HA后的完全分布式集群搭建
- 当你想对常用网站定制属于自己的颜色,然而又没人理你怎么办
- RS485转USB插电脑上通讯不上
- Mac 如何免费支持NTFS 格式移动硬盘读写
- Win10 启动英雄联盟后系统没声音 英雄联盟bug
- html td里面元素的获取
- 网贷查询接口开发 网贷黑名单查询 个人网贷黑名单查询
- php 倒计时 考试,php实现倒计时
- python前端学习之js
热门文章
- android 增大日志缓存
- 威廉玛丽学院计算机专业好吗,威廉玛丽学院计算机专业怎么样?
- 可以替代树莓派4(raspberry pi 4B)的tinker board 2
- ps.execute()不能当作执行结果反馈,需要用getResultSet或getUpdateCount
- c语言 gets getc,6.16 C语言,getchar gets getc有什么区别 分别是表示什么的
- 用python做双人五子棋_使用python实现简单五子棋游戏
- 献给盲目追谁IT的管理者的话,转载:活着就是王道---- -一年
- 工作日志-上班头一天
- lgv50进入工程模式_LG手机工程模式进入方法及菜单指令翻译(适用G6、G7、V20、V30等)...
- 关于chm电子书无法显示网页的解决方