精华内容
参与话题
问答
  • 图像直方图均衡(图像处理)

    千次阅读 2018-05-18 11:23:52
    转自:https://mp.weixin.qq.com/s/Lx6nGILofQN9e5KuWgh7mw 图像直方图均衡(图像处理) ...

    转自:https://mp.weixin.qq.com/s/Lx6nGILofQN9e5KuWgh7mw


    图像直方图均衡(图像处理)

    Original 听我讲技术数媒 2018-04-12

    作者 BarackBao

    直方图均衡

    直方图均衡是一种经典的图像增强方法,是灰度变换的一个重要应用,主要作用于提高图像的对比度,或者说是提高图像的动态范围,一幅对比度很低的图像的直方图范围很窄,而且灰度级变换很大,直方图均衡就是使图像经过一些特殊的变换使图像灰度级的概率分布趋近于均匀分布,最直观的表现就是经过处理后的图像直方图的灰度级范围变广,而且频率接近相等,理想情况是图像灰度级的分布是连续的,最终处理后的图像中的灰度的PDF(概率密度函数)是均匀的。    
    简而言之,直方图均衡是通过拉伸像素强度分布范围来增强图像对比度的一种方法。

    图像直方图

    灰度级范围为[0,L-1]的数字图像的直方图是一个离散函数h(rk) = nk,其中rk代表某个灰度级,nk为图像中灰度值为rk的像素个数。

    直方图通常有两种形式,其中一种横轴是灰度级rk,纵轴数值就是nk。

    另一种是前者的归一化处理,首先计算得到该图像的总像素数,设M和N为图像的行和列的维数,所以可以计算每个灰度值在一幅图像中的概率P(rk)=rk/M*N,其中k=0,1,2..L-1,归一化直方图的所有分量之和应该等于一。


    核心

    理解直方图均衡首先就要把一幅图像看作是一个样本空间,然后将灰度级看成在这个样本空间中的一个随机变量,这样我们就能使用概率方法来研究问题了。

    我们首先来设一个方程s=T(r),其中r为待处理图像的灰度,取值范围为[0,L-1],s就是对应的处理后的灰度值,也就是说我们通过这个T变换,就可以将原图像中每个灰度值是r的像素改成s。

    还需要满足两个条件:

    • T(r)在区间0 ≤ r ≤ L-1上为单调递增函数。

    • 0 ≤ r ≤ L-1时,0 ≤ T(r) ≤ L-1

    概率推导

    我们设灰度级是区间[0,L-1]内的一个随机变量,我们先考虑连续的情况,在概率论中研究连续型随机变量离不开其概率密度函数(PDF),令Pr(r)和Ps(s)分别表示随机变量r和s的概率密度函数。

    这里我们提出这个变换公式:

    s = T(r) = (L-1) * ∫ Pr(w)dw  
    

    其中w是积分的假变量,等号右部分有随机变量r的概率分布函数(CDF),我们来考察一下这个变换公式是否符合上一节提出的两个条件:

    • 概率密度函数总为正,Pr的积分的几何意义就是该函数下方的面积,随着r向右增大,面积肯定增大,所以满足第一个条件      

    • 右边积分最大上限是r = L-1,下限是0,所以积分最大为1(曲线下总面积为1),s的最大值是L-1,满足第二个条件

    为了分析该变换的效果,我们就要把变换前后灰度值的概率分布函数分别求出来,其实就是Pr(r)和Ps(s),其中变换前的分布函数Pr(r)是已知的,根据一个基本概率定理我们可以得到下面的结果(如果没看明白,请看概率统计课本28页复习下):

    Ps(s) = Pr(r) * |dr / ds|         
    ds / dr = T'(r) = (L-1) * Pr(r)    
    由上两式得:   
    Ps(s) = Pr(r) * |1 / (L-1)*Pr(r)| = 1 / L-1    
    
     
    

    很明显,Ps(s)是均匀分布的。  
    需要指明的一点的,经过这种变换之后的Ps(s)始终是均匀的,它与Pr(r)的形式无关  

    具体实现

    实际中的图像的灰度值大多都是离散值,对于离散值,我们处理其概率(直方图值)与求和来代替处理概率密度函数和积分。

    所以上面分析过的变换函数T的离散版本就是:


    其中MN是图像中像素总数,L是图像中可能的灰度级的数量,nk是灰度为rk的像素个数。

    光看公式可能不好理解,下面简单举一个书上的例子:

    我们假设一幅图像大小是64x64像素(MN = 4096),灰度级深度为8(L = 8),图像灰度值取值范围为[0,7],下面是灰度分布表:

    应用上面的离散型公式计算处理后的像素值:

    s计算结果最终结果(四舍五入)
    s07Pr(r0)1.331
    s17Pr(r0)+7Pr(r1)3.083
    s27Pr(r0)+7Pr(r1)+7Pr(r2)4.555
    s35.676
    s46.236
    s56.657
    s66.867
    s77.007

    可以看到最终结果只有5个不同的灰度级,有很多不同的灰度值被转换成对应一个灰度值,图像灰度值深度从8变为了5。

    为了保证最终的结果图像中像素值仍为整数,所以这里对每一步求和结果进行了四舍五入。

    看完上面这个具体的计算过程,我们就可以编码实现了,这里我使用C++,并使用了Opencv的一些辅助函数。

    #include <opencv2/opencv.hpp>
    
    using namespace cv;
    
    /*
    直方图均衡
    */
    Mat HistogramBalance(Mat& src)
    {
        Mat des(src);//为节省空间,只复制矩阵头
        int gray_freq[256] = { 0 };//统计每个灰度级出现的次数
        float gray_prob[256] = { 0 };//每个灰度级在图像中的概率
        float gray_cdf_prob[256] = { 0 };//每个灰度级经过直方图均衡变换T后的积累分布概率之和    
        int gray_des_lut[256] = { 0 };//直方图均衡后的灰度查找表
        int total_pixels = src.rows * src.cols;
        //首先统计每个灰度级在图像中出现的次数
        for (int i = 0; i < src.rows; i++)
        {
            uchar* p = src.ptr<uchar>(i); //获取到行像素指针
            for (int j = 0; j < src.cols; j++)
            {
                int pixel = p[j];
                gray_freq[pixel]++;
            }
        }
    
        //计算灰度级在图像中出现的概率
        for (int i = 0; i < 256; i++)
            gray_prob[i] = ((float)gray_freq[i] / total_pixels); //每个灰度级占像素总数的比例
    
    
        //计算每个灰度级经直方图均衡变换后的累计分布概率之和
        gray_cdf_prob[0] = gray_prob[0];//灰度值为0为第一个值,概率和等于它本身
        for (int i = 1; i < 256; i++)
            gray_cdf_prob[i] = gray_cdf_prob[i - 1] + gray_prob[i];
    
        //构建直方图均衡后的灰度级查找表,公式s = T(r) = (L-1)ΣP(rj)   
        //最终灰度值四舍五入
        for (int i = 0; i < 256; i++)
            gray_des_lut[i] = (256 - 1) * gray_cdf_prob[i] + 0.5;
    
        //构建变换后的图像Mat
        for (int i = 0; i < des.rows; i++)
        {
            uchar *p = des.ptr<uchar>(i);
            for (int j = 0; j < des.cols; j++)
            {
                p[j] = gray_des_lut[p[j]]; //从查找表中读取变换后的灰度值
            }
        }
    
        return des;
    }
    
    int main(int argc, char* argv[])
    {
        Mat src = imread("C://Users//鲍骞月//Desktop//testImag//Histogramtestsrc1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
        namedWindow("灰度图原图像", WINDOW_AUTOSIZE);
        imshow("灰度图原图像", src);
        Mat des = HistogramBalance(src);
        imshow("灰度图直方图均衡", des);
        Mat src_color = imread("C://Users//鲍骞月//Desktop//testImag//Histogramtestsrc1.jpg", CV_LOAD_IMAGE_COLOR);
        imshow("彩图原图像", src_color);
        Mat imgBlueChannel, imgGreenChannel, imgRedChannel, des_color; //三通道Mat
        std::vector<Mat> channels;//三通道灰度值
        split(src_color, channels);
        imgBlueChannel = channels.at(0);
        imgGreenChannel = channels.at(1);
        imgRedChannel = channels.at(2);
        //分通道进行直方图均衡处理
        imgBlueChannel = HistogramBalance(imgBlueChannel);
        imgGreenChannel = HistogramBalance(imgGreenChannel);
        imgRedChannel = HistogramBalance(imgRedChannel);
        channels.clear();
        channels.push_back(imgBlueChannel);
        channels.push_back(imgGreenChannel);
        channels.push_back(imgRedChannel);
        //合并处理后的三个通道
        merge(channels, des_color);
        imshow("彩图直方图均衡", des_color);
        waitKey(0);
        return 0;
    }
    

    这里我分别实现了灰度图像和彩色图像的直方图均衡,彩色图像的实现是直接将图像三通道分开进行均衡,然后再将三个通道合并显示(不知道这样做有没有错…)。

    • 运行结果:    


    均衡后的图像灰度级跨越了更宽的灰度级范围,并且近似分布均匀,最直观的感受就是对比度的增强。

    使用API

    Opencv内部封装好了直方图均衡的api,函数声明是:

    CV_EXPORTS_W void equalizeHist( InputArray src, OutputArray dst );
    
    • 第一个参数是输入图像,要求是8位单通道图像。      

    • 第二个参数是输出图像,要求和原图像有一样的尺寸和类型。  

    int main()
    {
        //加载图像
        Mat srcImage, dstImage;
        srcImage = imread("C://Users//鲍骞月//Desktop//testImag//Histogramtestsrc1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
        imshow("原图像", srcImage);
        //直方图均衡
        equalizeHist(srcImage, dstImage);
        //显示结果
        imshow("直方图均衡", dstImage);
        waitKey(0);
        return 0;
    

    运行结果:

    展开全文
  • 直方图均衡 & MATLAB实现

    千次阅读 2019-06-02 11:30:21
    直方图均衡 直方图均衡化是一种利用灰度变换自动调节图像对比度质量的方法,通过灰度级的概率密度函数求出灰度变换函数,它是一种以累积分布函数变换法为基础的直方图修正法。 基本思想: 把原始图像的灰度分布直方...

    结合 Gonzalez 的《数字图像处理》第 3.3.1 节,在这里总结一下直方图均衡的原理、具体实现及代码。

    直方图均衡

    直方图均衡(Histogram Equalization)是一种利用灰度变换自动调节图像对比度的方法,通过灰度级的概率密度函数求出灰度变换函数,它是一种以累积分布函数变换法为基础的直方图修正法。

    基本思想: 把原始图像的灰度分布直方图变换为均匀分布的形式(有展开直方图的趋势),扩大像素灰度值的动态范围,从而增强图像对比度。

    用途: 在图像处理领域用于增强图像的对比度

    缺点: 直方图均衡对处理的数据不加以选择,它可能会增加背景噪声的对比度并且降低有用信息的对比度。
    另外,直方图处理不允许造成新的灰度级,所以在实际的直方图均衡应用中很少有完美平坦的直方图。
    还有,我们的图像灰度级通常是离散的,所以不能保证离散直方图均衡还可以得到均匀的直方图。

    1. 数学表示

    首先考虑灰度值连续的情况:

    • rr 表示待处理图像的灰度,取值区间假设为 [0,L1][0,L-1]
    • ss 表示处理后图像的灰度,取值区间仍然需要在 [0,L1][0,L-1]
    • s=T(r)s = T(r) 为灰度映射函数,对于输入图像的每一个具有灰度值 rr 的像素,经过变换输出一个灰度值 ss

    定义变换函数 T(r)T(r) 为:
    s=T(r)=(L1)0rpr(w)dw s = T(r) = (L-1)\int^r_0p_r(w){\rm d}w

    灰度值 rr 可以看作是区间 [0,L1][0,L-1] 内的随机变量,所以可以再记:

    • pr(r)p_r(r) 是随机变量 rr 的概率密度函数
    • ps(s)p_s(s) 是随机变量 ss 的概率密度函数

    那么从 pr(r)p_r(r)ps(s)p_s(s) 有一个变换:
    ps(s)=pr(r)drds p_s(s) = p_r(r)|\frac{dr}{ds}|
    从上式可以看出,输出灰度 ss 的概率密度函数是由输入灰度 rr 的概率密度函数和所用的变换函数 T(r)T(r) 共同决定的。

    经过简单计算:
    dsdr=dT(r)dr=(L1)ddr[0rpr(w)dw]=(L1)pr(r) \frac{ds}{dr} = \frac{dT(r)}{dr} = (L-1)\frac{d}{dr}[\int^r_0p_r(w){\rm d}w] = (L-1)p_r(r)
    可得:
    ps(s)=pr(r)drds=pr(r)dsdr1=pr(r)1(L1)pr(r)=1L1 p_s(s) = p_r(r)|\frac{dr}{ds}| = p_r(r)|\frac{ds}{dr}|^{-1} = p_r(r)\frac{1}{(L-1)p_r(r)} = \frac{1}{L-1}
    神奇的是,发现输出灰度值 ss 的概率密度竟然和输入灰度值 rr 没有关系,它是服从均匀分布的变量!

    再看灰度值离散的情况:

    一张灰度级范围为 [0,L1][0, L-1] 的数字图像中某一级灰度出现的次数是离散函数 h(rk)=nkh(r_k) = n_k,k = 0,1,…,L-1

    • rkr_k 是第 kk 级灰度值
    • nkn_k 是图像中灰度为 rkr_k 的像素个数

    归一化:p(rk)=nk/MNp(r_k) = n_k / MN,此时 p(rk)p(r_k) 是灰度级 rkr_k 在图像中出现的概率估计(直方图值),归一化的直方图所有分量之和等于 1

    • MNMN 表示图像的像素总数
    • MM 是图像的行数
    • NN 是图像的列数

    在离散问题里,直方图其实就是概率 pr(rk)p_r(r_k) 的图形。

    1. PMF 概率质量函数(Probability Mass Function):PMF 是离散随机变量在各特定点取值上的概率。

    【概率质量函数与概率密度函数 (PDF) 的不同之处在于前者是对离散型随机变量定义的,而后者是对连续型随机变量】

    一个离散的灰度图像 XXnkn_k 表示灰度 rk=ir_k = i 出现的次数,MNMN 表示图像中所有像素数,ii 表示某一个灰度值,则图像在灰度 rk=ir_k = i 上的概率质量函数为:
    PMFX(i)=nkMN,0i<L PMF_X(i)=\frac{n_k}{MN}, 0 \leq i < L
    其中,LL 为图像的灰度数,通常为 256。

    2. CDF 累积分布函数(Cumulative Distribution Function):又叫分布函数,是对概率密度函数(概率质量函数)的积分(求和),能完整描述一个实随机变量 X 的概率分布。
    CDFX(x)=P(Xx) CDF_X(x)=P(X \leq x)

    对一个离散的灰度图像 XX,对应 PMFXPMF_X 的累积分布函数为:
    CDFX(i)=j=0iPMFX(j) CDF_X(i) = \sum_{j=0}^{i}PMF_X(j)

    将连续情况的下的 T(r)T(r) 转换到离散情况下,得到变换函数 T(rk)T(r_k)
    sk=T(rk)=(L1)j=0kpr(rj)=(L1)MNj=0knjk=0,1,2,...,L1 s_k = T(r_k) = (L-1)\sum_{j=0}^{k}p_r(r_j) = \frac{(L-1)}{MN}\sum_{j=0}^{k}n_j,k = 0,1,2, ..., L-1
    变换(映射)T(rk)T(r_k) 称为直方图均衡

    2. 处理步骤

    1. 求出给定待处理图像的直方图 PMF

    2. 由 PMF 求出 (L - 1) CDF

    3. 将 (L - 1) CDF 映射为新的灰度值

    MATLAB实现

    MATLAB 实现直方图均衡化处理的工具是:J = histeq(I,n)

    • I 为输入的原图像
    • J 为直方图均衡化后的图像
    • n 为均衡化后的灰度级数,默认值为 64

    利用 MATLAB 工具包进行直方图处理:

    % 利用工具 histeq() 实现直方图均衡化
    
    close all;
    clear all;
    clc;
    
    % 读取原灰度图
    R = imread('lena_gray.jpg');
    % 直方图均衡化
    S = histeq(R);
    
    figure(1)
    subplot(121),imshow(uint8(R)),title('原灰度图');
    subplot(122),imshow(uint8(S)),title('均衡化后');
    
    figure(2)
    subplot(121),imhist(R,64),title('原图像直方图');
    subplot(122),imhist(S,64),title('均衡化后的直方图');
    

    在这里插入图片描述
    在这里插入图片描述
    自己实现一下直方图均衡代码:

    第一种:

    % 读取原图
    R = imread('lena_gray.jpg');
    [row, col] = size(R);
    
    % 显示原图和原图对应的直方图
    subplot(2,2,1), imshow(R), title('原灰度图');
    subplot(2,2,2), imhist(R), title('原灰度图的直方图');
    
    % 计算原图像素各灰度值的PMF
    PMF = zeros(1, 256);
    for i = 1:row
        for j = 1:col
            PMF(R(i,j) + 1) = PMF(R(i,j) + 1) + 1; % R(i,j)为像素的灰度值
        end
    end
    
    % 计算CDF
    CDF = zeros(1, 256);
    CDF(1) = PMF(1);
    for i = 2:256
        CDF(i) = CDF(i - 1) + PMF(i);
    end
    
    % 将CDF映射到新的灰度值
    for i = 1:256
        Map(i) = round((CDF(i) - 1) * 255 / (row * col));
    end
    for i = 1:row
        for j = 1:col
            R(i,j) = Map(R(i,j) + 1);
        end
    end
    
    subplot(2,2,3), imshow(R), title('直方图均衡');
    subplot(2,2,4), imhist(R), title('均衡后的直方图');
    

    第二种:(感觉更好理解一些)

    % 读取原图
    R = imread('lena_gray.jpg');
    [row, col] = size(R);
    
    % 显示原图和原图对应的直方图
    subplot(2,2,1), imshow(R), title('原灰度图');
    subplot(2,2,2), imhist(R), title('原灰度图的直方图');
    
    % 计算PMF,即统计各灰度值的像素数量
    PMF = zeros(1, 256); %注意MATLAB的数组索引从1开始
    for i = 1:row
        for j = 1:col
            PMF(R(i,j) + 1) = PMF(R(i,j) + 1) + 1; % R(i,j)为像素的灰度值
        end
    end
    PMF = PMF / (row * col);
    
    % 计算CDF
    CDF = zeros(1,256);
    CDF(1) = PMF(1);
    for i = 2:256
        CDF(i) = CDF(i - 1) + PMF(i);
    end
    
    % 计算均衡后的像素值
    Sk = zeros(1,256);
    for i = 1:256
        Sk(i) = CDF(i) * 255;
    end
    
    % 映射到新的像素值
    Sk = round(Sk);
    for i = 1:row
        for j = 1:col
            R(i,j) = Sk(R(i,j) + 1);
        end
    end
    
    % 绘制直方图均衡后的图像
    subplot(2,2,3), imshow(R), title('直方图均衡');
    subplot(2,2,4), imhist(R), title('均衡后的直方图');
    

    在这里插入图片描述

    展开全文
  • matlab实现直方图均衡

    万次阅读 多人点赞 2018-04-16 15:34:34
    直方图均衡化是一种利用灰度变换自动调节图像对比度质量的方法,基本思想是通过灰度级的概率密度函数求出灰度变换函数,它是一种以累计分布函数变换法为基础的直方图修正法。直方图均衡化处理的步骤如下:1. 求出...

    直方图均衡化是一种利用灰度变换自动调节图像对比度质量的方法,基本思想是通过灰度级的概率密度函数求出灰度变换函数,它是一种以累计分布函数变换法为基础的直方图修正法。

    直方图均衡化处理的步骤如下:

    1. 求出给定待处理图像的直方图

    2. 利用累计分布函数对原图像的统计直方图做变换,得到新的图像灰度。

    3. 进行近似处理,将新灰度代替旧灰度,同时将灰度值相等或相近的每个灰度直方图合并在一起

    MATLAB实现直方图均衡化处理的函数是:J=histeq(I,n):I为输入的原图像,J为直方图均衡化后得到的图像,n为均衡化后的灰度级数,默认值为64

    直方图均衡化操作是对图像直方图进行处理,使得处理后的直方图为平坦形状。函数histeq()不仅能够对灰度图像进行直方图均衡化,还可以对索引图像进行直方图均衡化。

    函数histeq()对图像进行直方图均衡化处理实例:

    close all;clear all;clc;
    %函数histeq()进行直方图均衡化处理
    I=imread('tire.tif');
    J=histeq(I);  %直方图均衡化
    figure,
    subplot(121),imshow(uint8(I));
    title('原图')
    subplot(122),imshow(uint8(J));
    title('均衡化后')
    figure,
    subplot(121),imhist(I,64);
    title('原图像直方图');
    subplot(122),imhist(J,64);
    title('均衡化后的直方图');


    ------坚持就是胜利------

    展开全文
  • 直方图均衡

    万次阅读 多人点赞 2019-03-26 20:24:54
    参考文献: Rafael C. Gonzalez, Richard E. Woods,Digital Image Processing (Third Edition) 胡学龙.... 左飞....目录 ...直方图均衡化的介绍 ...直方图均衡化的理论基础 ...手工实现直方图均衡化 ...直方图均衡...

    参考文献:

    1. Rafael C. Gonzalez, Richard E. Woods,Digital Image Processing (Third Edition)
    2. 胡学龙. 数字图像处理(第三版)
    3. 左飞. 图像处理中的数学修炼

    目录

    直方图均衡化的介绍

    直方图的概念

    直方图均衡化的理论基础

    手工实现直方图均衡化

    MATLAB上实现直方图均衡化

    直方图均衡化的缺点


    直方图均衡化的介绍

    直方图均衡化是一种简单有效的图像增强技术,通过改变图像的直方图来改变图像中各像素的灰度,主要用于增强动态范围偏小的图像的对比度。原始图像由于其灰度分布可能集中在较窄的区间,造成图像不够清晰。例如,过曝光图像的灰度级集中在高亮度范围内,而曝光不足将使图像灰度级集中在低亮度范围内。采用直方图均衡化,可以把原始图像的直方图变换为均匀分布(均衡)的形式,这样就增加了像素之间灰度值差别的动态范围,从而达到增强图像整体对比度的效果。换言之,直方图均衡化的基本原理是:对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行展宽,而对像素个数少的灰度值(即对画面不起主要作用的灰度值)进行归并,从而增大对比度,使图像清晰,达到增强的目的。举个例子,如图1所示,左图为原始图像,右图为直方图均衡化后的图像。

    图1 直方图均衡化前后效果对比

    直方图的概念

    对一幅灰度图像,其直方图反映了该图像中不同灰度级出现的统计情况。图2给出了一个直方图的示例,其中图(a)是一幅图像,其灰度直方图可表示为图(b),其中横轴表示图像的各灰度级,纵轴表示图像中各灰度级像素的个数。(需要注意,灰度直方图表示了在图像中各个单独灰度级的分布,而图像对比度则取决于相邻近像素之间灰度级的关系。)

    图 2 图像及其直方图

    在MATLAB中可以使用函数imhist()来计算灰度图像的直方图。我们计算一下图1中左图的灰度直方图,结果如图3所示。

    I = imread('pout.tif'); 
    figure; 
    subplot(121), imshow(I); 
    subplot(122), imhist(I); 
    axis([0, 256, 0, 4000]);
    图 3 灰度图像及其直方图

    严格地说,图像的灰度直方图是一个一维的离散函数,可写成:

                                                                         h(k)=n_{k}        k = 0, 1, ..., L-1                                                               (公式1)

    式中,n_{k}是图像f(x,y)中灰度级为k的像素的个数。直方图的每一列(称为bin)的高度对应n_{k}。直方图提供了原图中各种灰度值分布的情况,也可以说直方图给出了一幅图像所有灰度值的整体描述。直方图的均值和方差也是图像灰度的均值和方差。图像的视觉效果与其直方图有对应关系,或者说,直方图的形状和改变对图像有很大的影响。

    在直方图的基础上,进一步定义归一化的直方图为灰度级出现的相对频率P_{r}(k)。即:

                                                                                         P_{r}(k) = n_{k} / N                                                                             (公式2)

    式中,N表示图像f(x,y)的像素的总数,n_{k}是图像f(x,y)中灰度级为k的像素的个数。

    我们以图1中左图为例,计算其归一化的直方图,结果如图4所示。

    I = imread('pout.tif'); 
    N = numel(I);  % 求图像像素的总数
    Pr = imhist(I) / N; 
    k = 0 : 255; 
    figure; 
    subplot(121), imshow(I); 
    subplot(122), bar(k, Pr); 
    图 4 灰度图像及其归一化直方图

    直方图均衡化的理论基础

    为讨论方便起见,以 r 和 s 分别表示归一化了的原图像灰度和经直方图均衡化后的图像灰度(因为归一化了,所以 r 和 s 的取值在0到1之间)。当 r = s = 0时,表示黑色;当 r = s = 1时,表示白色;当 r, s ∈(0, 1)时,表示像素灰度在黑白之间变化。(所谓直方图均衡化,其实是根据直方图对像素点的灰度值进行变换,属于点操作范围。换言之,即:已知r,求其对应的s。)

    在 [0,1] 区间内的任何一个 r ,经变换函数 T(r) 都可以产生一个对应的 s ,且

                                                                                          s = T(r)                                                                                     (公式3)

    式中,T(r) 应当满足以下两个条件:

    1. 在 0 ≤ r ≤ 1 内,T(r) 为单调递增函数;(此条件保证了均衡化后图像的灰度级从黑到白的次序不变)
    2. 在 0 ≤ r ≤ 1 内有 0 ≤ T(r) ≤ 1。(此条件保证了均衡化后图像的像素灰度值在允许的范围内)

    公式3的逆变换关系为:

                                                                                       r = T^{-1}(s)                                                                                   (公式4) 

    式中,T^{-1}(s) 对 s 同样满足上述的两个条件。

    由概率论可知,如果已知随机变量 r 的概率密度是 p_{r}(r),而随机变量 s 是 r 的函数,则 s 的概率密度 p_{s}(s) 可以由 p_{r}(r) 求出。假定随机变量 s 的分布函数用 F_{s}(s) 表示,根据分布函数的定义有

                                                                       F_{s}(s) = \int_{-\infty }^{s}p_{s}(s)ds = \int_{-\infty }^{r}p_{r}(r)dr                                                        (公式5)

    又因为概率密度函数是分布函数的导数,因此公式5两边对 s 求导可得:

                                                 p_{s}(s) = \frac{\mathrm{d} F_{s}(s)}{\mathrm{d} s} = \frac{\mathrm{d} \left [ \int_{-\infty }^{r}p_{r}(r)dr \right ]}{\mathrm{d} s} = p_{r}(r)\frac{\mathrm{d} r}{\mathrm{d} s} = p_{r}(r)\frac{dr}{d[T(r)]}                                  (公式6)

    从公式6可以看出,通过变换函数 T(r) 可以控制图像灰度级的概率密度函数 p_{s}(s),从而改善图像的灰度层次,这就是直方图均衡化的理论基础。

    又有:从人眼视觉特性来考虑,一幅图像的灰度直方图如果是均匀分布的,那么该图像看上去效果比较好(参考冈萨雷斯数字图像处理3.3节)。因此要做直方图均衡化,这里的 p_{s}(s) 应当是均匀分布的概率密度函数。

    由概率论知识可知,对于区间 [a,b]上的均匀分布,其概率密度函数等于 \frac{1}{b-a}。 如果原图像没有进行归一化,即 r \in [0, L-1], 那么p_{s}(s) = \frac{1}{(L-1)-0} = \frac{1}{L-1},归一化之后 r \in [0, 1],所以这里的 p_{s}(s) = \frac{1}{1-0} = 1

     

    由公式6可以知道 p_{s}(s)ds = p_{r}(r)dr,又因为 p_{s}(s) = 1 ,所以有 ds = p_{r}(r)dr。对这个式子两边积分得:

                                                                             s = T(r) = \int_{0}^{r}p_{r}(r)dr                                                                         (公式7)

    公式7就是我们所求的变换函数 T(r)。它表明当变换函数 T(r) 是原图像直方图的累积分布概率时,能达到直方图均衡化的目的。

    对于灰度级为离散的数字图像,用频率来代替概率,则变换函数 T(r_{k}) 的离散形式可以表示为:

                                                                     s_{k} = T(r_{k}) = \sum_{i=0}^{k}p_{r}(r_{i}) = \sum_{i=0}^{k}\frac{n_{i}}{N}                                                                (公式8)

    式中,0 \leqslant r_{k} \leqslant 1k = 0, 1, 2, ..., L-1(注:这里的 r_{k} = \frac{k}{L-1},表示归一化后的灰度级;k表示归一化前的灰度级)。由公式8可以知道,均衡化后各像素的灰度级 s_{k} 可直接由原图像的直方图算出来。需要说明的是,这里的 s_{k} 也是归一化后的灰度级,其值在 0 到 1 之间;有时需要将其乘以L-1再取整,使其灰度级范围在 0 到 L-1之间,与原图像一致。

    手工实现直方图均衡化

    了解直方图均衡化的原理之后,我们以一个简单的例子来手工计算均衡化后的图像。这里我们假设存在以下这张图像(假定图像的灰度级范围是 [0, 9]):

    图 5 原始图像

    计算过程如下:

    第一步,计算原始图像的灰度直方图 n_{k}

    n(0) = 3,即原始图像中灰度级为0的像素的个数是3,直接从图5中可以数出来。按这样的方式分别得出 n(1)n(2), ..., n(9)。这里我们可以得到  n_{k}= [3,2,4,4,1,1,4,1,2,3]

    图 6 原始图像的灰度直方图

    第二步,计算原始图像的像素总个数。

    这里 N = 5*5 = 25

    第三步,计算原始图像的灰度分布频率。

    p_{r}(k) = n_{k} / N = [3/25,2/25,4/25,4/25,1/25,1/25,4/25,1/25,2/25,3/25]k = 0, 1, 2, ..., 9

    第四步,计算原始图像的灰度累积分布频率。

    s_{k} = \sum_{i=0}^{k}\frac{n_{i}}{N}= [3/25,5/25,9/25,13/25,14/25,15/25,19/25,20/25,22/25,25/25]k = 0, 1, 2, ..., 9

    第五步,将归一化的 s_{k} 乘以 L-1再四舍五入,以使得均衡化后图像的灰度级与归一化前的原始图像一致。

    s_{0} = \frac{3}{25} *(L-1) = \frac{3}{25} *9 = 1.08,四舍五入之后其值为1,也就是说原始图像中灰度级0对应均衡化后的灰度级1,即0→1。

    同理,s_{1} = 1.8,四舍五入之后为2,即1→2;s_{2} = 3.24,四舍五入之后为3,即2→3;s_{3} = 4.68,四舍五入之后为5,即3→5;s_{4} = 5.04,四舍五入之后为5,即4→5;s_{5} = 5.4,四舍五入之后为5,即5→5;s_{6} = 6.84,四舍五入之后为7,即6→7;s_{7} = 7.2,四舍五入之后为7,即7→7;s_{8} = 7.92,四舍五入之后为8,即8→8;s_{9} = 9,四舍五入之后为9,即9→9。

    以上的映射关系,就是变换函数 T(r) 的作用。

    第六步,根据以上映射关系,参照原始图像中的像素,可以写出直方图均衡化之后的图像,如图7所示。

    图 7 直方图均衡化之后的图像

    以上过程即为手动计算直方图均衡化。接着,我们看一下均衡化后图像的灰度直方图,如图8所示。

    图 8 均衡化后图像的灰度直方图

    根据图6和图8,说明一下直方图均衡化是如何增强图像对比度的。在图6中,原始图像灰度值为4,5,7的像素的个数为1,因此在图8中,这三个像素值点分别归并到相邻的灰度值中。因为有三个灰度值归并,因此在均衡化处理后,出现了三个空位,由这些空位将原来相邻的灰度值展开(举个例子:5和6相邻,均衡化后,变成5和7相邻),故而展宽了对比度,但是归并也带来了某些相邻像素对比度的降低(举个例子:4和5相邻,均衡化后,变成5和5相邻)。这也说明了直方图均衡化方法对灰度分布比较集中的图像的处理效果比较明显。

    MATLAB上实现直方图均衡化

    在MATLAB中提供了现成的函数histeq()来实现灰度图像的直方图均衡化,如下例所示:

    close all; 
    clear; 
    clc; 
    
    I = imread('pout.tif');
    J = histeq(I,256);
    imshowpair(I,J,'montage');
    图 9 使用函数histeq()进行直方图均衡化

    但为了演示说明算法的原理,下面将在MATLAB中自行编码实现灰度图像的直方图均衡化。通过代码来演示这个算法显然更加直观,更加易懂。

    close all; 
    clear; 
    clc; 
    
    % 首先读入灰度图像,并提取图像的高度和宽度
    image = imread('pout.tif'); 
    [height, width] = size(image); 
    
    % 然后统计每个灰度的像素值的累计数目
    NumPixel = zeros(1,256);  % 建立一个256列的行向量,以统计各灰度级的像素个数
    for i = 1 : height
       for j = 1 : width
           k = image(i,j);  % k是像素点(i,j)的灰度值
           % 因为NumPixel数组的下标是从1开始的,但是图像像素的取值范围是0~255
           % 所以用NumPixel(k+1)
           NumPixel(k+1) = NumPixel(k+1) + 1;  % 对应灰度值像素点数量加1 
       end
    end
    
    % % 这里我们将数组NumPixel显示出来,以观测效果
    % figure;
    % subplot(121), imshow(image);
    % subplot(122), bar(NumPixel);  % 灰度图像的直方图可以正确显示出来
    
    % 接下来,将频数值算为频率
    ProbPixel = zeros(1,256); % 统计各灰度级出现的频率
    for i = 1 : 256
        ProbPixel(i) = NumPixel(i) / (height * width);
    end
    
    % % 这里我们将数组ProbPixel显示出来,以观测效果
    % figure;
    % subplot(121), imshow(image);
    % subplot(122), bar(ProbPixel);  % 灰度图像的归一化直方图可以正确显示出来
    
    % 再用函数cumsum()来计算累积分布函数(CDF),并将频率(取值范围是0~1)映射到0~255的无符号整数
    CumPixel = cumsum(ProbPixel);  % 这里的数组CumPixel大小也是1×256
    CumPixel = uint8((256-1) .* CumPixel + 0.5); 
    
    % % 这里我们将数组CumPixel显示出来,以观测效果
    % figure;
    % subplot(121), imshow(image);
    % subplot(122), bar(CumPixel);  % 数组CumPixel可以正确显示出来 
    
    % 在下列用作直方图均衡化实现的赋值语句右端,image(i,j)被用来作为CumPixel的索引
    % 例如,image(i,j)=120,则从CumPixel中取出第120个值作为image(i,j)的新像素值
    outImage = uint8(zeros(height, width));  % 预分配数组
    for i = 1 : height
       for j = 1 : width
          outImage(i,j) = CumPixel(image(i,j));
       end
    end
    
    % 显示直方图均衡化前后的图像,可以发现,与调用函数histeq()的效果一致
    imshowpair(image, outImage, 'montage'); 

    实验效果如图10所示。

    图 10 自行编码实现的直方图均衡化效果

    上述讨论的是灰度图像的直方图均衡化。对于彩色图像而言,可以分别对R、G、B三个分量来做直方图均衡化,这也确实是一种方法。但有些时候,这样做很有可能会导致结果图像色彩失真。因此有人建议将RGB空间转换为HSV之后,对V分量进行直方图均衡化,以保证图像色彩不失真。(HSV分别指色调、饱和度、亮度)。

    下面我们采用图像处理工具箱中的测试用图(图11)分别做RGB空间和HSV空间的直方图均衡化。

    图 11 MATLAB自带的图像

    首先在RGB空间进行直方图均衡化处理。这里为了简便,直接调用MATLAB函数histeq()。

    close all; 
    clear; 
    clc; 
    
    I = imread('baby.jpg');
    % figure,imshow(I);
    
    % 分别提取R、G、B三个分量
    R = I(:, :, 1); 
    G = I(:, :, 2); 
    B = I(:, :, 3); 
    
    % 分别对三个分量进行直方图均衡化
    R = histeq(R, 256); 
    G = histeq(G, 256); 
    B = histeq(B, 256); 
    
    J = I;
    J(:, :, 1) = R; 
    J(:, :, 2) = G; 
    J(:, :, 3) = B; 
    
    imshowpair(I, J, 'montage'); 

    在RGB空间进行直方图均衡化的前后图像如图12所示。

    图 12 RGB空间直方图均衡化前后效果对比

    接下来,我们在HSV空间对V分量进行直方图均衡化处理。这里的代码可以采用调用MATLAB函数histeq()的方式,但是我们使用自行编码的方式进行处理。

    close all; 
    clear; 
    clc; 
    
    I = imread('baby.jpg'); 
    
    % 将RGB空间转换为HSV空间
    hsvImage = rgb2hsv(I); 
    
    % 提取V分量
    v = hsvImage(:, :, 3);  % 这里的v是double类型的矩阵
    
    % 以下代码与前面介绍基本一致,这里不再做过多注释
    [height, width] = size(v); 
    
    v = uint8(v .* 255 + 0.5); % 这里的0.5有必要加上,以免矩阵v中出现0
    
    N = zeros(1, 256); 
    for i = 1 : height
       for j = 1 : width
          k = v(i,j);
          N(k+1) = N(k+1) + 1; 
       end
    end
    
    ProbPixel = zeros(1, 256);
    for i = 1 : 256
        ProbPixel(i) = N(i) / (height * width); 
    end
    
    CumPixel = cumsum(ProbPixel);
    CumPixel = uint8(255 .* CumPixel + 0.5); % 四舍五入
    
    for i = 1 : height
       for j = 1 : width
          v(i,j) = CumPixel(v(i,j));  % 这里的v(i,j)不能为0,否则数组索引出错
       end
    end
    
    v = im2double(v); 
    hsvImage(:, :, 3) = v; 
    outImage = hsv2rgb(hsvImage); 
    
    imshowpair(I, outImage, 'montage');

    在HSV空间进行直方图均衡化的前后图像如图13所示。

    图 13 HSV空间直方图均衡化前后效果对比

    直方图均衡化的缺点

    如果一幅图像整体偏暗或者偏亮,那么直方图均衡化的方法很适用。但直方图均衡化是一种全局处理方式,它对处理的数据不加选择,可能会增加背景干扰信息的对比度并且降低有用信号的对比度(如果图像某些区域对比度很好,而另一些区域对比度不好,那采用直方图均衡化就不一定适用)。此外,均衡化后图像的灰度级减少,某些细节将会消失;某些图像(如直方图有高峰),经过均衡化后对比度不自然的过分增强。针对直方图均衡化的缺点,已经有局部的直方图均衡化方法出现。

    展开全文
  • 直方图均衡

    万次阅读 多人点赞 2018-11-29 20:54:03
    图像的空域处理是一种重要的图像处理技术,这类方法直接以图像的像素操作为基础,主要分为灰度变换和空域滤波两大类,直方图均衡化(Histogram equalization)就是一种常用的灰度变换方法。 直方图 对于灰度级...
  • 直方图均衡化原理

    千次阅读 2018-08-13 18:18:48
    直方图均衡化的作用是图像增强。 有两个问题比较难懂,一是为什么要选用累积分布函数,二是为什么使用累积分布函数处理后像素值会均匀分布。 第一个问题。均衡化过程中,必须要保证两个条件:①像素无论怎么映
  • 直方图均衡

    万次阅读 2016-10-09 21:52:08
    一、直方图均衡直方图均衡化一来可以提高图像的对比度,二来可以把图像变换成像素值是几乎均匀分布的图像。 变换 假定r已经标准化在[0,1]区间内,r=0表示黑色,r=1表示白色,变换函数 s=T(r), 0 =, 满足以下条件...
  • 直方图均衡

    万次阅读 2012-08-25 16:17:16
    直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法。直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大”前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现...
  • 直方图均衡化-优化

    千次阅读 2018-04-02 20:31:46
    直方图匹配直方图匹配和直方图均衡化类似,但直方图均衡试图使输出图像具有一个平坦的直方图,而直方图匹配是为了得到一个特定形状的直方图。我们先看一个例子。&gt;&gt; I=imread('E:\cv\冈萨雷斯数字图像...
  • 直方图均衡

    千次阅读 2018-05-21 11:51:45
    直方图均衡化通常用来增加图像的全局对比度。这种方法对于背景和前景都太亮或者太暗的图像非常有用。主要优势 :一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也...
  • 图像直方图与直方图均衡

    万次阅读 多人点赞 2016-01-29 12:47:11
    图像直方图与直方图均衡化图像直方图以及灰度与彩色图像的直方图均衡化图像直方图:概述:图像的直方图用来表征该图像像素值的分布情况。用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区...
  • 直方图均衡化的数学原理

    万次阅读 多人点赞 2016-09-04 13:36:19
    直方图均衡化的数学原理直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度...
  • 一、读取图片并展示:颜色直方图 OpenCV-Python中调用的直方图计算函数为cv2.calcHist。 &quot;&quot;&quot; hist = cv2.calcHist([image], # 传入图像(列表) [0], # 使用的通道(使用通道:可选...
  • 一、直方图均衡 如图3.16所示,是4个基本灰度级为特征的花粉图像:暗图像、亮图像、低对比度图像和高对比度图像,右侧显示了与这些图像对应的直方图。 由四张图的对比我们可知,如一幅图像的像素倾向于占据整个...
  • 直方图均衡化(Histogram equalization)与直方图规定化

    万次阅读 多人点赞 2017-12-17 17:07:26
    心血来潮,想写一写直方图均衡化。我先说说为什么要写直方图均衡化,因为之前接触到理论上的面试,看起来很简单的知识点,其实暗藏着很多的玄机(-_-)。本文尽量尝试着去推导。推导之前写一下基本的原理。 关注...
  • openCV直方图均衡

    万次阅读 2017-07-03 15:29:57
    1、什么是直方图均衡化 直方图是对图像像素的统计分布,它统计了每个像素(0到L-1)的数量。直方图均衡化就是将原始的直方图拉伸,使之均匀分布在全部灰度范围内,从而增强图像的对比度。直方图均衡化的中心思想是把...
  • 直方图均衡化、直方图变换、对比度自适应直方图均衡
  • MATLAB--数字图像处理 图像直方图均衡

    千次阅读 多人点赞 2019-09-03 15:43:01
    图像直方图均衡化 首先,我们要理解什么是图像直方图均衡化: 把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定...
  • 本篇将延续上一篇的内容,对直方图进行扩展,讲述直方图拉伸和直方图均衡化两个内容,并通过简单的C语言来实现这两个基础功能,让初学者通俗易懂。
  • 直方图均衡化计算过程

    万次阅读 多人点赞 2018-04-04 13:03:21
    我写了一篇关于直方图均衡化和直方图规定化的文章,直接push了代码和实验结果,没有讲原理。想看那篇文章请点击下面: https://blog.csdn.net/macunshi/article/details/79804547 这里我们尽量不用数学符号公式等...

空空如也

1 2 3 4 5 ... 20
收藏数 12,918
精华内容 5,167
关键字:

直方图均衡