[MATLAB]平台直方图算法MATLAB实现

MATLAB验证FPGA平台直方图的实现

Blog: https://blog.csdn.net/AnimateX

Email: [email protected]

[MATLAB]平台直方图算法MATLAB实现_第1张图片


1 直方图

在统计学中,直方图(英语:Histogram)是一种对数据分布情况的图形表示,是一种二维统计图表,它的两个坐标分别是统计样本和该样本对应的某个属性的度量。


2 归一化直方图

把直方图上每个属性的计数除以所有属性的计数之和,就得到了归一化直方图。之所以叫“归一”,是因为归一化直方图的所有属性的计数之和为1,也就是说,每个属性对应计数都是0到1之间的一个数(百分比)。


3 应用

3.1 图像直方图(英语:Image Histogram)

图像直方图是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。可以借助观察该直方图了解需要如何调整亮度分布。这种直方图中,横坐标的左侧为纯黑、较暗的区域,而右侧为较亮、纯白的区域。因此,一张较暗图片的图像直方图中的数据多集中于左侧和中间部分;而整体明亮、只有少量阴影的图像则相反。

很多数码相机提供图像直方图功能,拍摄者可以通过观察图像直方图了解到当前图像是否过分曝光或者曝光不足。

计算机视觉领域常借助图像直方图来实现图像的二值化。

3.2 颜色直方图

在图像处理和摄影领域中,颜色直方图(英语:Color Histogram)指图像中颜色分布的图形表示。数字图像的颜色直方图覆盖该图像的整个色彩空间,标绘各个颜色区间中的像素数。

颜色直方图本身可以针对任意色彩空间使用,但这一术语通常只用在诸如 RGB 和 HSV 的三维色彩空间,而针对灰度图像时常使用亮度直方图(英语:Intensity Histogram)这一术语。

3.3 质量直方图

在质量管理领域中,质量分布图是根据从生产过程中收集来的质量数据分布情况,画成以组距为底边、以频数为高度的一系列连接起来的直方图。


4 直方图均衡化

直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。如下图所示为直方图均衡化的示意图。

[MATLAB]平台直方图算法MATLAB实现_第2张图片

这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。

这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景噪声的对比度并且降低有用信号的对比度。


参考书: 冈萨雷斯 数字图像处理第三版

5 理论知识

考虑连续灰度值,并用变量r表示待处理图像的灰度。r的取值范围是[0, L-1],L代表灰度级总数。先注意变换形式(灰度映射):

s=T(r),0rL1(1) s = T ( r ) , 0 ≤ r ≤ L − 1 ( 1 )

对于输入图像中每个具有r值的像素值产生一个输出灰度值 s s 。我们假设:
(a) T(r) T ( r ) 在区间 0rL1 0 ≤ r ≤ L − 1 上为单调递增函数;
(b) 当 0rL1,0T(r)L1 0 ≤ r ≤ L − 1 , 0 ≤ T ( r ) ≤ L − 1
引出反函数:
r=T1(s),0sL1(2) r = T − 1 ( s ) , 0 ≤ s ≤ L − 1 ( 2 )

这种情况下,上面(a)假设变为:
(a) T(r) T ( r ) 在区间 0rL1 0 ≤ r ≤ L − 1 上是一个严格单调递增函数。

条件(a)中要求 T(r) T ( r ) 为单调递增函数是为了保证输出灰度值不少于相应的输入值,防止灰度反变换时产生认为缺陷。条件(b)是保证输出灰度的范围与输入灰度的范围相同。最后新的(a)保证从 s s r r 的映射是一对一的,防止出现二义性。

[MATLAB]平台直方图算法MATLAB实现_第3张图片

上图满足(a)和(b)两个假设,可以看出多值映射到单值也是可能的,并且仍然满足两个假设。
简单来讲, r r s s 映射很完美,但是我们想要唯一的从映射的值恢复 r r 值(反映射由反向箭头表示),上图(a)则存在问题。图中 sk s k 的反映射是可能的,但 sq s q 反映射的是一个范围的值,通常,要防止由 sq s q 恢复原始的 r r 值的问题。如上图(b)所示, T(r) T ( r ) 要求是严格单调的,以保证反映射是单值的(即两个方向上的映射都是一对一的),因为实践中我们处理的是整数灰度值,必须把所有结果四舍五入为最接近的整数值。因此,如果严格单调不满足时,我们就需要寻找最接近整数匹配的方法来解决非唯一反变换的问题。
如下图所示。
[MATLAB]平台直方图算法MATLAB实现_第4张图片


6 数学知识

一幅图像的灰度级可以看成是区间 [0,L1] [ 0 , L − 1 ] 内的随机变量。随机变量的基本描绘子是其概率密度函数(PDF)。令 pr(r) p r ( r ) ps(s) p s ( s ) 分别表示随机变量 r r s s 的概率密度函数,其中p的下标用于指示不同的函数。由基本概率论得到的一个基本结论就是,如果 pr(r) p r ( r ) ps(s) p s ( s ) 已知,且在感兴趣的值域 T(r) T ( r ) 上是连续可微的,则变换后的变量 s s 的PDF可由下面的简单公式得到:

ps(s)=pr(r)drds(3) p s ( s ) = p r ( r ) | d r d s | ( 3 )

这样,我们看到,输出灰度变量s的PDF就由输入灰度的PDF和所用的变换函数决定。
在图像处理中特别重要的变换函数有如下形式:
s=T(r)=(L1)r0pr(w)dw(4) s = T ( r ) = ( L − 1 ) ∫ 0 r p r ( w ) d w ( 4 )

其中, w w 是积分的假变量。公式右边是随机变量 r r 的累积分布函数(CDF)。因为PDF总为正,一个函数的积分应该是该函数下方的面积,遵循公式(4)的变换函数满足前述假设(a),因为函数下的面积不随 r r 的增大而减小。当在该等死中上限是 r=L1 r = L − 1 时,积分值等于1(PDF曲线下方的面积总是1),所以 s s 的最大值是(L-1),并且假设(b)也是满足的。
寻找公式(3)中相应的变换 ps(s) p s ( s ) 。由基本积分学中的莱布尼茨准则知道,关于上限的定积分的导数是被积函数在该上限的值,即
dsdr=dT(r)dr=(L1)ddr[r0pr(w)dw]=(L1)pr(5) d s d r = d T ( r ) d r = ( L − 1 ) d d r [ ∫ 0 r p r ( w ) d w ] = ( L − 1 ) p r ( 5 )

将公式(5)带入公式(3),并记住概率密度值为正,得到
ps(s)=pr(r)drds=pr(r)1(L1)pr(r)=1L1(6) p s ( s ) = p r ( r ) | d r d s | = p r ( r ) | 1 ( L − 1 ) p r ( r ) | = 1 L − 1 ( 6 )

0sL1 0 ≤ s ≤ L − 1 ,从该公式可知, ps(s) p s ( s ) 可知,这是一个均匀概率密度函数。
则知 T(r)pr(r) T ( r ) 取 决 于 p r ( r ) ps(s) p s ( s ) pr(r) p r ( r ) 形式无关。请看下面这个例子。
[MATLAB]平台直方图算法MATLAB实现_第5张图片

因为直方图是PDF近似,而且在处理中不允许造成新的灰度级,所以在实际的直方图均衡应用中,很少见到完美平坦的直方图。


7 代码实现

工具:MATLAB

注:本测试使用FPGA给出的灰度数据而非图片作为测试

function code

function imgOut = AHE(imgIn)
    [M, N, num] = size(imgIn);

    num_compress = 256;

    imgOut = zeros(M, N, num);


    for i = 1 : num
        % PDF
        imgTemp = round(imgIn(:, :, i));
        imgTemp = imgTemp - min( imgTemp(:) ) + 1;

        NUM = max( imgTemp(:) );

        tempPDF = zeros(1, NUM);

        % PDF: tempPDF
        for j = 1 : NUM
            tempPDF(j) = length(find(imgTemp == j));
        end
        % 计算平台值
        maxiumTempPDF = tempPDF( find( diff( sign( diff( tempPDF ) ) ) < 0 ) + 1 );

        Tmax = mean( maxiumTempPDF(:) );

        % 平台值处理
        for j = 1 : NUM
            if tempPDF(j) > Tmax
                tempPDF(j) = Tmax;
            end
        end
        % 归一化直方图
        tempPDF = tempPDF ./ (M * N);

        % CDF
        % 计算累计直方图
        tempCDF = cumsum(tempPDF);

        % HE
        % 从做开始往右对应映射
        tempH = floor( tempCDF .* (num_compress - 1) );

        % 还原数据
        for j = 1 : M
            for k = 1 : N
                imgOut(j, k, i) = tempH(imgTemp(j, k));
            end
        end
        imgOut(:, :, i) = imgOut(:, :, i) - 1;
    end
end

test code

load('objF2.mat');
figure, imshow(objF2, [ ]);
imgLF = AHE(objF2);
figure, imshow(imgLF, [ ]);

Compare
1 原始图像
[MATLAB]平台直方图算法MATLAB实现_第6张图片
2 平台直方图后的新图像
[MATLAB]平台直方图算法MATLAB实现_第7张图片


仅供学习!转载请提供出处!


参考文章:

[1]维基百科的例子不错,大家可以看看!
https://zh.wikipedia.org/wiki/%E7%9B%B4%E6%96%B9%E5%9B%BE%E5%9D%87%E8%A1%A1%E5%8C%96
[2]这个附的两个代码可以直接用的,结合前面的理论很好理解
http://www.cnblogs.com/ChenxofHit/archive/2011/02/28/1966910.html
[3]例子很直观!看图即理解
http://www.cnblogs.com/tianyalu/p/5687782.html
[4]平台直方图
http://blog.chinaaet.com/helimin/p/5100018220

你可能感兴趣的:(红外图像算法项目总结,MATLAB)