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

灰度直方图

  一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征。图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少。
图像的灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数:其中,横坐标是灰度级,纵坐标是该灰度级出现的频率。

灰度直方图的计算公式如下:

p(rk)=nk/MN

其中,rkrk是像素的灰度级,nknk是具有灰度rkrk的像素的个数,MNMN是图像中总的像素个数。

直方图均衡化 Histogram Equalization

假如图像的灰度分布不均匀,其灰度分布集中在较窄的范围内,使图像的细节不够清晰,对比度较低。通常采用直方图均衡化直方图规定化两种变换,使图像的灰度范围拉开或使灰度均匀分布,从而增大反差,使图像细节清晰,以达到增强的目的。
直方图均衡化,对图像进行非线性拉伸,重新分配图像的灰度值,使一定范围内图像的灰度值大致相等。这样,原来直方图中间的峰值部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较为平坦的直方图。

均衡化算法

直方图的均衡化实际也是一种灰度的变换过程,将当前的灰度分布通过一个变换函数,变换为范围更宽、灰度分布更均匀的图像。也就是将原图像的直方图修改为在整个灰度区间内大致均匀分布,因此扩大了图像的动态范围,增强图像的对比度。通常均衡化选择的变换函数是灰度的累积概率,直方图均衡化算法的步骤:

  • 计算原图像的灰度直方图 P(Sk)=nknP(Sk)=nkn,其中nn为像素总数,nknk为灰度级SkSk的像素个数
  • 计算原始图像的累积直方图 CDF(Sk)=∑i=0knin=∑i=0kPs(Si)CDF(Sk)=∑i=0knin=∑i=0kPs(Si)
  • Dj=L⋅CDF(Si)Dj=L⋅CDF(Si),其中 DjDj是目的图像的像素,CDF(Si)CDF(Si)是源图像灰度为i的累积分布,L是图像中最大灰度级(灰度图为255)

灰度直方图均衡化实现的步骤

1.统计灰度级中每个像素在整幅图像中的个数

2.计算每个灰度级占图像中的概率分布

3.计算累计分布概率

4.计算均衡化之后的灰度值

5.映射回原来像素的坐标的像素值

示例说明

来看看通过上述步骤怎样实现的拉伸。假设有如下图像:

得图像的统计信息如下图所示,并根据统计信息完成灰度值映射:

映射后的图像如下所示:

灰度直方图均衡化实现

            //img_size为图像大小
            //Image_Use为图像数组            //Use_ROWS为行,Use_Line为列
            float img_size = Use_ROWS * Use_Line * 1.0;
                    int count_data[256],huidu_data[256]; //计数统计、均衡化的灰度值
                    float midu_data[256],leijimidu_data[256];  //概率密度、累计概率密度
            //数组初始化
                    memset(count_data, 0, sizeof(count_data));
                    memset(midu_data, 0.0, sizeof(midu_data));
                    memset(leijimidu_data, 0.0, sizeof(leijimidu_data));
                    memset(huidu_data, 0.0, sizeof(huidu_data));

                    //1.统计灰度级中每个像素在整幅图像中的个数
                    for(int i = 0; i < Use_ROWS; i++)
                    {
                        for(int j = 0; j < Use_Line; j++)
                        {
                          count_data[Image_Use[i][j]]++;
                        }
                    }
                    //2.计算每个灰度级占图像中的概率分布
                    for(int i = 0; i < 256; i++)
                    {
                         midu_data[i] =  count_data[i]/ img_size;
                    }
                    //3.计算累计分布概率
                    leijimidu_data[0] =  midu_data[0];
                     for(int i = 1; i < 256; i++)
                    {
                        leijimidu_data[i] =  midu_data[i]+leijimidu_data[i-1];
                    }
                    //4.计算均衡化之后的灰度值
                    for(int i =0; i <256; i++)
                    {
                         huidu_data[i] = (int)(255 * leijimidu_data[i]);
                    }
                    //5.映射回原来像素的坐标的像素值
                    for(int i = 0; i < Use_ROWS; i++)
                    {
                        for(int j = 0; j < Use_Line; j++)
                        {
                          Image_Use[i][j] = huidu_data[Image_Use[i][j]];
                        }
                    }

原始图像:

直方图均衡化后的图像:

   

直方图规定化

参考:

图像处理基础(8):图像的灰度直方图、直方图均衡化、直方图规定化(匹配)

原文地址:https://www.cnblogs.com/-wenli/p/11496620.html

时间: 2024-08-17 10:23:42

【数字图像处理】灰度直方图、直方图均衡化、直方图规定化的相关文章

python数字图像处理(9):直方图与均衡化

在图像处理中,直方图是非常重要,也是非常有用的一个处理要素. 在skimage库中对直方图的处理,是放在exposure这个模块中. 1.计算直方图 函数:skimage.exposure.histogram(image, nbins=256) 在numpy包中,也提供了一个计算直方图的函数histogram(),两者大同小义. 返回一个tuple(hist, bins_center), 前一个数组是直方图的统计量,后一个数组是每个bin的中间值 import numpy as np from

[数字图像处理]灰度直方图均衡化

1 function [ ] = histChange( A ) 2 %histChange 此处显示有关此函数的摘要 3 %对输入图像矩阵进行灰度直方图均衡化,若输入为RGB图像矩阵,则自动转换为灰度图像进行处理 4 % 5 [M,N,a]=size(A); 6 if a == 3 7 B=rgb2gray(A); 8 else 9 B=A; 10 end 11 x=0:255; 12 y=zeros(1,256); 13 s=zeros(1,256); 14 subplot(2,2,1);

数字图像处理作业使用OpenCV - 自定义直方图

第二次作业需要打印出来灰度直方图,当然不能使用ocv的自带calcHist函数来得到Mat对象了……结果上网搜索怎么用自己的数据创建直方图,搜到的都是直接用函数的_(:з」∠)_ 结果这个地方拖了好久呵呵呵呵呵呵呵.最后还是努力耐下性子来对照网上绘制灰度直方图的代码来看到底内藏什么玄机,结果发现其实真的,没什么,大不了(笑)(哭). 基本思路: 建立一个Mat对象作为直方图的画布,将256个灰度级的数值的直方用rectangle或者line一个一个画出来. ……简直简单到我无法想象_(:з」∠)

使用 matlab 数字图像处理(一)—— 归一化直方图

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net I = imread('pout.tif'); % matlab 自带图像 [cnts, x] = imhist(I, 32); [m, n] = size(I); prob = cnts / m / n; % sum(prob) == 1 stem(x, prob) 1 2 3 4 5 6 图像的灰度直方图关于图像提供了丰富的信息

OpenCV-跟我一起学数字图像处理之直方图均衡化

从这篇博文开始,小生正式从一个毫不相干专业转投数字图像处理.废话不多说了,talk is cheap. show me the code. 直方图均衡化目的 由于一些图像灰度的分布过于集中,这样会导致图像的层次不够分明,直方图均衡化就是为了让图像的灰度分布更均匀,图像的层次感更强. 数学原理 基于连续灰度分布的结论推导 直方图均衡化属于数字图像处理中灰度变换(intensity transformation)的内容,灰度变换的目的就是找到一个合适的映射函数s=T(r).将原图像的灰度值映射到新的

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

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

【数字图像处理之(四)】用图像增强谈灰度直方图

灰度直方图 是灰度级的函数,描述的是图像中该灰度级的像个数或该灰度级像素出现的频率(归一化) 生成并绘制直方图: src = imread('Fig0303(a)(breast).tif'); imshow(src); h1 = imhist(src); %生成直方图 figure,imhist(src,255); %绘制直方图 h2 = imhist(src, 25); %生成直方图 horz = linspace(0, 255, 25); figure,bar(horz, h2); %绘制条

【数字图像处理】四.MFC对话框绘制灰度直方图

本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行回忆讲解,主要通过MFC单文档视图实现点击弹出对话框绘制BMP图片的灰度直方图,再获取平均灰度.中指灰度和标准差等值.文章比较详细基础,希望该篇文章对你有所帮助~ [数字图像处理]一.MFC详解显示BMP格式图片 [数字图像处理]二.MFC单文档分割窗口显示图片 [数字图像处理]三.MFC实现图像灰度.采样和量化功能详解 免费资源下载地址: http://download.csdn.ne

【数字图像处理】五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理具体解释

本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行解说.主要通过MFC单文档视图实现显示BMP图片点运算处理.包含图像灰度线性变换.灰度非线性变换.图像阈值化处理.图像均衡化处理等知识,并结合前一篇论文灰度直方图进行展示 .同一时候文章比較具体基础,希望该篇文章对你有所帮助,尤其是刚開始学习的人和学习图像处理的学生. [数字图像处理]一.MFC具体解释显示BMP格式图片 [数字图像处理]二.MFC单文档切割窗体显示图片 [数字图像处理]