Retinex算法

概述

Retinex是一种常用的建立在科学实验和科学分析基础上的图像增强方法,它是Edwin.H.Land于1963年提出的。就跟Matlab是由Matrix和Laboratory合成的一样,Retinex也是由两个单词合成的一个词语,他们分别是retina 和cortex,即:视网膜和皮层。Land的retinex模式是建立在以下三个假设之上的:



(1)真实世界是无颜色的,我们所感知的颜色是光与物质的相互作用的结果。我们见到的水是无色的,但是水膜—肥皂膜却是显现五彩缤纷,那是薄膜表面光干涉的结果。


(2)每一颜色区域由给定波长的红、绿、蓝三原色构成的;


(3)三原色决定了每个单位区域的颜色。


Retinex理论的基础理论是物体的颜色是由物体对长波(红色)、中波(绿色)、短波(蓝色)光线的反射能力来决定的,而不是由反射光强度的绝对值来决定的,物体的色彩不受光照非均匀性的影响,具有一致性,即retinex是以色感一致性(颜色恒常性)为基础的


不同于传统的线性、非线性的只能增强图像某一类特征的方法,Retinex可以在动态范围压缩、边缘增强和颜色恒常三个方面达到平衡,因此可以对各种不同类型的图像进行自适应的增强。


原理


一幅给定的图像S(x,y)可以分解为两个不同的图像:反射图像R(x,y)和亮度图像(也有人称之为入射图像)L(x,y),其原理如下图所示:


L又称为光照分量,R又称为反射分量。Retinex的基本思想是,在S中,降低L的影响,从而尽量保留物体本质的反射属性,即R。


求解R是一个奇异问题,只能通过数学方法近似估算。Retinex是一个框架,采用用不同的亮度图像估计算法,其具体形式也不同,但基本流程如下:



一般直接通过空间平滑得到照射图像估计,常用的是高斯核的低通滤波。

retinex在对数域里进行:



以上是单尺度retinex(SSR),多尺度(MSR)的表达式如下:



K是尺度数,通常取K为3,并且权值w1=w2=w3=1/3,F是中心环绕函数,即高斯核函数、卷积核:



其中λ是归一化常数,确保卷积核内的积分为1;c为卷积核尺寸,retinex中常用的卷积核半径为15,80,120(小、中、大3个尺度)

中心环绕函数可以估计出光照分量L所对应图像的低频成分,并从S中去除低频成分,剩下来的就是高频分量,即反射分量R,保留了图像的边缘细节。


以上是经典Retinex算法,其缺点:都假设光照是低频的,即光照是缓慢变化的,但实际情况并非如此。在亮度相差很大的边缘处,光照变化是非平滑的。此时在亮度差异较大的区域会产生光晕现象。此外,边缘锐化不足、阴影边界突兀、部分颜色扭曲、纹理不清晰、高光区域(过曝)的细节没有明显改善也是其缺点。


光晕现象是经典retinex算法的最大缺点,它使图像发生了失真,而在图像增强中,失真是无论如何不允许出现的。光晕可以理解为光照变化剧烈的地方,被当作细节增强了。

对光晕现象更深层次的解释为:实际上,由一幅图像分解成两幅图像在数学上是一个“病态”问题。因为单一的像素亮度表达了照度信息和图像内容双重含义,在这种情况下要想准确的估计山照度情况只能依靠计算像素本身和图像中其它像素的关系。空域滤波在计算照度时主要根据剧围像素的位置远近赋予不同的权重来估算当前像素的照度(空域=二维特征空间),没有充分考虑到像素亮度本身的意义(空域+亮度=三维特征空间)。这直接导致了在估算图像高对比度边缘区域照度的时候,边缘两边的高低值像素会相互影响:高值像素的照度受相邻低值像素的影响导致所估计的照度较低;低值像素的照度受相邻高值像素的影响导致所估计的照度较高。这会造成这一区域照度估计失真,出现结果图像中的“光晕伪影”。


人们为了解决这一问题,相继提出了改进的措施。主要思路是改进算法框图中的“照度图像估计”这一块。经典算法使用的是高斯低通滤波,对图像的每一处都使用同一个滤波模板;而改进的方法,将考虑邻近像素间的灰度值差异。常见的方法有,双边滤波、各向异性扩散。双边滤波有快速算法,能够满足实时性要求。


经过以上步骤获得了反射分量,一般还会加入增强环节,例如对数变换、指数变换、伽马校正等一些非线性的灰度变换,进一步提高细节的呈现。


matlab程序


产生中心环绕函数

sigma=1; %sigma
delta=1; %取值步长为1
g_width_1=11; %卷积核尺寸
gauss_1=zeros(g_width_1,g_width_1);
for i=-1*floor(g_width_1/2):floor(g_width_1/2)
    for j=-1*floor(g_width_1/2):floor(g_width_1/2)
        gauss_1(i+1+floor(g_width_1/2),j+1+floor(g_width_1/2))=exp(-1*((i*delta)^2+(j*delta)^2)/(2*sigma^2))/(2*sigma^2);
    end
end
gauss_1=gauss_1/sum(sum(gauss_1));


  • 7
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: java.lang.illegalargumentexception: uri is not absolute 是Java中的一个异常,意思是URI不是绝对路径。 URI是Uniform Resource Identifier的缩写,用于标识互联网上的资源。URI可以是绝对路径或相对路径,绝对路径包含协议、主机名、端口号和路径等信息,而相对路径只包含路径信息。 当使用一个相对路径作为URI时,如果没有基础URI或者基础URI不是绝对路径,就会抛出java.lang.illegalargumentexception异常,提示URI不是绝对路径。解决方法是使用绝对路径或者提供正确的基础URI。 ### 回答2: java.lang.illegalargumentexception: uri is not absolute 这个错误信息通常在Java编程中遇到,指的是传递给一个URI(Uniform Resource Identifier,统一资源标识符)构造函数的值是相对路径而不是绝对路径。URI是一种用来指定唯一资源位置的字符串标识符,可以是文件、网址等。一个URI通常是由三个部分组成:协议、主机名和路径。 使用URI构造函数时,必须传递一个绝对路径,否则会出现 “uri is not absolute” 错误。如果不知道文件的绝对路径,可以使用相对路径或者File类来替代URI。 例如,以下代码会引发“uri is not absolute”错误: ```java URI uri = new URI("/myfile.txt"); ``` 而下面这个代码则是正确的,因为它使用的是绝对路径: ```java URI uri = new URI("file:///C:/myfile.txt"); ``` 另外,如果您使用的是相对路径,则需要使用到相对路径的基准URI来计算URI。示例如下: ```java URI baseURI = new URI("file://C:/Users/Documents/"); URI relativeURI = new URI("myfile.txt"); URI resolvedURI = baseURI.resolve(relativeURI); System.out.println(resolvedURI.toString()); ``` 在这个示例中,我们首先创建了一个基准URI,然后使用相对路径计算出一个新的URI,然后使用resolve()方法得到新的URI,并输出结果。 ### 回答3: java.lang.illegalargumentexception: uri is not absolute 是Java中常见的一种错误,通常指的是传入的参数为相对路径,而方法需要的是绝对路径的情况。简单地说,就是URI(Uniform Resource Identifier,统一资源标识符)参数不是绝对路径。 URI是用来标识某种资源的字符串,通常包括协议、主机名(有时需要端口号)、路径、查询(可选)和片段(可选)等组成部分。而绝对路径是指从根目录开始,一直到指定文件或目录的完整路径。 一些方法要求传入的URI参数必须是绝对路径,如果传入的是相对路径,在执行时就会提示java.lang.illegalargumentexception: uri is not absolute 这个错误。这时我们需要修改相对路径为绝对路径,或者使用方法要求的类型传递参数。 解决这个错误的方法有多种,可以根据具体错误情况进行处理。下面是一些可能的方案: 1.将URI参数更改为绝对路径,可以使用File类的getAbsolutePath()方法,或者使用Paths.get()方法,以确保传递的是绝对路径。例如:String absolutePath = new File("relative/path/file.txt").getAbsolutePath() 2.使用方法要求的类型传递参数,例如使用URL类而不是URI类,或者使用File类而不是URI类。 3.检查代码中使用的URI是否正确,是否缺少某些部分,或者是否包含不合法的字符。 4.查看URI参数是否符合特定的格式要求,例如是否需要使用特定的协议前缀,或者是否需要特定的字符转义。 总之,在开发过程中,实现特定的URI要求是非常重要的。在传递URI参数时,我们要确认它们是绝对路径,完全符合要求。如果出现了java.lang.illegalargumentexception: uri is not absolute 这个错误,我们需要仔细检查传递的URI并解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值