使用局部标准差实现图像的局部对比度增强算法。

摘要:
在这一方面,传统的线性对比度拉升以及直方图均衡化是使用的最为广泛的全局图像增强方法。对比度拉升线性的调整了图像的动态范围,而直方图均衡化栖利用累计直方图分布概率重新映射图像的数据。AHE算法使用局部的直方图的相关信息对数据进行映射。这改变了图像的对比度,但是需要大量的计算。一种解决的方案就是使用不同的增益。

图像的对比度增强算法在很多场合都有着重要的应用,特别是在医学图像上,这是因为在众多疾病的诊断中,医学图像的视觉检查时很有必要的。而医学图像由于本身及成像条件的限制,图像的对比度很低。因此,在这个方面已经开展了很多的研究。这种增强算法一般都遵循一定的视觉原则。众所周知,人眼对高频信号(边缘处等)比较敏感。虽然细节信息往往是高频信号,但是他们时常嵌入在大量的低频背景信号中,从而使得其视觉可见性降低。因此适当的提高高频部分能够提高视觉效果并有利于诊断。

在这一方面,传统的线性对比度拉升以及直方图均衡化是使用的最为广泛的全局图像增强方法。对比度拉升线性的调整了图像的动态范围,而直方图均衡化栖利用累计直方图分布概率重新映射图像的数据。这些方法虽然简单,但是都没有考虑到局部的信息。并且,全局直方图均衡化(GHE)还会产生使得一些噪音过度加强。

在局部对比度增强方面,有两种方式是最为有名的,一种是自适应直方图均衡化(AHE),这个算法可以参考我的博文限制对比度自适应直方图均衡化算法原理、实现及效果。还有一种就是自适应对比度增强(ACE)。AHE算法使用局部的直方图的相关信息对数据进行映射。这改变了图像的对比度,但是需要大量的计算。后来有人利用了双线性差值技术克服了这个问题,首先将图像分块,然后分别计算这些快内部的映射关系。为了增强某一个像素点的值,映射关系通过与这个像素所在块相邻的四个块的映射关系差值获得。在这个算法中,仅仅需要一个块大小的参数(在我的博文中还对参数进行了扩展)。

ACE算法采用了反锐化掩模技术,我们对此过程解释如下:首先图像被分成两个部分。一是低频的反锐化掩模(unsharp mask)部分,可以通过图像的低通滤波(平滑,模糊技术)获得。二是高频成分,可以过原图减去反锐化掩模获取。然后高频部分被放大(放大系数即为对比度增益CG)并加入到反锐化掩模中去,最后得到增强的图像。ACE算法的核心就是如何计算CG,这里将介绍两种简单的CG计算方法。

在继续说明之前,先贴一幅这个算法处理的图给大家看看效果,免得都是通篇的文字。

使用局部标准差实现图像的局部对比度增强算法。第1张使用局部标准差实现图像的局部对比度增强算法。第2张

原图                                     处理后的图

在谈及CG之前,我们还是需要看看一些基础的工作。首先上面谈到了unsharp mask,他对应于图像的低频成分。对于具体的像素,一般可以通过计算以该像素为中心的局部区域的像素平均值来实现。我们假定x(i,j)是图像中某点的灰度值,局部区域的定义为:以(i,j)为中心,窗口大小为(2n+1)*(2n+1)的区域,其中n为一个整数。当然这个窗口区域也不一定就要是正方形。局部的平均值,也就是低频部分,可以用下式计算:

使用局部标准差实现图像的局部对比度增强算法。第3张

而局部方差为:

使用局部标准差实现图像的局部对比度增强算法。第4张

上式中σx(i,j)就是所谓的局部标准差(LSD)。定义f(i,j)表示x(i,j)对应的增强后的像素值。则ACE算法可以表示如下:

使用局部标准差实现图像的局部对比度增强算法。第5张

其中的函数G(i,j)就是上文所讲的CG。一般情况下CG总是大于1的,这样高频成分使用局部标准差实现图像的局部对比度增强算法。第6张就能得到增强。

关于CG的取值,一种最简单的方式就是令其为常量,假定为C,一般C>1,这样式3就变为:

使用局部标准差实现图像的局部对比度增强算法。第7张

这种情况下,图像中所有的高频部分都被同等放大,可能有些高频部分会出现过增强的现象的。

使用局部标准差实现图像的局部对比度增强算法。第8张使用局部标准差实现图像的局部对比度增强算法。第9张使用局部标准差实现图像的局部对比度增强算法。第10张

原图 n=50,c=2n=50,c=3

在上图中,分别使用了C=2及C=3的的情况,在C=3时,可见星球边缘的部分被过增强,出现成片的白色。

一种解决的方案就是使用不同的增益。Lee等人提出了如下的方案:

使用局部标准差实现图像的局部对比度增强算法。第11张

上式中,D是个常数,这样,CG是空间自适应的,并且和局部均方差成反比,在图像的边缘或者其他变化剧烈的地方,局部均方差比较大,因此CG的值就比较小,这样就不会产生振铃效应。然而,在平滑的区域,局部均方差就会很小,这样CG的值比较大,从而引起了噪音的放大,所以需要对CG的最大值做一定的限制才能获得更好的效果。

D这个常数的取值有些文章介绍说用图像的全局平均值,我编程的时候是用的图像的全局均方差,并且增加一个参数Amount,用来再次控制高频增强的程度。

对式我们进行了编程,并测试一些图像,当进行一些参数的调整时,都能获得比较理想的增强效果,举例如下:

使用局部标准差实现图像的局部对比度增强算法。第8张使用局部标准差实现图像的局部对比度增强算法。第13张使用局部标准差实现图像的局部对比度增强算法。第14张

原图n=20,Amount=100,MaxCG=3 n=20,Amount=100,MaxCG=10

使用局部标准差实现图像的局部对比度增强算法。第15张使用局部标准差实现图像的局部对比度增强算法。第16张使用局部标准差实现图像的局部对比度增强算法。第17张

原图n=25,Amount=100,MaxCG=2n=50,Amount=150,MaxCG=2

使用局部标准差实现图像的局部对比度增强算法。第18张使用局部标准差实现图像的局部对比度增强算法。第19张使用局部标准差实现图像的局部对比度增强算法。第20张

原图n=50,Amount=150,MaxCG=3n=50,Amount=150,MaxCG=10

不仅是对医学图像,对于我日常生活中的一些不是很理想的图片,经过上述ACE算法在大部分情况下也可获得较好的效果:

使用局部标准差实现图像的局部对比度增强算法。第21张使用局部标准差实现图像的局部对比度增强算法。第22张

使用局部标准差实现图像的局部对比度增强算法。第23张使用局部标准差实现图像的局部对比度增强算法。第24张

为什么要对CG的最大值进行限制,我们举下面这个图作为例子:

使用局部标准差实现图像的局部对比度增强算法。第25张使用局部标准差实现图像的局部对比度增强算法。第26张

原图 n=50,Amount=150,CG不限制

在上图中,图像右上角部位属于平滑区域,但是仔细观察有着微弱的层次感,如果不对CG进行限制,则由于LSD的值很小,导致CG的值特别大,从而产生像素饱和的现象(即像素的值超过了255)。如右图所示,解决这个问题一种方法就是增加n的值,即增加取样半径,通过取样半径的增加,使得以平滑区域为中心的窗口能够覆盖一些非平滑的区域,从而产生较大的LSD值。另外一种就是采用CG限幅的方式,效果如下:

使用局部标准差实现图像的局部对比度增强算法。第27张使用局部标准差实现图像的局部对比度增强算法。第28张

n=200,Amount=150,CG不限制 n=50,Amount=150,CG<3

针对不同的图像,要想获得理想的效果,可能还是需要人工的去参与和调整这些参数,我目前尚未发现能自动确定这些参数的文章。

根据公式5,是不难写出实现代码的,但还要实用,主要的难点还是如何实现快速的计算,因为随着取样半径n的增加,每个像素点涉及到的区域范围就越广,计算量会直线上升,因此需要采用优化的策略。

均值模糊的优化已经有了很多成熟的方案,普遍的就是先行均值,在列均值,当然还有更好的优化方式。

而计算局部均方差,则需要一定的水平了,但是同样的原理还是利用每变换一次都有很多的重叠的部分的数据,这个等有空了我会专门写篇文章的。

虽然采用了优化算法,但是实际上这个算法还是有点慢的,主要原因还是计算均方差确实有点耗时,并且优化的算法也是下一行像素的结果值依赖于前一行的计算结果,而对于第一行是需要进行特殊处理的,因此,这个使用GPU计算也是很难进一步进行优化的。

但是优化后的算法执行时间和n基本是没有关系的。

同样,提供个编译好的文件给有兴趣研究该算法的朋友看看效果:http://files.cnblogs.com/Imageshop/LocalAreaContrastEnhance.rar

当然,这个算法不是对任何图像都能产生正能量,那些本来就很好的图,你用它只会适得其反。

使用局部标准差实现图像的局部对比度增强算法。第29张

参考论文:Real-Time Adaptive Contrast Enhancement

2013.10.19 日补充:

今日对改算法又进行了一些测试,发现其对雾天图像,或者比较昏暗的图像都有很好的增强作用,再补充一些测试图像的例子:

使用局部标准差实现图像的局部对比度增强算法。第30张使用局部标准差实现图像的局部对比度增强算法。第31张

使用局部标准差实现图像的局部对比度增强算法。第32张使用局部标准差实现图像的局部对比度增强算法。第33张

抽空用C++写了个标准的DLL,结合OpenMp工具对算法实现了多线程运行,执行速度上比C#的多线程版本要快那么一点点的。

DLL的接口函数函数如下:

[DllImport("LocalAreaContrastEnhance.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, ExactSpelling = true)]
private static extern void LocalAreaContrastEnhance(byte* Scan0, int Width, int Height, int Stride, int Radius, int Amount, int MaxCG);

注意我只实现了24位的算法。
再上传一个C#调用该DLL的代码示例:http://files.cnblogs.com/Imageshop/LocalAreaContrastEnhanceTest.rar

使用局部标准差实现图像的局部对比度增强算法。第34张

使用局部标准差实现图像的局部对比度增强算法。第35张

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

免责声明:文章转载自《使用局部标准差实现图像的局部对比度增强算法。》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS开发~蓝牙开发Oracle-检查数字中有无这符下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[Java工程实践] 1.Java常用概念:Bean

一、Java Bean基本概念: 1、所有属性为private2、提供默认构造方法3、提供getter和setter4、实现serializable接口 作者:杨博链接:https://www.zhihu.com/question/19773379/answer/31625054来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。...

ffmpeg文档17-视频编码器

17 视频编码器 介绍一些当前有效的视频编码器 libtheora libtheora的封装 编译需要头和库文件,还需要利用--enable-libtheora在配置中允许 更多信息参考http://www.theora.org/ libtheora选项 下面是映射给libtheora的全局选项,它们对品质和码率产生影响。 b 对CBR(固定码率编码...

人脸识别的会遇到的问题及解决方法

参考:https://blog.csdn.net/duan19920101/article/details/50683988/?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242 注:以前做过基于KNN算法的人脸识别,但是未做这样的总结,这...

算法竞赛专题解析(6):搜索进阶(1)--搜索基础

本系列是这本算法教材的扩展:《算法竞赛入门到进阶》(京东当当) 清华大学出版社PDF下载地址:https://github.com/luoyongjun999/code 其中的“补充资料”如有建议,请联系:(1)QQ 群,567554289;(2)作者QQ,15512356 目录 1 搜索简介 2 搜索算法的基本思路 3 BFS的性质和代码实现 4...

使用lockbits方法处理图像(转)

   许多图像处理任务即时是最简单的文件类型转换,例如从32位深度到8位深度的格式转化,直接获得像素阵列要比使用GetPixel和SetPixel等方法的效率高得多。         你可能会发现DotNet采用托管机制,大多数情况下微软会推荐你使用托管代码,理由是便捷和安全。实际应用中,直接操作内存中的数据块是很少见的,尽管如此,图像处理恰恰是这类为数...

麻省理工公开课《算法导论》学习笔记:第一讲

主题:简介课程,渐近概念的大局观,插入排序和归并排序,递归式函数时间分析(递归树方法) 教材:《算法导论》 收获:很感动地看到算法分析那个log(n)是为什么出现了,更深层还要听第二讲,若不是因为要准备SAS,恨不得马上看。 内容: 1 何为算法分析? 计算机程序运行性能和存储空间的理论分析,叫算法分析。也就是关注2点:1 性能,就是程序跑得快不快; 2...