灰度图像--图像增强 直方图均衡化(Histogram equalization)

学习DIP第38天

转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意。有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!!

文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro

开篇废话

废话开始,图像处理这些代码已经有三千多行了,不多,但是感觉多加练习以后对算法理解和写代码的能力上都有很大提高,毕竟对于算法来说想明白了一定要用一下才会真正掌握,但不能靠记忆去记住一个算法,这就需要我们懒人的天性,不愿意记住完整的公式,更愿意记住一个简单的起始,通过自己的理解和数学推导算法,这是个很不错的 方法,而写代码属于一种技术工作,熟能生巧,要多加练习,并且也要思考其中的技术细节,总之,做一切事情思考下还是不错的。

废话完成,说说直方图均衡,在冈萨雷斯的书里面直方图均衡化在第三章提出,因为之前想按照书上目录上的顺序来写着一些列的博客,后来发现还是自己总结下的学习思路,按照自己理解的知识网络来走,所以刚要写直方图均衡的时候就是转向自己的节奏开始按照二值图像,灰度图像,彩色图像的知识结构介绍。

直方图均衡的目的和前面灰度变换一样,为了增强对比度,使图像的灰度分布在整个灰度范围内更加均衡,其中直方图需要来解释下,直方图是个统计概念,比如我们有十种颜色的球,每种颜色的球有不同的数量,假设颜色分布为a0~a9,数量为n(x)(x取值为a0~a9)那么直方图就是以a0~a9为横坐标,n为纵坐标的统计直方图:

如果将上图中的数据归一化(每个分量除以球数总和),也就是使得各分量总和为1,各个分量就表示这种颜色的球出现的频率,就得到频率直方图。

如果将各种颜色换成各灰度值,球的个数等效的换成具有该灰度的像素数量,或者换成该灰度出现的频率,就成了图像的直方图,对于彩色图像和灰度图像,直方图具有重要的统计意义,而对于二值图像来说,该意义不大,因为二值图像就两个灰度,所以其只能反映黑白面积比例。

直方图均衡的目的是为了使灰度分布的更广泛,从而来拉伸对比度:

事实表明当灰度的直方图范围从上面的左边变换成右边后,图像对比度得到提升,也就达到了我们增强图像的目的--更便于观察,更容易区分不同灰度间细节。

数学原理

直方图变换的最终操作和前面提到的灰度操作是一样的,即:

这是一种从灰度到灰度的映射,并且该映射与前面伽马变换对数变换的映射不同的是,它不具有确定的表达公式,而是根据原始图像的灰度分布不同而“自适应”的产生映射,并且必须具有以下两个性质:

  1. 该函数必须单调递增(因为要从s反射回r所以该函数必须是严格的单调递增,即r和s为一对一的关系)
  2. 0<=r<=L-1时,必须满足0<=s<=L-1

这是两点约束,即我们找到的T必须使得上面成立,而且还要达到均衡直方图的目的。即完成下面的转化:

上面的是直方图的原始分布和目标分布,下面是响应的T。

推导过程:

先提出一个概率密度函数pdf的概念,就是每个灰度值对应出现的概率,用p表示,pr(r)表示原始灰度r出现的概率,其计算是用灰度值为r的像素总个数除以图像的像素总个数。同理变换后的ps(s)表示变换后灰度为s的像素的概率。

  1. r到s是一对一的映射,所以若r0映射到s0那么pr(r0)=ps(s0)这个式子是因为像素个数不会改变,只是对应的灰度值改变了,这个就是我们接下来要用到的最基本的原理。
  2. 我们的目标灰度分布是均匀分布,也就是上图右上的概率分布图,因为绿色部分面积必然为1,所以,ps的目标分布为:                                          

根据上述的基本原理和假设存在:

根据积分定理,w为积分假变量,那么:

所以:

将上面离散化:

上面为大概的公式推导,如有不严谨之处还请指出。

所以我们将按照上面得出的结论进行编程:

代码

/********************************************************************************************
 直方图基本操作
 *******************************************************************************************/
void InitMappingTable(void * arry,int size,int Data_type){
    if(Data_type==TABLE_INT)
        for(int i=0;i<size;i++)
            ((int*)arry)[i]=0;
    else if(Data_type==TABLE_CHAR)
        for(int i=0;i<size;i++)
            ((char*)arry)[i]=0;
    else if(Data_type==TABLE_DOUBLE)
        for(int i=0;i<size;i++)
            ((double*)arry)[i]=0;

}
void InitHistogram(int *hist){
    for(int i=0;i<GRAY_LEVEL;i++)
        hist[i]=0;
}

void setHistogram(double *src,int *hist,int width,int height){
    InitHistogram(hist);
    for(int j=0;j<height;j++)
        for(int i=0;i<width;i++){
            int tempv=src[j*width+i];
            hist[tempv]++;
        }
}
int findHistogramMax(int *hist){
    for(int i=GRAY_LEVEL-1;i>=0;i--){
        if(hist[i]!=0)
            return i;
    }
    return -1;

}
int findHistogramMin(int *hist){
    for(int i=0;i<GRAY_LEVEL;i++){
        if(hist[i]!=0)
            return i;
    }
    return -1;
}
void fillMaptable(double * map){

    for(int i=1;i<GRAY_LEVEL;i++){
        if(map[i]==0)
            map[i]=map[i-1];

    }

}
/********************************************************************************************
 直方图均衡
 *******************************************************************************************/
//均衡直方图,将原图直方图,经过公式得到目标直方图
void EqualizationHist(int *src_hist,double *dst_map){
    int temphist[GRAY_LEVEL];
    InitHistogram(temphist);
    int max=findHistogramMax(src_hist);
    int min=findHistogramMin(src_hist);
    temphist[min]=src_hist[min];
    for(int i=min+1;i<=max;i++)
        temphist[i]=temphist[i-1]+src_hist[i];
    for(int i=min;i<=max;i++)
        temphist[i]-=temphist[min];
    int total=temphist[max];
    for(int i=min;i<=max;i++){
        dst_map[i]=((double)GRAY_LEVEL-1.0)*temphist[i]/total;
    }

}
//直方图均很,用输入图像得到输出图像
void HistogramEqualization(double *src,double *dst,int width,int height){
    int hist[GRAY_LEVEL];
    setHistogram(src, hist, width, height);
    double GrayMappingTable[GRAY_LEVEL];
    InitMappingTable(GrayMappingTable,GRAY_LEVEL,TABLE_DOUBLE);
    EqualizationHist(hist, GrayMappingTable);
    for(int i=0;i<width;i++)
        for(int j=0;j<height;j++)
            dst[j*width+i]=GrayMappingTable[(int)src[j*width+i]];

}

结果

原图:

原图直方图:

直方图均衡后图片:

直方图均衡后直方图:

总结

上面给出的结果为经典结果,很多文章都使用的这幅图片,值得解释的是,虽然我们从r到s的映射是一对一的,但r和s是离散的整数,如果s被映射到非整数,将就近取整,所以有些灰度值会被合并。

直方图运算速度快,效果好,应用范围很广,故总结如上。

待续。。。

时间: 2024-11-10 15:03:37

灰度图像--图像增强 直方图均衡化(Histogram equalization)的相关文章

数学之路-python计算实战(14)-机器视觉-图像增强(直方图均衡化)

我们来看一个灰度图像,让表示灰度出现的次数,这样图像中灰度为 的像素的出现概率是  是图像中全部的灰度数, 是图像中全部的像素数,  实际上是图像的直方图,归一化到 . 把  作为相应于  的累计概率函数, 定义为:  是图像的累计归一化直方图. 我们创建一个形式为  的变化,对于原始图像中的每一个值它就产生一个 ,这样  的累计概率函数就能够在全部值范围内进行线性化,转换公式定义为: 注意 T 将不同的等级映射到  域.为了将这些值映射回它们最初的域,须要在结果上应用以下的简单变换: 上面描写

灰度图像--图像增强 直方图匹配(规定化)Histogram Specification

学习DIP第39天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意.有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!! 文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro

图像直方图与直方图均衡化

图像直方图与直方图均衡化 图像直方图以及灰度与彩色图像的直方图均衡化 图像直方图: 概述: 图像的直方图用来表征该图像像素值的分布情况.用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目. 图像直方图图形化显示不同的像素值在不同的强度值上的出现频率,对于灰度图像来说强度范围为[0~255]之间,对于RGB的彩色图像可以独立显示三种颜色的图像直方图. 同时直方图是用来寻找灰度图像二值化阈值常用而且是有效的手段之一,如果一幅灰度图像的直方图显示为两个波

数字图像处理-----直方图均衡化

直方图均衡化(Histogram Equalization) 又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等.这样,原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较平的分段直方图:如果输出数据分段值较小的话,会产生粗略分类的视觉效果. 直方图是表示数字图像中每一灰度出现频率的统计关系.直方图能给出图像灰度范围.每个灰度的频度和灰度的分布.整幅图像的平均明暗和对比度等概貌性描述.灰度直方图是灰度级

直方图均衡化原理与实现

直方图均衡化(Histogram Equalization) 又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等.这样,原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较平的分段直方图:如果输出数据分段值较小的话,会产生粗略分类的视觉效果. 直方图是表示数字图像中每一灰度出现频率的统计关系.直方图能给出图像灰度范围.每个灰度的频度和灰度的分布.整幅图像的平均明暗和对比度等概貌性描述.灰度直方图是灰度级

【数字图像处理】灰度直方图、直方图均衡化、直方图规定化

灰度直方图 一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征.图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少.图像的灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数:其中,横坐标是灰度级,纵坐标是该灰度级出现的频率. 灰度直方图的计算公式如下: p(rk)=nk/MN 其中,rkrk是像素的灰度级,nknk是具有灰度rkrk的像素的个数,MNMN是图像中总的像素个数. 直方图均衡化 Histogram Equal

【OpenCV】图像增强---灰度变换、直方图均衡化

图像增强的目的:改善图像的视觉效果或使图像更适合于人或机器的分析处理.通过图像增强,可以减少图像噪声,提高目标与背景的对比度,也可以增强或抑制图像中的某些细节.  --------------------------------------------------------------------------------------------------- 灰度变换:把原图像的像素灰度经过某个函数变换成新图像的灰度.可分为直线灰度变换法和直方图修正法. 直线灰度变换法:线性.分段线性.非线性

图像增强之(一)---直方图均衡化

直方图均衡化又称为灰度均衡化,是指通过某种灰度映射使输入图像转换为在每一灰度级上有近似相同的像素点的输出图像.在经过均衡化处理后的图像中,像素将尽可能占尽可能多的灰度级并且均匀分布. 对于一般的灰度图片来说,灰度级变化范围为0-255.为了计算方便,将灰度范围变为0-1,且连续,连续这个地方一定要注意,这意味着讨论某一个特定灰度级的出现概率是没意义的,这个过程称之为直方图归一化. 归一化前的直方图:对应像素的出现次数 归一化后: 这样经过归一化就能得到对应像素的出现频率: 50 : 3/6 =

OpenCV——直方图均衡化(用于图像增强)

1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 #include <math.h> 4 5 using namespace cv; 6 using namespace std; 7 8 9 int main(int argc, char** argv) 10 { 11 Mat src,src_gray,dst; 12 //src = imread("3 input.bmp"); 13 s