直方图均衡化
直方图均衡原理 & MATLAB实现_yaoyz105的博客-CSDN博客_matlab直方图均衡
将原始图像中的灰度分布变换为服从均匀分布,通过扩大动态范围提高对比度。
注:可能增加噪声对比度并降低有用信息对比度,此外只是将灰度扩散,这就导致实际的均衡过后,图像像素间的差距较大。
连续值推导
取灰度映射函数
s
=
T
(
r
)
s=T(r)
s=T(r),其中
s
s
s为输出灰度值;
r
r
r为输入像素值,
T
(
x
)
T(x)
T(x)为灰度映射函数。
T
(
x
)
T(x)
T(x)推导如下:设
s
s
s、
r
r
r对应概率密度函数为
p
r
(
r
)
p_r(r)
pr(r)、
p
s
(
s
)
p_s(s)
ps(s),则有
p
s
(
s
)
d
s
=
p
r
(
r
)
d
r
p_s(s){\rm d}s=p_r(r){\rm d}r
ps(s)ds=pr(r)dr,由于
s
s
s服从均匀分布故有:
p
s
(
s
)
=
{
1
L
−
1
0
≤
s
≤
L
−
1
0
o
t
h
e
r
s
p_s(s)=\begin{cases} \frac{1}{L-1} & 0≤s≤L-1 \\ 0 & others \end{cases}
ps(s)={L−1100≤s≤L−1others考虑
s
s
s和
r
r
r有相同的取值范围,故在
[
0
,
L
−
1
]
[0,L-1]
[0,L−1]上有:
∫
0
s
1
L
−
1
d
s
=
∫
0
r
p
r
(
r
)
d
r
\int_{0}^{s}{\frac{1}{L-1}}{\rm d}s = \int_{0}^{r}{p_r(r)}{\rm d}r
∫0sL−11ds=∫0rpr(r)dr左式积分即:
s
=
(
L
−
1
)
∫
0
r
p
r
(
r
)
d
r
s=(L-1)\int_{0}^{r}{p_r(r)}{\rm d}r
s=(L−1)∫0rpr(r)dr
所以在连续信号上,值到均值的变换应为:
T
(
r
)
=
(
L
−
1
)
∫
0
r
p
r
(
r
)
d
r
T(r)=(L-1)\int_{0}^{r}{p_r(r)}{\rm d}r
T(r)=(L−1)∫0rpr(r)dr
离散情况
对于一张灰度值在
[
0
,
255
]
[0,255]
[0,255]的图像,某一灰度
r
k
r_k
rk的概率为
p
r
(
r
k
)
=
n
k
w
i
d
t
h
∗
h
e
i
g
h
t
p_r(r_k)=\frac{n_k}{width*height}
pr(rk)=width∗heightnk,其中
n
k
n_k
nk为
r
k
r_k
rk统计量;width和height分别为图像宽和高。在离散情况下累积分布函数计算为:
C
D
F
r
(
r
)
=
∑
j
=
0
r
p
r
(
r
j
)
CDF_r(r)=\sum_{j=0}^{r}{p_r(r_j)}
CDFr(r)=j=0∑rpr(rj)
故离散情况下
s
k
=
255
∗
∑
j
=
0
k
p
r
(
r
j
)
s_k=255*\sum_{j=0}^{k}{p_r(r_j)}
sk=255∗∑j=0kpr(rj),
k
=
0
,
1
,
2
,
.
.
.
,
255
k=0,1,2,...,255
k=0,1,2,...,255
这里的变换 T ( r ) T(r) T(r)称为直方图均衡。
matlab代码
%C:\Users\16431\Desktop\2.jpg
clear;
I = imread('C:\Users\16431\Desktop\4.jpg'); % 读取彩色图
% I=rgb2gray(RGB); % 将彩色图转化为灰度图
subplot(221);
imshow(I);
title('灰度图');
subplot(222);
imhist(I,256);
title('灰度图hist');
[R, C] = size(I);
% 统计每个像素值出现次数
cnt = zeros(1, 256);
for i = 1 : R
for j = 1 : C
cnt(1, I(i, j) + 1) = cnt(1, I(i, j) + 1) + 1;
end
end
f = zeros(1, 256);
f = double(f); cnt = double(cnt);
% 统计每个像素值出现的概率, 得到概率直方图
for i = 1 : 256
f(1, i) = cnt(1, i) / (R * C);
end
% 求累计概率,得到累计直方图
for i = 2 : 256
f(1, i) = f(1, i - 1) + f(1, i);
end
% 用f数组实现像素值[0, 255]的映射。
for i = 1 : 256
f(1, i) = f(1, i) * 255;
end
% 完成每个像素点的映射
I = double(I);
for i = 1 : R
for j = 1 : C
I(i, j) = f(1, I(i, j) + 1);
end
end
% 输出
I = uint8(I);
subplot(223);
imshow(I);
title('直方图均衡化');
subplot(224);
imhist(I,256);
title('均衡化hist');
1