[blogs 算法原理 ]局部标准差实现对比度增强

基于“局部标准差”的图像增强(原理、算法、代码)

一、理论

图像增强算法的基本原则是“降低低频区域,突出高频区域”,以此强化边缘,达到增强的目的。最简单的例子就是通过原始图像减去高斯模糊处理后的图像,就能够将边缘强化出来。

直方图均衡化也是一种非常常见的增强方法。但是为了避免背景的干扰,更倾向于采用“局部”方法进行处理。我们这里着重研究自适应对比度增强(ACE)的相关内容。

ACE的定义和原理(TODO)

ACE算法的相关内容:

计算低频成分:

对于具体的像素,一般可以通过计算以该像素为中心的局部区域的像素平均值来实现。

而局部方差为:

则ACE算法可以表示为:

看上去还是比较简单的。这里的都可以根据图像本身计算出来。而则需要单独计算。

可以为单独的常量,或者通过来代替。这里的D是一个全局的值,比如平均值。

二、实现

涉及到局部的运算,自然而然会想到使用卷积的方法。更好的是Opencv提供了专门的函数用来做这个工作—BLUR

文档中写到:

那么正是我们想要的结果。

//ace 自适应对比度均衡研究
//by  jsxyhelu
//感谢 imageshop
#include "stdafx.h"
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace std;
using namespace cv;
//点乘法 elementWiseMultiplication
cv::Mat EWM(cv::Mat m1,cv::Mat m2){
    Mat dst=m1.mul(m2);
    return dst;
}
void main()
{
    Mat src = imread("hand.jpg",0);
    Mat meanMask;
    Mat varMask;
    Mat meanGlobal;
    Mat varGlobal;
    Mat dst;
    Mat tmp;
    Mat tmp2;
    int C = 30;
    int D = 133;
    //全局均值和均方差
    blur(src.clone(),meanGlobal,src.size());
    varGlobal = src - meanGlobal;
    varGlobal = EWM(varGlobal,varGlobal);
    blur(src.clone(),meanMask,Size(50,50));//meanMask为局部均值
    tmp = src - meanMask;                        
    varMask = EWM(tmp,tmp);              
    blur(varMask,varMask,Size(50,50));    //varMask为局部方差
    
    dst = meanMask + C*tmp;
    imshow("src",src);
    imshow("dst",dst);
     
    waitKey();
}

接下来,为了实现那么需要计算局部标准差和全局均值或方差

前面已经计算出了局部均值,那么

tmp = src - meanMask;  
    varMask = EWM(tmp,tmp);         
    blur(varMask,varMask,Size(50,50));    //varMask为局部方差

计算出局部方差

//换算成局部标准差
    varMask.convertTo(varMask,CV_32F);
    for (int i=0;i<varMask.rows;i++){
        for (int j=0;j<varMask.cols;j++){
            varMask.at<float>(i,j) =  (float)sqrt(varMask.at<float>(i,j));
        }
    }

换算成局部标准差

meanStdDev(src,meanGlobal,varGlobal); //meanGlobal为全局均值 varGlobal为全局标准差

是opencv提供的全局均值和标准差计算函数。

全部代码进行重构后如下

//ace 自适应对比度均衡研究
//by  jsxyhelu
//感谢 imageshop
#include "stdafx.h"
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace std;
using namespace cv;
//点乘法 elementWiseMultiplication
cv::Mat EWM(cv::Mat m1,cv::Mat m2){
    Mat dst=m1.mul(m2);
    return dst;
}
//图像局部对比度增强算法
cv::Mat ACE(cv::Mat src,int C = 4,int n=20,int MaxCG = 5){
    Mat meanMask;
    Mat varMask;
    Mat meanGlobal;
    Mat varGlobal;
    Mat dst;
    Mat tmp;
    Mat tmp2;
    blur(src.clone(),meanMask,Size(50,50));//meanMask为局部均值 
    tmp = src - meanMask;  
    varMask = EWM(tmp,tmp);         
    blur(varMask,varMask,Size(50,50));    //varMask为局部方差   
    //换算成局部标准差
    varMask.convertTo(varMask,CV_32F);
    for (int i=0;i<varMask.rows;i++){
        for (int j=0;j<varMask.cols;j++){
            varMask.at<float>(i,j) =  (float)sqrt(varMask.at<float>(i,j));
        }
    }
    meanStdDev(src,meanGlobal,varGlobal); //meanGlobal为全局均值 varGlobal为全局标准差
    tmp2 = varGlobal/varMask;
    for (int i=0;i<tmp2.rows;i++){
        for (int j=0;j<tmp2.cols;j++){
            if (tmp2.at<float>(i,j)>MaxCG){
                tmp2.at<float>(i,j) = MaxCG;
            }
        }
    }
    tmp2.convertTo(tmp2,CV_8U);
    tmp2 = EWM(tmp2,tmp);
    dst = meanMask + tmp2;
    imshow("D方法",dst);
    dst = meanMask + C*tmp;
    imshow("C方法",dst);
    return dst;
}
void main()
{
    Mat src = imread("plant.bmp",0); 
    imshow("src",src);
    ACE(src);
    waitKey();
}

三、小结

从结果上来看,ACE算法对于特定情况下的图片细节增强是显著的,但是并不是适用于所有的情况,并且其参数需要手工进行调整。了解它的特性,就能够解决一系列的问题,有效地增强现实。

来自为知笔记(Wiz)

时间: 2024-10-14 23:01:26

[blogs 算法原理 ]局部标准差实现对比度增强的相关文章

用于图像去雾的优化对比度增强算法

图像去雾哪家强?之前我们已经讨论过了著名的基于暗通道先验的图像去雾(Kaiming He, 2009)算法,如果你用兴趣可以参考: 暗通道优先的图像去雾算法(上) 暗通道优先的图像去雾算法(下) 此外,网上也有很多同道推荐了一篇由韩国学者所发表的研究论文<Optimized contrast enhancement for real-time image and video dehazing>(你也可以从文末参考文献[1]给出的链接中下载到这篇经典论文),其中原作者就提出了一个效果相当不错的图

优化的对比度增强算法用于有雾图像的清晰化处理(算法效果是我目前看到最为稳定的,且对天空具有天然的免疫力,极力推荐有需要的朋友研究)。

在未谈及具体的算法流程前,先贴几幅用该算法处理的效果. 不知道各位对这个算法的效果第一印象如何. 这个算法的原理来自于文章<Optimized contrast enhancement for real-time image and video dehazing>,作者是韩国人. 这个算法也是基于大气散射模型: 和现在一些常见的去雾文章有明显的不同的是,这篇文章的并不是基于暗通道原理的,也不是把重点强调在透射率图的细化上,而是提出了一种新的得到粗透射率图的方法.并且文章分别讲到了静态图像和视频

Canny边缘检测算法原理及其VC实现详解(一)

转自:http://blog.csdn.net/likezhaobin/article/details/6892176 图象的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般可以看作是一个阶跃,既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值.图象的边缘部分集中了图象的大部分信息,图象边缘的确定与提取对于整个图象场景的识别与理解是非常重要的,同时也是图象分割所依赖的重要特征,边缘检测主要是图象的灰度变化的度量.检测和定位,自从1959提出边缘检测以来,经过五十多年

OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 2013-03-23 17:44 16963人阅读 评论(28) 收藏 举报 分类: 机器视觉(34) 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] KAZE系列笔记: OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 OpenCV学习笔记(28)KA

避免图像去雾算法中让天空部分出现过增强的一种简易方法。

在经典的几种去雾算法中,包括何凯明的暗通道去雾.Tarel的基于中值滤波的去雾以及一些基于其他边缘保留的方法中,都有一个普遍存在的问题:即对天空部分处理的不好,天空往往会出现较大的面积的纹理及分块现象.究其主要原因,还是因为天空部位基本上是不符合暗通道去雾先验这个前决条件的.目前,针对这一问题,我搜索到的主要有以下几篇文章进行了处理: 1. 改进的基于暗原色先验的图像去雾算法 作者: 蒋建国\侯天峰\齐美彬   合肥工业大学 2011. 2.Single image dehazing Algor

SIFT算法原理(2)-极值点的精确定位

在SIFT解析(一)建立高斯金字塔中,我们得到了高斯差分金字塔: 检测DOG尺度空间极值点 SIFT关键点是由DOG空间的局部极值点组成的.以中心点进行3X3X3的相邻点比较,检测其是否是图像域和尺度域的相邻点的极大值或极小值. (1)为了确保不是噪声我们先进型阈值二值化: n和S一样,你想提取多少个图片的特征:(n)S表示每组提取多少层 (2)在差分金字塔中找极值点 特征点是由DOG空间的局部极值点组成的.为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺

Adaboost算法原理分析和实例+代码(简明易懂)

Adaboost算法原理分析和实例+代码(简明易懂) [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333     本人最初了解AdaBoost算法着实是花了几天时间,才明白他的基本原理.也许是自己能力有限吧,很多资料也是看得懵懵懂懂.网上找了一下关于Adaboost算法原理分析,大都是你复制我,我摘抄你,反正我也搞不清谁是原创.有些资料给出的Adaboost实例,要么是没有代码,要么省略很多步骤,让初学者

由Photoshop高反差保留算法原理联想到的一些图像增强算法。

原地址:http://blog.csdn.net/laviewpbt/article/details/20577683 关于高反差保留的用处说明呢,从百度里复制了一段文字,我觉得写得蛮好的: 高反差保留就是保留图像的高反差部分,再说得真白些,就是保留图像上像素与周围反差比较大的部分,其它的部分都变为灰色.拿一个人物照片来举例,反差比较大的部分有人的眼睛,嘴,以及身体轮廓.如果执行了就反差保留,这些信息将留下来(与灰色形成鲜明对比).它的主要作用就是加强图像中高反差部分.还以人物照片为例子,一般为

opencv----彩色图像对比度增强

图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法. 直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法. 直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大”前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现; 直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强. 1.直方图拉伸 就是扩大将图像灰度的域值的一个过程,但是经常是基于灰度图像进行处理,以前在MATlab上对比度增强调用直方图函数就几