自适应对比度增强(ACE)算法原理及实现
前注:
ACE在图像处理方面可以有两种表示,一种是在http://blog.csdn.net/piaoxuezhong/article/details/78357815说的:Automatic Color Equalization,即自动彩色均衡;还有一种是本篇要说的:Adaptive Contrast Enhancement,即自适应对比度增强 。不要搞混了~_~
医学图像由于本身及成像条件的限制,图像的对比度很低,因此对比度增强算法在医学图像方面显得很有必要。人眼对高频信号(边缘)比较敏感,但是如果高频信号嵌入在大量的低频背景+噪声信号中,其视觉可见性会降低,此时适当提高高频部分能够提高视觉效果。在这方面,传统的线性对比度拉升以及直方图均衡是最为广泛的全局图像增强方法。对比度拉升可以调整图像的动态范围,直方图均衡则是利用直方图分布概率重新映射图像的数据。但是,全局直方图均衡化可能加强部分噪声信号。为了避免低频背景的干扰,采用“局部”的增强方法可能会取得更好的效果。
在局部对比度增强方面,有两种方法较为常用:一是在http://blog.csdn.net/piaoxuezhong/article/details/78271785中说的自适应直方图均衡,另一种是本篇要说的自适应对比度增强。
自适应对比度增强原理:
ACE原理其实挺简单的,即是将一幅图像分成两个部分:一是低频部分,可以通过图像的低通滤波(平滑模糊)获得;二是高频部分,可以由原图减去低频部分得到。而算法的目标是增强代表细节的高频部分,即对高频部分乘以某个增益值,然后重组得到增强的图像。所以ACE算法的核心就是高频部分增益系数的计算,一种方案是将增益设为一个固定值,另一种方案是将增益值表示为与方差相关的量,后面在附加的公式中再说明。
假设一幅图像中像素点表示为 x(i,j), 那么以(i,j)为中心,窗口大小为(2n+1)*(2n+1)的区域内,其局部均值和方差可以表示为:
,,
均值mx可以近似认为是背景部分,此时 x-m 即是高频细节部分,对高频作增益乘积,有:
对于增益G,方案一是取大于1的常数,达到增强的效果,即为:
方案二是表示为与局部均方差成反比的变化值,即为:
在图像的高频区域,局部均方差较大,此时增益值就比较小,这样结果不会出现过亮情况。但是在图像平滑的区域,局部均方差很小,此时增益值比较大,从而可能会放大噪声信号,所以需要对增益最大值做一定的限制才能取得较好的效果。
自适应对比度增强实现:
根据上面的原理部分,及参照网上的代码,我用opencv实现了一下,代码如下:
#include <iostream>
#include <opencv2/opencv.hpp> using namespace cv;
using namespace std;Mat matrixWiseMulti(Mat &m1, Mat &m2){Mat dst = m1.mul(m2);return dst;
}//float MaxCG:对高频成分的最大增益值,int n:局部半径,int C:对高频的直接增益系数
void ACE(Mat &src, int C = 3, int n = 3, float MaxCG = 7.5){int rows = src.rows;int cols = src.cols;Mat meanLocal; //图像局部均值 Mat varLocal; //图像局部方差 Mat meanGlobal;//全局均值Mat varGlobal; //全局标准差 blur(src.clone(), meanLocal, Size(n, n)); imshow("低通滤波", meanLocal);Mat highFreq = src - meanLocal;//高频成分 imshow("高频成分", highFreq);varLocal = matrixWiseMulti(highFreq, highFreq);blur(varLocal, varLocal, Size(n, n)); //换算成局部标准差 varLocal.convertTo(varLocal, CV_32F);for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){varLocal.at<float>(i, j) = (float)sqrt(varLocal.at<float>(i, j));}}meanStdDev(src, meanGlobal, varGlobal);Mat gainArr = 0.5 * meanGlobal / varLocal;//增益系数矩阵 //对增益矩阵进行截止 for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){if (gainArr.at<float>(i, j) > MaxCG){gainArr.at<float>(i, j) = MaxCG;}}}gainArr.convertTo(gainArr, CV_8U);gainArr = matrixWiseMulti(gainArr, highFreq);Mat dst1 = meanLocal + gainArr;imshow("变增益方法", dst1);Mat dst2 = meanLocal + C*highFreq; imshow("恒增益方法", dst2);
}int main()
{const char* img_path = "1.bmp"; Mat src = imread(img_path, 0);imshow("src", src);int C = 5;int n = 7;float MaxCG = 8;ACE(src, C,n, MaxCG);waitKey();return 0;
}
参考:
http://www.cnblogs.com/Imageshop/p/3324282.html
http://www.cnblogs.com/jsxyhelu/p/4857721.html
http://blog.csdn.net/m_buddy/article/details/53365473
自适应对比度增强(ACE)算法原理及实现相关推荐
- MUSICA(多尺度图像对比度增强)算法的简要原理及VC实现-1[r]
MUSICA的专利文档:MUSICA_patent - Original document.pdf 算法原理: 图像增强的一般方法是对比度拉伸和直方图均衡,这两种方法对于灰度级过于集中, 还有 ...
- 【图像处理】彩色图像自适应对比度增强(OpenCV实现)
[fishing-pan:https://blog.csdn.net/u013921430 转载请注明出处] 提到图像增强,第一印象就是直方图均衡与直方图规定化,这是最常见的也是非常有效的全局图像 ...
- 多变异位自适应遗传算法(MMAdapGA)的算法原理、算法步骤和matlab实现
算法原理 自适应遗传算法是交叉概率和变异概率能够随使用度自动改变,以求得相对某个解的最佳交叉概率和变异概率.本算法是在自适应遗传算法中引进多变异位,以增加种群的多样性. 自适应遗传算法中的交叉概率和变 ...
- matlab 图像局部增强,【图像增强】局部对比度增强CLAHE算法之直方图增强【Matlab 102期】...
一.源代码 %% tic %% 清空工作区与变量 clc; clear; for image_number=1:1 imageName=strcat(num2str(image_number),'.j ...
- 数字图像处理 图像对比度增强算法概览
一.图像对比度增强 图像对比度增强又叫作图像对比度拉伸或者直接称为点运算.图像亮度和对比度调整的目的之一是在合适的亮度上提供最大的细节信息,细节纹理的沟纹越深,图像越清晰.在图像处理中,图像对比度增强 ...
- [论文阅读] (11)ACE算法和暗通道先验图像去雾算法(Rizzi | 何恺明老师)
<娜璋带你读论文>系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢.由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学 ...
- Emgucv不完整图像分割试验(十九)——Emgucv实现ACE算法
图像相关的ACE算法有自适应色彩和自适应对比度增强两种缩写的意思,本文是针对对比度自适应增强的.网上代码很多的,但都是基于Opencv实现的, 相关介绍可以直接看:https://blog.csdn. ...
- 语音增强--子空间算法及MATLAB实现
语音增强--------------子空间算法 原理介绍 子空间方法的原理是将观测信号的向量空间分解为信号子空间和噪声子空间,通过消除噪声子空间并保留信号子空间从而估计出干净语音,子空间分解的过程是对 ...
- 【图像增强】基于matlab萤火虫算法图像对比度增强【含Matlab源码 2142期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像增强]基于matlab萤火虫算法图像对比度增强[含Matlab源码 2142期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方 ...
- 用于图像去雾的优化对比度增强算法
图像去雾哪家强?之前我们已经讨论过了著名的基于暗通道先验的图像去雾(Kaiming He, 2009)算法,如果你用兴趣可以参考: 暗通道优先的图像去雾算法(上) 暗通道优先的图像去雾算法(下) 此外 ...
最新文章
- 高并发存储番外篇:Redis套路,一网打尽
- hdu3870 基于最短路的最小割
- ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器
- 2019年,异质图神经网络领域有哪些值得读的顶会论文?
- 介绍一个统计各个网站访问时长的Chrome扩展 - Rooster
- 好用的vp n推荐2020_哪个牌子的沐浴露好,2020年最新沐浴露选购测评,好用好闻易清洗沐浴露品牌推荐...
- python jupyter
- 【图像检索】基于matlab GUI综合颜色和形状特征图像检索【含Matlab源码 1370期】
- 【记录】帮同学做的一个函数拟合
- 移远 EC20 模组(4G通信模组)AT指令测试 TCP 通信过程
- java diamond 有什么用_Diamond语法何时在Java 8中不起作用?
- C++定时器和时间轮
- java查询时加上进度条插件,简单的jquery进度条插件LineProgressbar.js
- 【AE】【栅格操作】
- Pr 添加字幕 预览不显示 是你没有打开字幕开关
- 房产估值模型训练及预测结果
- jsp通过<%@include file=“bottom.txt“ %>指令引入txt乱码的解决方法
- 关于Python常用的办公自动化技巧
- 大数据时代,为什么很多JAVA程序员会转型做JAVA大数据
- 谁该承担中国SaaS贫瘠生态的一点责任