文档章节

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

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

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

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

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

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

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

   

                  原图                                     处理后的图

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

                   

      而局部方差为:

       

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

                

     其中的函数G(i,j)就是上文所讲的CG。一般情况下CG总是大于1的,这样高频成分就能得到增强。

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

                    

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

   

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

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

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

           

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

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

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

 

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

  

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

  

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

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

 

 

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

 

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

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

   

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

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

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

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

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

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

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

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

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

 

      参考论文:Real-Time Adaptive Contrast Enhancement

2013.10.19 日补充:

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

      

      

    抽空用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

 

 

 

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

 

 

本文转载自:http://www.cnblogs.com/Imageshop/p/3324282.html

共有 人打赏支持
abcijkxyz
粉丝 60
博文 6196
码字总数 1876
作品 0
深圳
项目经理
【数字图像处理】七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程《数字图像处理》及课件进行讲解,主要通过MFC单文档视图实现显示BMP图像增强处理,包括图像普通平滑、高斯平滑、...

Eastmount
2015/06/08
0
0
MUSICA(多尺度图像对比度增强)算法的简要原理及VC实现-1[r]

MUSICA的专利文档:MUSICApatent - Original document.pdf 算法原理: 图像增强的一般方法是对比度拉伸和直方图均衡,这两种方法对于灰度级过于集中, 还有大量的灰度级没有充分利用的情况下...

技术小美
2017/11/20
0
0
实时图像处理和机器学习库 - cv4j

The target is to set up a high quality and real-time image process and machine learning library which is implemented in pure java. The framework can run application on java desk......

匿名
2017/06/13
394
0
Canny算法解析,opencv源码实现及实例

-----------------Canny算法原理部分----------------- Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。 Canny边缘检测基本原理:(1)图象边缘检测必须满足两个...

piaoxuezhong
2017/04/12
0
0
SIFT四部曲之——高斯滤波

版权声明:本文为博主原创文章,未经博主允许不得转载。博客不用于商业活动,博主对博客的使用,拥有最终解释权 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用...

hit2015spring
2016/10/22
0
0
局部特征(4)——SIFT和SURF的比较

转自:http://blog.csdn.net/jwh_bupt/article/details/6567452 局部特征(1)——入门篇 局部特征(2)——Harris角点 局部特征(3)——SURF特征总结 局部特征(4)——SIFT和SURF的比较 局部特征(...

haima1998
02/11
0
0
图像处理之特征提取

知乎上看到一个话题—— 目前火热的 Deep Learning 会灭绝传统的 SIFT / SURF 特征提取方法吗? 由于之前研究过SIFT和HOG这两种传统的特征提取方法,故本篇文章先对SIFT和HOG作一综述,并比较...

牛奶芝麻
2017/11/27
0
0
Canny边缘检测算法原理及其VC实现详解(一)

图象的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般可以看作是一个阶跃,既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值。图象的边缘部分集中了图...

hejunbinlan
2015/09/08
265
0
图像直方图与直方图均衡化

图像直方图(英语:Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。可以借助观察该直方图了解需要如何调整亮度分布。这种直方图中,横坐标的左侧...

Tony沈哲
2017/05/22
0
0
基于HALCON的模板匹配方法总结

转自:http://m.blog.csdn.net/blog/u012913847/35549923 很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间。去年有过一段时间的集中学习,做了许多的练习和实验,...

weixin_37371316
02/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JAVA 三种WebService 规范

JAVA 中共有三种WebService 规范,分别是JAX-WS(JAX-RPC)、JAXM&SAAJ、JAX-RS。 1. Jaxws(掌握) JAX-WS 的全称为 Java API for XML-Based Webservices ,早期的基于SOAP 的JAVA 的Web 服务...

onedotdot
15分钟前
0
0
将博客搬至CSDN

将博客搬至CSDN

xpbob
16分钟前
0
0
TensorFlow 拟合异或 one-hot方式

增加隐含层数目 之前是按照计算出的数值按照0.5分为0和1,现在是算出向量,用维度较大的作为结果 import tensorflow as tfimport numpy as np# 网络结构:2维输入 --> 2维隐藏层 --> ...

阿豪boy
19分钟前
0
0
Aidl进程间通信详细介绍

目录介绍 1.问题答疑 2.Aidl相关属性介绍 2.1 AIDL所支持的数据类型 2.2 服务端和客户端 2.3 AIDL的基本概念 3.实际开发中案例操作 3.1 aidl通信业务需求 3.2 操作步骤伪代码 3.3 服务端操作...

潇湘剑雨
34分钟前
0
0
python爬虫日志(3)下载图片

import urlliburl='https://xxx.jpg'#图片地址res=urllib.request.urlopen(url)#此函数用于对url的访问data=res.read() #字节流with open(r'D:\1.jpg',"wb") as code: c...

茫羽行
51分钟前
0
0
vue中$emit的用法

1、父组件可以使用 props 把数据传给子组件。 2、子组件可以使用 $emit 触发父组件的自定义事件。 vm.$emit( event, arg ) //触发当前实例上的事件 vm.$on( event, fn );//监听event事件后运...

JamesView
今天
0
0
bash审计系统搭建

step1:使用saltstack工具bash部署>>>>>> # salt -N clienta state.sls audit step2:安装elasticsearch>>>>>> 注意: 1.不能以root用户进行启动,需要创建用户,并对解压的elasticsearch目录赋......

硅谷课堂
今天
0
0
Linux sar性能分析

Linux使用sar进行性能分析 sar简介 sar命令常用格式 sar常用性能数据分析 整体CPU使用统计-u 各个CPU使用统计-P 内存使用情况统计-r 整体IO情况-b 各个IO设备情况-d 网络统计-n sar日志保存-...

易野
今天
0
0
用 Python 实现打飞机,让子弹飞吧!

所用技术和软件 python 2.7 pygame 1.9.3 pyCharm 准备工作 安装好 pygame 在第一次使用 pygame 的时候,pyCharm 会自动 install pygame。 下载好使用的素材。 技术实现 初始化 pygame 首先要...

猫咪编程
今天
0
0
MySQL的行锁和表锁

简单总结一下行锁和表锁。 行锁 每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 表锁 每次操作锁住整张表。开销小,加锁快;不会出...

to_ln
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部