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

学习DIP第39天

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

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

开篇废话

开篇废话,本文应该是图像增强部分的最后一篇,直方图匹配(规定化)通俗一点说,就是人为规定输出图像的直方图,根据上文的说的均衡化的推倒过程,其中我们设定输出直方图为1/(L-1)其实这就是规定化的,只是规定为一个常数,如果想要实现输出图像要根据输入的直方图产生,我们就需要使用直方图规定化,或直方图均衡,但如果直方图使用恒定,比如我们不想用常数,而是想用高斯,可以直接根据上文改一个高斯出来,这就省去了每次调用时都要人工产生直方图,更官方一点的话就是直方图匹配是直方图均衡的一般化,直方图均衡是直方图规定化的特例(当规定直方图为常数,例如都是1)。

数学原理

看一下原理,直方图匹配使用了直方图均衡做中间环节,将原图直方图和目标直方图进行均衡,然后互射,从原始图像直接映射到目标直方图均衡的结果,然后根据目标直方图均衡的逆映射,得到目标灰度值,示意图如下:

上面的示意图完整的表示了整个算法过程:

  1. 计算原图的直方图Hr,输入目标直方图Hs
  2. 均衡Hr,Hs得到映射G(r)和Z(s)
  3. 得到最终映射为Z^-1(G(r))

对于原图灰度r计算T为最终要得到的映射关系:

我们输入(规定)一个随机变量,具有如下性质:

根据上面两个式子,我们有:

那么就必须有:

这就是上面的算法过程的数学过程。

需要说明的是,实际操作因为离散的原因G(z)有可能不是满射的,也就是说G^-1可能会出现对应空值的情况,比如原始灰度a->均衡后灰度b->逆映射到目标是为空。为了防止这种情况产生大量0灰度结果,我们可以使用填充技术,如果逆映射为空,就用附近的灰度结果来填充。

代码

/********************************************************************************************
 直方图基本操作
 *******************************************************************************************/
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 HistogramSpecification(double *src,double *dst,int* hist,int width,int height){
    int src_hist[GRAY_LEVEL];
    setHistogram(src, src_hist, width, height);
    double srcMap[GRAY_LEVEL];
    double histMap[GRAY_LEVEL];
    InitMappingTable(srcMap,GRAY_LEVEL,TABLE_DOUBLE);
    EqualizationHist(src_hist, srcMap);
    EqualizationHist(hist, histMap);
    int histMap_[GRAY_LEVEL];
    InitHistogram(histMap_);
    for(int i=0;i<GRAY_LEVEL;i++)
        histMap_[(int)histMap[i]]=i;
    double dstMap[GRAY_LEVEL];
    for(int i=0;i<GRAY_LEVEL;i++){
        dstMap[i]=histMap_[(int)srcMap[i]];
    }

    fillMaptable(dstMap);
    for(int i=0;i<width;i++)
        for(int j=0;j<height;j++)
            dst[j*width+i]=dstMap[(int)src[j*width+i]];
}

结果对比

原图:

原图直方图:

直方图匹配1:

目标直方图:

实际操作结果直方图:

直方图匹配2:

目标直方图:

实际操作结果直方图:

直方图匹配3:

目标直方图:

实际操作结果直方图:

直方图匹配4:

目标直方图:

实际操作结果直方图:

总结

直翻图匹配交直方图均衡使用更灵活,更能控制输出的灰度特性,主要优点就是更加自由可以自己设计目标,所以应用范围交直方图均衡更加广泛,当目标直方图设计为常数是,直方图匹配就是直方图均衡。

待续。。。

时间: 2024-11-16 00:04:30

灰度图像--图像增强 直方图匹配(规定化)Histogram Specification的相关文章

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

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

《OpenCV:直方图应用:直方图均衡化,直方图匹配,对比直方图》

直方图均衡化 直方图均衡化(Histogram Equalization)是直方图最典型的应用,是图像点运算的一种.对于一幅输入图像,通过运算产生一幅输出图像,点运算是指输出图像的每个像素点的灰度值由输入像素点决定,即: 直方图均衡化是通过灰度变换将一幅图像转换为另一幅具有均衡直方图,即在每个灰度级上都具有相同的象素点数过程.从分布图上的理解就是希望原始图像中y轴的值在新的分布中尽可能的展开.变换过程是利用累积分布函数对原始分布进行映射,生成新的均匀拉伸的分布.因此对应每个点的操作是寻找原始分布

【zz】matlab 直方图匹配

原文地址:http://www.cnblogs.com/tiandsp/archive/2012/12/19/2825418.html 直方图匹配或叫做直方图规定化都可以,是把原图像的直方图按照给定的直方图加以映射,使新图像的直方图的分布类似于给定的函数. 总共有以下几步: 1.求给定的函数的累积直方图s. 2.求原图像的累积直方图G. 3.求s中每一个值在G中距离最小的位置index. 4.求原图像每个像素通过index映射到的新像素的值. 代码如下: clear all; close all

直方图匹配方法

http://blog.csdn.net/cxf7394373/article/details/6955530 1. 直方图匹配方法 对比直方图相似性的方法有四种: (1)  相关度 (2)  卡方系数 (3)  相交系数 (4)  巴氏距离 在快速但是不怎么准确匹配的情况下,Intersection方法的效果好, 而在慢速但较精确的情况下,用卡方或者巴氏距离效果好. 如果用颜色直方图匹配的方法进行图像匹配,在这种情况下:不同的图片直方图分部也是一致的,采用直方图匹配的方法则没有效果.对于直方图

matlab实现将彩色图像(R,G,B)色分量的直方图匹配,并计算其相关性

函数 实现将彩色图像转化为直方图分量向量 calcrgb2hist.m 文件 function hist  = calcrgb2hist(picname) pic1 = imread(picname); pic1R = pic1(:,:,1); pic1G = pic1(:,:,2); pic1B = pic1(:,:,3); figure,imshow(pic1R)                  title('R分量的图像') % 二,绘制直方图 [m,n]=size(pic1R);  

基于OpenCV和C++底层实现的直方图匹配

直方图匹配算法,又称直方图规定化.简单说,就是根据某函数.或者另外一张图片的引导,使得原图改变. 感觉解释的最好的是:http://www.360doc.com/content/13/1106/16/10724725_327179043.shtml 完整代码:github (里面同时包含OSTU / 大津算法.直方图均衡化等算法,还包括两种测试图片). 因为我个人兴趣爱好(放P就是老师逼的...),不允许使用 OpenCV 封装好的直方图函数.根据实例讲解,了解了直方图匹配算法底层的操作(多说一

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

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

彩色图像--图像增强 直方图增强

学习DIP第70天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro 开篇废话 继续简单的介绍一下彩色图像处理相关的知识,今天来简单的说下直方图增强在彩色图像中的应用,灰度图像直方图增强在此处做了相关介绍,包括其数学原理. 对于灰度图像中的一些算法适合直接用到彩色图像的各个通道,也有一些不适合,直方图均衡就属于不适合的

灰度图像--图像增强 中值滤波

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