当前位置:   article > 正文

Retinex图像增强算法_基于retinex的算法有哪些?

基于retinex的算法有哪些?


最近在做糖尿病眼视网膜血管提取,发现用Retinex图像增强算法对原图像进行处理可以得到较好的效果。便对Retinex算法进行了详细梳理。

Retinex理论

Retinex理论使于Land和McCann于20世纪60年代做出的一些列贡献,其基本思想是人感知到某点的颜色和亮度不仅仅取决于该点进入人眼的绝对光线,还和周围的颜色和亮度有关。
Land的Retinex理论是建立在以下基础上的。
一、真实世界是无颜色的,我们所感知的颜色是光与物质相互作用的结果。我们见到的水是无色的,但是水膜-肥皂确实五彩缤纷的,那是薄膜表面光干涉的结果。
二、每一颜色区域由给定波长的红、绿、蓝三原色构成。
三、三原色决定了每个单位区域的颜色。
Retinex理论的基本内容是物体的颜色由物体对长波(红)、中波(绿)和短波(蓝)光线的反射能力决定的,而不是由反射光强度的绝对值决定的。物体的色彩不受光照非均性的影响,具有一致性,即Retinex理论是以色感一致性(颜色恒常性)为基础的。如下图所示,观察者所看到的物体的图像S是由物体表面对入射光L反射得到的,反射曲率R由物体本身决定,不受入射光L变化。
在这里插入图片描述
如上图所示,图像可以看做是由入射图像和反射图像构成,入射光照射在反射物体上,通过反射物体的反射形成反射光进入人眼,就是人类所看到的图像。最后形成的图像可以用公式表示为:
在这里插入图片描述
其中,L(x,y)表示入射光图像,它直接决定了图像中像素所能达到的动态范围,R(x,y)表示物体的反射性质图像,即图像的内在属性,S(x,y)表示人眼所能接收到的反射光图像。Retinex理论的基本思想就是在原始图像中,通过某种方法去除或者降低入射图像的影响,从而尽量的保留物体本质的反射属性图像。从数学来讲,求解R(x,y)是一个奇异问题,只能通过数学方法近似的估计来计算。根据亮度图像估计方法的不同,先后涌现出很多Retinex算法,虽然各种方法在表现形式上有所不同,但实质上基本是一致的,其一般的处理过程如下所示:
在这里插入图片描述
一般我们把照射图像假设估计为空间平滑图像,原始图像为S(x,y),反射图像为R(x,y),亮度图像为L(x,y),由此可以得到Retinex算法公式为:
在这里插入图片描述
这里,r(x,y)为输出图像,*为卷积符号,F(x,y)为中心环绕函数,可以表示为:

在这里插入图片描述
C表示为高斯环绕尺度,λ是一个尺度,它的取值必须满足以下条件:
在这里插入图片描述
从上面的式子可以看出,SSR算法中的卷积可以看做是对空间中的照度图像的计算,它的物理意义可以表示为通过计算图像中像素点与周围区域在加权平均来估计图像中照度的变化,并将其去除,最后只保留图像中物体的反射属性,从而达到增强的目的。

单尺度Retinex算法实现流程

(1)读入原图S(x,y),若为灰度图,则将图像每个像素的灰度值由整数值转换为浮点数,并转换到对数域;若输入是彩图,则将图像的每个颜色分类分别处理,将每个分量的像素值由整数值转换为浮点数,并转换到对数域中,方便后面数据的计算。
(2)输入尺度C;在离散条件下,积分转换为求和,进一步确定参数λ的值。
(3)根据前面的公式,计算得到r(x,y);如果是彩图,则每个通道均有一个ri=(x,y)
(4)将r(x,y)从对数域转换到实数域得到输出图像R(x,y)
(5)对R(x,y)线性拉伸并以相应的格式输出显示。
在前面的公式中,中心环绕函数F(x,y)采用低通函数,能够在算法中估计出照射图像所对应的分量,在人类的视觉系统中,人眼对边缘部分的高频信息相当敏感,所以SSR算法可以较好的增强图像中的边缘信息。
由于SSR算法中所选用的高斯函数的特点,所以增强后的图像对动态范围大幅度压缩和对比度增强不能同时保证。但为了能平衡两种增强效果就必须选择一个较为恰当的尺度敞亮C,一般其取值为80-100之间。

多尺度MSR(Multi Scale Retinex)

MSR是在SSR的基础上发展而来的,其优点是可以同时保持图像高保真度和对图像的动态范围进行压缩。并且,在一定的情况下,MSR可以实现色彩增强、颜色恒常性、局部动态范围压缩、全局动态范围压缩,也可以用于X光图像增强
MSR的计算公式如下:
在这里插入图片描述
式子中的K是高斯中心环绕函数的个数,当K=1时,MSR退化为SSR。通常来讲,出于保证同时兼有SSR高、中、低三个尺度的优点的考虑,K的取值通常为3,并且:
在这里插入图片描述
此外,实验结果证明Ci分别取15,80,120可以得到较好的结果。

尺度的选择

尺度参数C是Retinex算法中重要的参数。一般情况下MSR算法中需要选择一个小尺度、一个中尺和一个大尺度,以保证处理结果能够得到较好的图像对比度增强,在动态范围得到压缩的同时能够保持图像的基本色调。
Retinex算法处理时是将卷积换为频域的滤波,这样就只讨论一个参数C对结果影响,Retinex计算过程中首先生成一个与图像大小相同的高斯模板,然后再将其转换到频域上进行频域滤波,滤波结果再反变换回去。由于高斯函数具有其傅里叶变换和反变换都是高斯函数的特点,所以可以很直观的从中心环绕函数的高斯滤波器看出尺度参数对SSR结果影响的规律。根据频域功率分布规律,并进行Retinex算法实验得到以下规律:
(1)当尺度为图像大小的1%~5%时,Retinex结果能够获得非常好的图像边缘细节,可以选择其作为小尺度。
(2)当尺度为图像大小的10%~15%时,Retinex结果能够同时得到图像边缘细节和色彩,可以选择其作为中等尺度。
(3)当尺度为图像大小的30%~50%时,Retinex结果得到比较平衡的色彩,可以选择其作为大尺度。
尺度的选择与图像的大小有关,对于图像大小一定的系列图像,选择好尺度后Retinex算法对这一系列图像都能起到较好的增强作用。在实际应用中,用户可以根据自己的需要来设置尺度的大小,比如如果想让图像中更多的细节显示出来,可以选择添加一个小的尺度来满足要求,或者将小尺度Retinex结果所占的权值调整大一些。
一般的Retinex算法在对光照图像估计的时候,都会假设初始光照图像是缓慢变化的,即光照图像是平滑的,但实际情况并非如此。在亮度相差很大区域的边缘处,图像的光照变化并不是平滑的。所以,在这种情况下,Retinex增强算法在这个亮度差异大的区域的增强图像会产生光晕效果。此外,边缘锐化不足,阴影边界突兀,部分颜色发生扭曲,纹理不清晰,高光区域细节信息并没有得到明显改善,对高光区域的敏感度小等也是较为常见的缺点。

在这里插入图片描述
由上面的介绍我们可以知道Retinex理论的基本假设就是原始图像S是光照图像L和反射率图像R的乘积,即:
在这里插入图片描述
基于Retinex的图像增强的目的就是从原始图像S中估计出光照L,从而分解出R,消除光照不均匀的影响,以改善图像的视觉效果,正如人类视觉系统那样。在图像处理中,通常将图像转换至对数域,即:
在这里插入图片描述
Retinex方法的核心是估计照度L,从图像S中估测L分量,并去除L分量,得到原始分量R,即:
在这里插入图片描述
函数f(x)实现对照度L的估计(可以去这么理解,实际很多都是直接估计r分量)

Retinex理论与降噪类似,它的关键是合理地假设了图像的构成。将观察者看到的图像看成是一幅有乘性噪声的图像,那么入射光的分量就是一种乘性的,相对均匀,且变换缓慢的噪声。Retinex算法所做的就是合理地估计图像中各个噪声的位置,并去除它。
在极端的情况下,我们可以认为整幅图像中的分量都是均匀的,那么最简单的估计照度L的方式就是在将图像变换到对数域后对整副图像求均值。按照下面的步骤来验证这个猜想:
(1)将图像转换至对数域
在这里插入图片描述
(2)归一化去除加性分量
在这里插入图片描述
(3)对得到的结果求指数,翻转到实数域
在这里插入图片描述

% ImOriginal:原始图像
% type:'add'表示分量是加性的,如雾天图像;'mult'表示分量是乘性的,如对照度的估计
close all
clear all
clc
I=imread('1.jpg');
[m,n,z] = size(I);
ImOut = uint8(zeros(m,n,z));
type='mult';
for i = 1:z
    if strcmp(type,'add')
        ImChannel = double(I(:,:,i))+eps;
    elseif strcmp(type,'mult')
        ImChannel = log(double(I(:,:,i))+eps);
    else
        error('type must be ''add'' or ''mult''');
    end
    ImOut(:,:,i) = EnhanceOneChannel(ImChannel);
end
ImOut = max(min(ImOut,255), 0);
subplot(121)
imshow(I)
title('原始图像')
subplot(122)
imshow(ImOut)
title('处理后图像')
function ImOut = EnhanceOneChannel(ImChannel)
% 计算计算单个通道的反射分量
% 1.对全图进行照射分量估计
% 2.减去照射分量
% 3.灰度拉伸
ImChannel = ImChannel./max(ImChannel(:));
ImRetinex = round(exp(ImChannel.*5.54));
ImOut = uint8(ImRetinex);
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从结果中可以看出,对于去除照度,还原图像本身来讲,效果还可以,并且不会在边缘位置产生光晕现象。缺点就是在去除照度分量L过程中,保留的反射分量R在上述算法中使用归一化后直接进行反变换。这一步的作用可以近似看成取出一个均匀的直流分量,即均匀的照度分量。由于操作是全局的,这里默认假设了所有的位置的照射分量都是相同的,因此在灰度拉伸的时候没有照顾到局部的特性,图像整体亮度偏暗。当然,全局的照度估计对于图像的增强肯定有相当的局限性,其增强效果在色彩的还原个亮度处理等方面还是有一定缺陷的。
个人认为,Retinex算法的关键还是正确的分析了噪声的性质。
对于有雾的图像,我们可以看做透过一块磨砂玻璃去看一幅清晰的图像,这样就可以很好的理解为什么在算法中将雾的干扰看作是一个加性的了。诸如后面两个经典的算法,所有的这类算法归根结底就是更好的利用图像中的原像素点去估计原始照度。从上面的历程可以看出,使用一个全局估计对局部的增强效果是比较差的,如果存在照度不均匀(雾的浓度不均匀),或者背景颜色亮度很高等情况时,处理结果将会趋向恶劣,效果比较差。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/287607
推荐阅读
相关标签
  

闽ICP备14008679号