文档章节

基于色彩恒常( color constancy)特性的Frankle-McCann Retinex图像增强。

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:41
字数 1638
阅读 11
收藏 0
点赞 0
评论 0

      相关随笔可见:带色彩恢复的多尺度视网膜增强算法(MSRCR)的原理、实现及应用。

     从历史的顺序上讲,本篇应该放在MSRCR之前的,只是由于现在大多论文都是描述的MSRCR,因此我也是先学习MSRCR的。

     今天,无意中找寻一些Retinex资料,搜索到一篇文章《Retinex in matlab》,原以为是MSRCR之类的matlab实现,结果仔细一看,和MSRCR算法的描述完全不同。于是找了一些资料,对Retinex的历史有了进一步了解,以下复制一些论文中的文档以供说明:

     ******************************************************************************************************************************************************************************

    文章地址:http://www.doc88.com/p-993974139685.html

    近年来,在现代生理学和心理学的启发下,美国物理学家Land等人设计出了Retinex(视网膜皮层)模型,并在符合人眼的颜色恒常性理论前提下,提出了基于Retinex的图像增强算法。这种算法建立的基础是假设人眼感知目标的亮度和颜色由环境光照和目标表面的反射光照决定,保持目标的颜色恒常性主要就是估计环境光照,并去除环境光照的影像。这样就得到了准确的目标颜色和亮度信息。由于Retinex算法具有高动态范围压缩、高色彩保真度和良好的局部细节增强等特点,引起了大量的国外学者的兴趣。为准确估计亮度分量,选取计算路径常见有一维和二维的区别。早期,Land提出选取随机路径,并对路径所经过的像素进行累加计算亮度,这种方法的缺陷在于当前像素点的亮度和随机路径上的像素亮度有关和其领域周围的像素亮度几乎无关,使得增强后的图像出现亮度不连续的现象。随后出现了两种迭代分段线性路径,即McCann99 Retinex Frankle-McCann Retinex,相比随机路径的Retinex而言,他们的增强效果较好。然而,他们的共同缺陷在于计算复杂度比较高,且迭代次数的选择对增强效果的影响至关重要。2004年,Ciurea和Funt发表了自动选择迭代次数的论文后,这一难题才得以解决。 Land分析了一维路径选择的缺陷,提出了二维路径的选择方式,即中心/环绕Retinex算法。这种方式下,当前像素点周围领域内像素亮度值作为计算依据,且Jobson等人严谨的证明了高斯卷积函数满足中心/环绕函数要求...........................................(以下就是SSR\MSR\MSRCR...等等)。

     ******************************************************************************************************************************************************************************

    由以上描述可见,Frankle-McCann Retinex采用了一维路径寻找方式估计亮度,而MSRCR是二维的,后者则更为复杂。

    关于FMR算法的原理呢,我一下子也讲不清,这里稍微对算法的一些过程进行简单的介绍吧。

    首先,算法的输入需要是[0,1]范围的浮点数,并且是按对数分布的,这个通常需要将[0,255]按对数方式量化到[0,1]范围内。

    然后按照下图所示的路径对每个点的数据进行相比、想乘、复位和平均操作。

                   

      这个我实在是说不清楚了,给几个链接大家自己看看吧:

      基于心理物理学评价和偏爱映射的高动态范围图像的色调映射算子的设计

        基于色彩恒常性的图像去雾技术

      Retinex in Matlab

      最后把处理的数据从对数域转换到[0,255]范围内(这里需要使用exp函数哦)。

      我们还是把时间放在算法效果的简要分析上。

     

     一般情况下,可以认为FMR算法只有迭代次数一个参数。由上图可见,迭代次数越小,图像的对比度越小,连读越亮,动态压缩范围越小。迭代次数越大,图像的对比度越强烈。从直方图上看,迭代次数小时,直方图会聚集在一起,随着迭代次数等增加,直方图逐渐分布到全部动态范围内。 当迭代次数特别大时,图像会和原始图像很接近。

      我们在贴一些该算法处理的结果。

          

          

          

                       原图                                                迭代两次                                                迭代10次

     可见,对一些偏暗的图像的增强效果还是很明显。

     经过测试证明,这个算法对于我们在正常光照下拍摄的照片的处理有意想不到的效果,可以产生类似HDR的效果,贴出如下:

       

       

                               原图                                                                              处理后

   另外,该算法对偏色图像也有一定的纠偏能力,比如下图。

                                                                            

      

                                 原图                                                                             处理后

   贴出一段比较粗糙的实现该函数的matlab代码:

 

function Test()
    clear all
    rgb=imread('c:\222.jpg');%需要处理的图片
    m=size(rgb,1);
    n=size(rgb,2);
    rr=zeros(m,n);
    gg=zeros(m,n);
    bb=zeros(m,n);
    for i=1:m
        for j=1:n
            rr(i,j)=logm(double(rgb(i,j,1))+eps);
            gg(i,j)=logm(double(rgb(i,j,2))+eps);
            bb(i,j)=logm(double(rgb(i,j,3))+eps);
        end
    end
    rr=rr/max(max(rr(:)));
    gg=gg/max(max(gg(:)));
    bb=bb/max(max(bb(:)));
    rrr= retinex_frankle_mccann(rr, 4);
    ggg= retinex_frankle_mccann(gg, 4);
    bbb= retinex_frankle_mccann(bb, 4);
    for i=1:m
        for j=1:n
            rrr(i,j)=round(exp(rrr(i,j)*5.54));
            ggg(i,j)=round(exp(ggg(i,j)*5.54));
            bbb(i,j)=round(exp(bbb(i,j)*5.54));
        end
    end
    rgb=cat(3,uint8(rrr),uint8(ggg),uint8(bbb));
    rgb=max(min(rgb,255),0);
    imshow(rgb);
end

function [ Retinex ] = retinex_frankle_mccann( L, nIterations )
    global RR IP OP NP Maximum
    RR = L;
    Maximum = max(L(:));                                 % maximum color value in the image
    [nrows, ncols] = size(L);
    shift = 2^(fix(log2(min(nrows, ncols)))-1);          % initial shift
    OP = Maximum*ones(nrows, ncols);                     % initialize Old Product
    while (abs(shift) >= 1)
        for i = 1:nIterations
            CompareWith(0, shift);                         % horizontal step
            CompareWith(shift, 0);                         % vertical step
        end
        shift = -shift/2;                                 % update the shift
    end
    Retinex = NP;
end

function CompareWith(s_row, s_col)
    global RR IP OP NP Maximum
    IP = OP;
    if (s_row + s_col > 0)
        IP((s_row+1):end, (s_col+1):end) = OP(1:(end-s_row), 1:(end-s_col)) + ...
            RR((s_row+1):end, (s_col+1):end) - RR(1:(end-s_row), 1:(end-s_col));
    else
        IP(1:(end+s_row), 1:(end+s_col)) = OP((1-s_row):end, (1-s_col):end) + ...
            RR(1:(end+s_row),1:(end+s_col)) - RR((1-s_row):end, (1-s_col):end);
    end
    IP(IP > Maximum) = Maximum;                          % The Reset operation
    NP = (IP + OP)/2;                                    % average with the previous Old Product
    OP = NP;                                             % get ready for the next comparison
end

    同样,提供个编译好的文件给有兴趣研究该算法的朋友看看效果:

   http://files.cnblogs.com/Imageshop/Frankle_Mccann_Retinex.zip

 

 ***************************作者: laviewpbt   时间: 2013.4.18    联系QQ:  33184777  转载请保留本行信息*************************

 

本文转载自:http://www.cnblogs.com/Imageshop/archive/2013/04/18/3029352.html

共有 人打赏支持
abcijkxyz
粉丝 61
博文 6195
码字总数 1876
作品 0
深圳
项目经理
现代图像处理技术试题

问题1:灰度图像数学形态学 以二值图像数学形态学为切入点,建立灰度图像数学形态学。 1.给出灰度图像的腐蚀、膨胀、开启和闭合等运算的表达式和基本性质; 2.对灰度图像,给出扁平结构元素...

乱世中的单纯 ⋅ 2014/11/26 ⋅ 1

用Python做图像处理

用Python做图像处理 最近在做一件比较 evil 的事情——验证码识别,以此来学习一些新的技能。因为我是初学,对图像处理方面就不太了解了,欲要利吾事,必先利吾器,既然只是做一下实验,那用...

彭博 ⋅ 2012/03/02 ⋅ 2

图片和图形之扩展色彩内容增强图形(20)

原文 概要 除了标准RGB(sRGB)之外,Android 8.0(API级别26)还引入了对额外色彩空间的色彩管理支持,以 在具有兼容显示的设备上呈现图形。有了这种支持,您的应用程序可以通过Java或本地代...

lichong951 ⋅ 05/26 ⋅ 0

15种CSS混合模式让图片产生令人惊艳的效果

如果你曾经广泛地使用过图片编辑应用软件(例如,Adobe Photoshop,Pixelmator,GIMP等),那么你可能对混合模式比较熟悉。如同名称中所暗示的,混合模式是指将上层的图像融入下层图像时采用...

欲思 ⋅ 2014/07/11 ⋅ 1

gThumb 3.3.3 发布,Linux 图像浏览器

gThumb 3.3.3 发布,此版本添加了图像工具,改进首选项对话框 UI,修复了 GTK 3.14 等。 最值得关注的改进是添加了两个图像工具:special effects (which includes effects such as Desert,...

oschina ⋅ 2015/02/12 ⋅ 0

Win8Metro(C#)数字图像处理--2.7图像伪彩色

原文:Win8Metro(C#)数字图像处理--2.7图像伪彩色  2.7图像伪彩色函数 [函数名称] 图像伪彩色函数PseudoColorProcess(WriteableBitmap src) [算法说明] 伪彩色是为改善视觉效果,利用计算...

杰克.陈 ⋅ 03/13 ⋅ 0

10 款最新的web开发用的iPhone应用

供开发者和设计师使用的 iPhone 应用越来越多,本文介绍10款最新的web开发用的iPhone应用。 Color 1. cliqcliq Colors 应用包括主页,我的色彩,调色板编辑,照片色彩提取,以及详细页。 2....

小卒过河 ⋅ 2011/08/05 ⋅ 1

解决问题的艺术:半小时编程实现照片的反转负冲特效

如何直接有效的解决问题是一门艺术。我们是做产品、做系统、做服务的,不是玩技术的,需要做的是在最短的时间内以最有效的方式来解决工作中面对的难题。就在刚才,用了半小时不到时间,俺用一...

最美的回忆 ⋅ 2017/03/06 ⋅ 0

一种简单的色彩平衡算法的OPENCV实现

很久之前看过一篇关于色彩平衡文章,在该文章中介绍了一种非常简单高效的 色彩平衡算法。下图是算法的演示效果(左边为处理后的图像,右边为处理前的图像)。 从图中可以看出算法有效的改善的...

云栖希望。 ⋅ 2017/12/04 ⋅ 0

图像分类综述

计算机视觉三个层次 计算机视觉三层次 1. 图像分类概述 1.1 图像分类是指根据一定的分类规则将图像自动分到一组预定义类别中的过程。 1.2 图像分类方法的划分十分多样。根据图像语义内容的不...

七八音 ⋅ 01/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Greys Java在线问题诊断工具

Greys是一个JVM进程执行过程中的异常诊断工具。 在不中断程序执行的情况下轻松完成JVM相关问题排查工作 目标群体 有时候突然一个问题反馈上来,需要入参才能完成定位,但恰恰没有任何日志。回...

素雷 ⋅ 21分钟前 ⋅ 0

git从远程仓库拉取代码的常用指令

一种(比较麻烦的)拉代码的方法 git clone //克隆代码库,与远程代码库的主干建立连接,如果主干已经在就不用再clone啦,克隆路径为当前路径下的新创建的文件夹 git checkout -b //本地建立...

Helios51 ⋅ 35分钟前 ⋅ 0

005. 深入JVM学习—Java堆内存参数调整

1. JVM整体内存调整图解(调优关键) 实际上每一块子内存区域都会存在一部分可变伸缩区域,其基本流程:如果内存空间不足,则在可变的范围之内扩大内存空间,当一段时间之后,内存空间不紧张...

影狼 ⋅ 40分钟前 ⋅ 0

内存障碍: 软件黑客的硬件视图

此文为笔者近日有幸看到的一则关于计算机底层内存障碍的学术论文,并翻译(机译)而来[自认为翻译的还行],若读者想要英文原版的论文话,给我留言,我发给你。 内存障碍: 软件黑客的硬件视图...

Romane ⋅ 今天 ⋅ 0

SpringCloud 微服务 (七) 服务通信 Feign

壹 继续第(六)篇RestTemplate篇 做到现在,本机上已经有注册中心: eureka, 服务:client、order、product 继续在order中实现通信向product服务,使用Feign方式 下面记录学习和遇到的问题 贰 or...

___大侠 ⋅ 今天 ⋅ 0

gitee、github上issue标签方案

目录 [TOC] issue生命周期 st=>start: 开始e=>end: 结束op0=>operation: 新建issueop1=>operation: 评审issueop2=>operation: 任务负责人执行任务cond1=>condition: 是否通过?op3=>o......

lovewinner ⋅ 今天 ⋅ 0

浅谈mysql的索引设计原则以及常见索引的区别

索引定义:是一个单独的,存储在磁盘上的数据库结构,其包含着对数据表里所有记录的引用指针. 数据库索引的设计原则: 为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索...

屌丝男神 ⋅ 今天 ⋅ 0

String,StringBuilder,StringBuffer三者的区别

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。 首先说运行速度,或者说是, 1.执行速度 在这方面运行速度快慢为:StringBuilder(线程不安全,可变) > StringBuffer...

时刻在奔跑 ⋅ 今天 ⋅ 0

java以太坊开发 - web3j使用钱包进行转账

首先载入钱包,然后利用账户凭证操作受控交易Transfer进行转账: Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/Credentials credentials = Wallet......

以太坊教程 ⋅ 今天 ⋅ 0

Oracle全文检索配置与实践

Oracle全文检索配置与实践

微小宝 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部