1. 图像直方图
1.1 灰度直方图
图像的灰度直方图是图像灰度级的函数,表示数字图像中每一灰度级与其出现频数(呈现该灰度的像素数目)之间的统计关系。通常,用横坐标表示灰度级(
0
0
0~
255
255
255),纵坐标表示频数或相对频数(呈现该灰度级的像素出现的概率)。
灰度直方图的定义如下式所示:
P
(
r
k
)
=
n
k
N
P(r_k)=\frac{n_k}{N}
P(rk)=Nnk
式中,
N
N
N是图像的像素总数,
n
k
n_k
nk是第
k
k
k级灰度的像素数目,
r
k
r_k
rk表示第
k
k
k个灰度级,
P
(
r
k
)
P(r_k)
P(rk)是灰度级
r
k
r_k
rk出现的频数。
1.2 灰度直方图的性质
- 不具有空间特性
直方图描述了每个灰度级具有的像素的个数,但不能反映或表示图像像素的空间位置信息; - 反映图像的大致描述
图像灰度范围、灰度级分布、整幅图像平均亮度等; - 唯一性
一幅图像唯一一对应相应的直方图,而不同的图像可以具有相同的直方图;
2. 直方图均衡化
直方图均衡化是采用灰度级
r
r
r的累积分布函数作为变换函数的直方图修正法。
假设用
p
(
r
)
p(r)
p(r)表示原图像灰度级r的灰度级概率密度函数,直方图均衡化变换函数为:
s
=
T
(
r
)
=
∫
0
r
p
r
(
ω
)
d
ω
s=T(r)=\int_0^rp_r(\omega)d\omega
s=T(r)=∫0rpr(ω)dω
T
(
r
)
T(r)
T(r)是
r
r
r的累积分布函数,随着
r
r
r增大,
s
s
s值单调增加,最大为1。
给出一幅数字图像,共有
L
L
L个灰度等级,总像素个数为
N
N
N,其中,第
j
j
j级灰度
r
j
r_j
rj对应的像素数为
n
j
n_j
nj,则图像进行直方图均衡化处理的变换函数
T
(
r
)
T(r)
T(r)为:
s
k
=
T
(
r
k
)
=
∑
j
=
0
k
p
r
(
r
j
)
=
∑
j
=
0
k
n
j
N
s_k=T(r_k)=\sum_{j=0}^{k}p_r(r_j)=\sum_{j=0}^{k}\frac{n_j}{N}
sk=T(rk)=j=0∑kpr(rj)=j=0∑kNnj
对一幅数字图像进行直方图均衡化处理的算法步骤如下∶
(1)统计原始图像直方图;
(2)计算新的灰度级;
(3)修正 s k s_k sk为合理的灰度级;
(4)计算新的直方图;
(5)用处理后的新灰度代替处理前的灰度,生成新图像。
3. 直方图与直方图均衡化代码展示
3.1 直方图
clc,clear,close all;
Image = imread('Couple.bmp');
histgram = zeros(256);
[h,w] = size(Image);
for x=1:w
for y=1:h
%灰度值范围为0-255,直方图长度为255+1
%将相应灰度值出现的次数累加,并置于直方图相应的索引处(灰度值+1)
histgram(Image(y,x)+1) = histgram(Image(y,x)+1)+1;
end
end
imshow(Image);title('原图');
figure;stem(histgram(),'.');
axis tight;
MATLAB提供了直接计算图像直方图的函数∶
imhist(I, N)
%N为灰度级,默认为256
imhist(X,MAP)
%统计并显示索引图像X的直方图,MAP为调色板
%%
clc,clear,close all;
Image = imread('couple.bmp');
subplot(121),imshow(Image);title('原图');
subplot(122), imhist(Image);
axis tight;
3.2 直方图均衡化
clc,clear,close all;
Image = imread('Couple.bmp');
histgram = imhist(Image);
[h,w] = size(Image);
NewImage = zeros(h,w);
s = zeros(256);
s(1) = histgram(1);
for t=2:256
s(t) = s(t-1)+histgram(t);%获取灰度值的累积分布
end
for x=1:w
for y=1:h
NewImage(y,x)=s(Image(y,x)+1)/(h*w);%利用直方图计算新的图像灰度值
end
end
subplot(121),imshow(Image);
subplot(122),imshow(NewImage);
MATLAB提供了直接计算图像直方图均衡化的函数∶
J = histeq(I,N)
%对图形I进行均衡化处理,N为输出图像的灰度级数
clc,clear,close all;
Image = imread('GIRL.bmp');
NewImage = histeq(Image,64);
subplot(121),imshow(Image);
subplot(122),imshow(NewImage);