目的
直方图均衡的目的是使图像灰度间距拉开或使灰度分布均匀,从而增大对比度,使图像细节清晰,实现图像空间增强
原理
基本思想是把原始图的直方图变换为在整个灰度 范围均匀分布的形式,增加像素值的动态范围。
对于图像直方图,用概率密度PDF代替频率:
P
r
(
r
k
)
=
n
k
n
,
k
=
0
,
1
,
2
,
⋯
,
L
−
1
Pr(r_k)= \frac{n_k}{n},k=0,1,2,\cdots,L-1
Pr(rk)=nnk,k=0,1,2,⋯,L−1
转化均匀分布的形式需要一个变换函数,即增强 函数T,且满足2个条件:
- 单值但增函数
- 对应0 ≤ \leq ≤r ≤ \leq ≤L-1,有0 ≤ \leq ≤ T ( r ) T(r) T(r) ≤ \leq ≤L-1
累积分布函数CDF满足上述2个条件并能将图像灰 度值由原始分布转化为均匀分布:
P
(
r
k
)
=
∑
j
=
0
k
p
r
(
r
j
)
=
∑
j
=
0
k
n
k
n
,
k
=
0
,
1
,
2
,
⋯
,
L
−
1
P(r_k)=\sum_{j=0}^{k}{p_r(r_j)}=\sum_{j=0}^{k}{\frac{n_k}{n}}, \quad k=0,1,2,\cdots,L-1
P(rk)=j=0∑kpr(rj)=j=0∑knnk,k=0,1,2,⋯,L−1
变换函数用于直方图累积分布:
s
k
=
T
(
r
k
)
=
D
m
∑
j
=
0
k
(
n
j
n
)
,
k
=
0
,
1
,
2
,
⋯
,
L
−
1
s_k=T(r_k)=D_m\sum_{j=0}^{k}(\frac{n_j}{n}),\quad k=0,1,2,\cdots ,L-1
sk=T(rk)=Dmj=0∑k(nnj),k=0,1,2,⋯,L−1
确保:
- 防止变换后图像出现反转灰度级;
- 变换前后灰度值动态范围一致性。
算法
- 概率:
p r ( r k ) = n k n , k = 0 , 1 , 2 , ⋯ , L − 1 p_r(r_k)=\frac{n_k}{n},\quad k=0,1,2,\cdots,L-1 pr(rk)=nnk,k=0,1,2,⋯,L−1 - 累积分布函数
P ( r k ) = ∑ j = 0 k p r ( r j ) = ∑ j = 0 k n k n , k = 0 , 1 , 2 , ⋯ , L − 1 P(r_k)=\sum_{j=0}^{k}p_r(r_j)=\sum_{j=0}^{k}{\frac{n_k}{n}},\quad k=0,1,2,\cdots,L-1 P(rk)=j=0∑kpr(rj)=j=0∑knnk,k=0,1,2,⋯,L−1 - 使用变换函数
s k = T ( r k ) = D m ∑ j = 0 k n j n , k = 0 , 1 , 2 , ⋯ , L − 1 s_k=T(r_k)=D_m\sum_{j=0}^{k}\frac{n_j}{n},\quad k=0,1,2,\cdots,L-1 sk=T(rk)=Dmj=0∑knnj,k=0,1,2,⋯,L−1 - 将 s k s_k sk四舍五入,如果有相同的 ⌈ s k ⌉ \lceil s_k \rceil ⌈sk⌉,则合并。
代码实现
算法实现
myhisteq.m
function [g] = myhisteq(f)
[m, n] = size(f);
count = zeros(1, 256);
%% 统计每个灰度值出现的次数
for i = 1 : m
for j = 1 : n
count(1, f(i, j) + 1) = count(1, f(i, j) + 1) + 1;
end
end
%% 计算每个灰度出现的概率
p = zeros(1, 256);
for i = 1 : 256
p(1, i) = count(1, i) / (m*n);
end
%% 计算累计分布概率
t = zeros(1, 256);
t(1, 1) = p(1, 1);
for i = 2 : 256
t(1, i) = t(1, i-1) + p(1, i);
end
%% 计算分布函数
T = zeros(1, 256);
for i = 1 : 256
T(1,i) = t(1, i) * 255;
end
%% 四舍五入取整
T = round(T);
%% 灰度映射
g = double(f);
for i = 1 : m
for j = 1 : n
g(i, j) = T(1, g(i, j) + 1);
end
end
g = uint8(g);
说明:代码还可以进行优化。
测试代码
f = imread('seed-1.jpg');
subplot(2,2,1);
imshow(f);
title('原始图像');
subplot(2,2,2);
imhist(f);
title('直方图');
subplot(2,2,3);
g = myhisteq(f);
imshow(g);
title('均衡化后的结果')
subplot(2,2,4);
imhist(g);
title('均衡化后的直方图');
结果显示
matlab自带函数
histeq(g),其中g是灰度图像
测试代码
f = imread('seed-1.jpg');
subplot(2,2,1);
imshow(f);
title('原始图像');
subplot(2,2,2);
imhist(f);
title('直方图');
subplot(2,2,3);
g = histeq(f);
imshow(g);
title('均衡化后的结果')
subplot(2,2,4);
imhist(g);
title('均衡化后的直方图');
结果显示