玩转直方图处理之直方图均衡化、规定化

冒泡....双十一刚过~购物狂欢完还是要收心学习鸭!今天来说一说直方图。

直方图

定义:

直方图是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。
灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像元的个数。以横轴表示灰度级,以纵轴表示每一灰度级具有的像元数或该像元数占总像元数的比例值,做出的条形统计图即为灰度直方图。如以下:

直方图示例.png

由图像可以得到的一些直方图的性质:

a.图形直观可以发现它首先是一个一维离散函数图像
b.直方图表示一幅图像中不同灰度像素出现的统计信息,它只能反映该图像中不同灰度值出现的频数(概率),而不能表示出像素的位置等其他信息
c.任何一幅特定的图像都有唯一的直方图与之对应,但不同的图像可以有相同的直方图。

根据直方图的形态可以大致推断图像质量的好坏。由于图像包含有大量像元,其像元灰度值分布应符合概率统计分布规律。假定像元的灰度值是随机分布,那么其直方图应该是正态分布。

image.png

直方图的均衡化

直方图均衡化是将原图像的直方图通过变换函数变为均匀的直方图,然后按均匀直方图修改原图像,从而获得一幅灰度分布均匀的新图像。
image.png
image.png

接下来就推导一下均衡化的过程:
首先考虑连续的灰度值,用变量 r 表示输入图像的灰度,用 s 表示输出图像的灰度。r 范围是 [ 0, L-1],则函数: s = T(r), r 的范围:[0 , L-1] (0为全黑,L-1为全白)。
T(r)满足下列两个条件:
1.T(r)在区间0≤r≤1中为 严格单调递增函数,保证原图各灰度级在变换后仍保持从黑 到白(或从白到黑)的排列次序)
2.当0≤r≤1时,0≤T(r) ≤1,保证变换前后灰度值动态范围的一致性。
在处理的过程中需要引入重要的变换函数:

image.png
其中:

根据学过的概率论可知:
image.png

所以可以得到如下过程:
image.png

最后可以发现:得到ps(s)是一个均匀的概率密度函数,与pr(r)无关
对于离散值,我们处理其概率(直方图值)与求和来替代处理概率密度函数与积分。因此,一幅数字图像中灰度级出现的概率(近似)和离散变换形式如下:

iMN为图像的总像素

接下来举例说明:
image.png

1.第一步利用变换公式求出s
image.png

2.把S的值化为近似的整数
s0 = 1.33≈1 ;s1 =3.08≈3 ;s2= 4.05≈4 ;
s3 = 5.67≈6 ;s4 =6.23≈6 ;s5 = 6.66≈7;
s6= 6.86≈7 ;s7 = 7.00≈7 ;
近似完之后,发现剩下1、3、4、6、7这五个不同的灰度级
(r0=0被映射为S0=1)
3.接下来就统计新的输出的灰度的相关参数
注意:sk=6的为s3和s4故nk是两个的叠加,p(sk)的值为nk/MN(4096)

作图直观:
image.png

Matlab代码参考

I = imread('rice.png');
[height,width] = size(I);
figure
subplot(221)
imshow(I)%显示原始图像
subplot(222)
imhist(I)%显示原始图像直方图
 
%进行像素灰度统计;
NumPixel = zeros(1,256);%统计各灰度数目,共256个灰度级
for i = 1:height
    for j = 1: width
        NumPixel(I(i,j) + 1) = NumPixel(I(i,j) + 1) + 1;%对应灰度值像素点数量增加一
    end
end
%计算灰度分布密度
ProbPixel = zeros(1,256);
for i = 1:256
    ProbPixel(i) = NumPixel(i) / (height * width * 1.0);
end
%计算累计直方图分布
CumuPixel = zeros(1,256);
for i = 1:256
    if i == 1
        CumuPixel(i) = ProbPixel(i);
    else
        CumuPixel(i) = CumuPixel(i - 1) + ProbPixel(i);
    end
end
%累计分布取整
CumuPixel = uint8(255 .* CumuPixel + 0.5);
%对灰度值进行映射(均衡化)
for i = 1:height
    for j = 1: width
        I(i,j) = CumuPixel(I(i,j));
    end
end
 
subplot(223)
imshow(I)%显示原始图像
subplot(224)
imhist(I)%显示原始图像直方图

直方图的规定化

从文字就可以看出,规定化就是把直方图转化为既定的规定化的形状。
过程如下:
先设 Pr(r)和Pz(z)分别表示原始灰度图像和目标图像的灰度分布概率密度函数.根据直方图规 定化的特点与要求,应使原始图像的直方图具有Pz(z)所表示的形状。因此建立Pr(r)和 Pz(z)之间的关系是直方图规定化必须解决的问题。



离散表达形式:

接下来举个例子说明:
image.png

第一步:要先根据图a提供的直方图求出输出之后均衡的值

公式参考:

求得完成后取近似值
s0 = 1.33≈1 ;s1 =3.08≈3 ;s2= 4.05≈4 ;

s3 = 5.67≈6 ;s4 =6.23≈6 ;s5 = 6.66≈7;
s6= 6.86≈7 ;s7 = 7.00≈7 ;
第二步:求变换函数G的所有值

参考公式如下:
image.png

过程如下:
image.png

再将求好的换成近似值
G(z0)≈0;G(z1)≈0;G(z2)≈0;
G(z3)≈1;G(z4)≈2;G(z5)≈5;
G(z6)≈6;G(z7)≈7;
第三步:寻找组射关系
根据刚刚两步的计算,可以发现G(z3)≈1,s0≈1,这种情况下就是一个完美的匹配了,也就是从s0→z3

因此可以列表
image.png

然后可以求出相应的概率,比如S=1映射到Z=3,790个像素为1,概率为790/4096=0.19.具体如下:
image.png

说明:和上一题联系
Pz(z=4)相当于Pr(r=1)
Pz(z=5)相当于Pr(r=2)--S=5映射到Z=5
Pz(z=6)相当于Pr(r=3)+Pr(r=4)
Pz(z=7)相当于Pr(r=5)+Pr(r=6)+Pr(r=7)
图形直观:
image.png

虽然没有完全匹配,但是也达到了将灰度明确移动到灰度级高端。

参考资料:(https://blog.csdn.net/u013355826/article/details/57417771)
(https://blog.csdn.net/taoyanqi8932/article/details/52758376)
(https://blog.csdn.net/xiajun07061225/article/details/6910129)

Ending 不容易地收尾啦~

你可能感兴趣的:(玩转直方图处理之直方图均衡化、规定化)