Advertisement

图像去雾(二)Retinex图像增强算法

阅读量:

过去一段时间里对图像增强算法进行了深入研究。发现Retinex理论在彩色图像增强、图像去雾以及色彩恢复等方面展现出显著的效果。下面我来分享一下我对该算法的理解。

Retinex理论

起源于Land及McCann在20世纪60年代的一系列贡献。这一理论的核心理念在于:人类感知某一点的颜色与亮度不仅不依赖于该点进入眼睛的绝对光线量(absolute light),还受到其周边区域颜色与亮度的影响(adjacent color and brightness)。这一术语由‘视网膜’(Retina)与‘大脑皮层’(Cortex)等词组合而成。为了表明他对视觉系统特性的认识仍有待进一步探讨

Land的Retinex模型是建立在以下的基础之上的:

一、真实的自然界是没有色彩的;然而人类感知的颜色则是由光线与物质相互作用所形成的视觉效果决定的;我们观察到水呈现无色状态;但是一旦形成肥皂膜——即泡沫层时;由于薄膜表面发生光干涉现象;因此会呈现出彩虹般的五彩斑斓效果;

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

基于RGB三种颜色原则确定了每个区域单元的颜色。 Retinex理论的核心内容是物体的颜色由其对长波(红)、中波(绿)和短波(蓝)光线的反射能力决定; 传统观念认为这一特性是由反射光强度绝对值的变化所定义; 然而根据Retinex理论模型中的假设条件可知: 物体表面呈现一致性的色彩特性与光源环境无关; 如图所示: 如图所示

Retinex理论的核心原理是输入图像S是光源影响L与表面反射特性R的乘法关系,其数学模型可表示为以下公式所示:

该方法旨在通过Retinex技术从原始输入信号S中推导出光源参数L,并在此基础上分离出反映景物特征的部分R。这种处理方式能够有效减少由于光照分布不均匀所带来的问题,并从而提升整个系统的输出质量。与人类视觉系统的方式相似地工作,在计算过程中,默认会将输入信号转换到对数域进行运算。

从而将乘积关系转换为和的关系:

其核心在于通过估计照度L,在图像S中分离出L分量,并去除之以获取原始反射分量R。

函数 f(x) 执行对比度 L 的估算(大致来说,在实践中许多情况下都是直接计算 r 分量)。

Retinex理论的理解

假如读者在阅读论文的过程中想要深入了解相关技术细节的话,在接下来的篇幅中必然会涉及两个具有代表性的Retinex算法:一种是基于路径的方法(Path-based Retinex),另一种则是基于中心-环绕(Central/Peripheral)机制的设计(Central/Peripheral Retinex)。为了帮助初次接触这一理论领域的读者更好地理解这些技术细节,在深入讲解这两个经典算法之前, 我将分享一些个人的理解, 以便大家能够更快地掌握其核心内容。当然, 如有不对之处, 还希望大家不吝赐教。

我对Retinex理论的理解表明其具有相似的效果于降噪技术,并且其核心观点主要基于对图像构成合理假设的基础上展开讨论。从观察者的视角来看这一过程可以将其视为接收带有一种乘性噪声影响的真实图像是由入射光成分所主导构建而成其中入射光成分表现出一种呈现相对均匀特征的变化速度较慢的趋势 Retinex算法则致力于通过精确推断并消除图像各处存在的这种噪声从而实现更好的视觉效果

当我们处于极端情境时,在假设整幅图像中的各个分量均为均匀分布的情况下,则最简单的估计照度L的方法就是将图像转换至对数域之后计算其平均值。为此, 我设计了以下算法用于验证这一猜想, 其流程如下:

(1) 将图像变换到对数域

(2) 归一化去除加性分量

(3) 对步骤3得到的结果求指数,反变换到实数域

这里为了简化描述,省略了对图像本身格式的变换,算法用Matlab实现:

复制代码
 Matable 代码

    
  
    
  
    
 % ImOriginal:原始图像
    
 % type:'add'表示分量是加性的,如雾天图像;'mult'表示分量是乘性的,如对照度的估计
    
 [m,n,z] = size(ImOriginal);
    
 ImOut = uint8(zeros(m,n,z));
    
 for i = 1:z
    
     if strcmp(type,'add')
    
     ImChannel = double(ImOriginal(:,:,i))+eps;
    
     elseif strcmp(type,'mult')
    
     ImChannel = log(double(ImOriginal(:,:,i))+eps);
    
     else
    
     error('type must be ''add'' or ''mult''');
    
     end
    
     ImOut(:,:,i) = EnhanceOneChannel(ImChannel);
    
 end
    
 ImOut = max(min(ImOut,255), 0);
    
 end
    
  
    
 function ImOut = EnhanceOneChannel(ImChannel)
    
 % 计算计算单个通道的反射分量
    
 % 1.对全图进行照射分量估计
    
 % 2.减去照射分量
    
 % 3.灰度拉伸
    
 ImChannel = ImChannel./max(ImChannel(:));
    
 ImRetinex = round(exp(ImChannel.*5.54));
    
 ImOut = uint8(ImRetinex);
    
 end

测试原图

经典Retinex算法结果

上述方法结果

通过对比可以看出,在去除亮度后恢复原始图像时效果尚可,并未在边缘位置产生模糊现象。其局限性在于,在去除亮度分量L的过程中仍保留了反射分量R这一部分信息。该步骤的作用类似于去除了一个均匀的直流分量(即均匀亮度分量),这是因为操作是全局性的假设所有位置上的亮度分量都是相同的。因此,在灰度校正过程中未能充分考虑局部特性而导致整体亮度偏暗的现象出现。尽管如此,在全局亮度估计方法对图像增强存在一定局限性的情况下,在色彩恢复与亮度处理等方面仍存在一定的缺陷

我认为Retinex算法的核心在于准确识别图像中的噪声特征。很多研究者关注基于Retinex的图像增强技术及其应用研究,并列举了许多相关的方法如水下增强、去雾等技术。我也很好奇这些技术的效果如何?那就试试看吧!前一阵子遇到大雾天也没得选择,在空闲时间拍摄了几张照片后终于可以用上了,请参考对比图

有雾原图

经典Retinex去雾效果

上述方法去雾效果

还是老规矩了,在这个时候进行对比试验始终遵循同样的流程。通过对比试验可以看出效果如何为此选取了一幅极具干扰性的图像作为测试样本。若显示器性能稍逊一筹,在原图中难以辨识雾气后的细节。就主观感受而言,在去雾效果上实验结果表现尚可。相较于传统方法而言,并不逊色于经典的去雾算法

在上述案例中,“核心就是准确解析有雾图像结构”。与Retinex理论一开始的核心思想不同的是,在处理这种加性干扰时,“经典 Retinex 算法本质上仅仅通过估计其加性干擾分量”。然而,在忽略 Retinex 理论中关于对比度和反射率如何影响最终图像形成(如图1)的情况下,“后续的核心问题就在于如何估计这一加性干扰。”

对于有雾的图像来说,在某种程度上类似于透过一块磨砂玻璃去欣赏一幅明了的画面。这样一来大家就容易理解为什么在这个案例中把雾的影响视为加性处理了吧。比如后面两个经典的算法之类的传统的算法就是利用原图中的像素点来推断原始照度值。通过实例可以看出全局估计法虽然简单但对于局部增强效果却不尽如人意。如果出现光照不均(即雾浓度分布不均匀)或者背景色调亮度差异较大等情况时处理效果就会大打折扣变得比较糟糕

然而, 经典方案并非尽善尽美. 通过观察图形可以看出, 在经典的算法中容易出现伪影效果(蓝色书本文字周围出现一圈白色伪影).

全部评论 (0)

还没有任何评论哟~