直方图处理(Histogram Processing)
R.C. Gonzalez, Digital Image Processint (4th Edition) , Sec. 3.3 Histogram Processing
1 直方图
令
r
k
,
k
=
0
,
1
,
2
,
…
,
L
−
1
r_{k}, k = 0, 1, 2, \dots, L - 1
r k , k = 0 , 1 , 2 , … , L − 1 表示
L
L
L 阶(level)数字图像(an
L
L
L -level digital image)
f
(
x
,
y
)
f(x, y)
f ( x , y ) 的亮度(intensity),则
f
f
f 的非归一化直方图(unnormalized histogram)定义为:
h
(
r
k
)
=
n
k
,
for
k
=
1
,
2
,
…
,
L
−
1
(3-6)
h(r_{k}) = n_{k}, ~ \text{for } k = 1, 2, \dots, L - 1 \tag {3-6}
h ( r k ) = n k , for k = 1 , 2 , … , L − 1 ( 3 - 6 )
其中,
n
k
n_{k}
n k 为
f
f
f 中亮度为
r
k
r_{k}
r k 的像素(pixel)数量;亮度划分点(subdivisions of the intensity scale)称为直方图统计堆(histogram bins)。直方图(normalized histogram、histograms、image histograms):
p
(
r
k
)
=
h
(
r
k
)
M
N
=
n
k
M
N
(3-7)
p(r_{k}) = \frac{h(r_{k})}{MN} = \frac{n_{k}}{MN} \tag {3-7}
p ( r k ) = M N h ( r k ) = M N n k ( 3 - 7 )
其中,
M
M
M 、
N
N
N 分别为图像的长、宽。
∑
k
p
(
r
k
)
=
1
\sum_{k} p(r_{k}) = 1
k ∑ p ( r k ) = 1
2 直方图均衡(Histogram Equalization)
假设亮度
r
∈
[
0
,
L
−
1
]
r \in [0, L - 1]
r ∈ [ 0 , L − 1 ] ,
r
=
0
r = 0
r = 0 表示黑色(black);
r
=
L
−
1
r = L - 1
r = L − 1 表示白色(white)。给定变换(transformation)
T
T
T (映射,intensity mappings),
s
=
T
(
r
)
0
≤
r
≤
L
−
1
(3-8)
s = T(r) \quad 0 \leq r \leq L - 1 \tag {3-8}
s = T ( r ) 0 ≤ r ≤ L − 1 ( 3 - 8 )
在区间
0
≤
r
≤
L
−
1
0 \leq r \leq L - 1
0 ≤ r ≤ L − 1 上,假设
T
T
T 满足:
T
T
T 为单调递增函数(monotonic increasing function)
0
≤
T
(
r
)
≤
L
−
1
0 \leq T(r) \leq L - 1
0 ≤ T ( r ) ≤ L − 1
若求逆变换(inverse transformation)
r
=
T
−
1
(
s
)
0
≤
s
≤
L
−
1
(3-9)
r = T^{-1}(s) \quad 0 \leq s \leq L - 1 \tag {3-9}
r = T − 1 ( s ) 0 ≤ s ≤ L − 1 ( 3 - 9 )
则
T
T
T 必需为严格单调递增函数(strictly monotonic increasing function),以满足
r
r
r 与
s
s
s 间一一对应(one-to-one)的关系。
p
r
(
r
)
p_{r}(r)
p r ( r ) 、
p
s
(
s
)
p_{s}(s)
p s ( s ) 分别表示亮度
r
r
r 、
s
s
s 的概率密度函数(PDF)。由概率论(probability theory)可知,给定
p
r
(
r
)
p_{r}(r)
p r ( r ) 、
T
(
r
)
T(r)
T ( r ) ,且
T
(
r
)
T(r)
T ( r ) 连续可微,则
s
s
s 的PDF为:
p
s
(
s
)
=
p
r
(
r
)
∣
d
r
d
s
∣
(3-10)
p_{s}(s) = p_{r}(r) \left| \frac{d r}{d s} \right| \tag {3-10}
p s ( s ) = p r ( r ) ∣ ∣ ∣ ∣ d s d r ∣ ∣ ∣ ∣ ( 3 - 1 0 )
图像处理中的重要变换方程(transformation function) :
s
=
T
(
r
)
=
(
L
−
1
)
∫
0
r
p
r
(
w
)
d
w
(3-11)
s = T(r) = (L - 1) \int_{0}^{r} p_{r}(w) dw \tag {3-11}
s = T ( r ) = ( L − 1 ) ∫ 0 r p r ( w ) d w ( 3 - 1 1 )
方程右端为随机变量
r
r
r 的累积分布函数(cumulative distribution function,CDF)。易知,方程(3-11)同时满足条件(1)、(2)。根据莱布尼茨法则(Leibniz’s rule: the derivative of a definite integral with respect to its upper limit is the integrand evaluated at the limit),
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
(
r
)
(3-12)
\begin{aligned} \frac{ds}{dr} & = \frac{d T(r)}{dr} \\ & = (L - 1) \frac{d}{dr} \int_{0}^{r} p_{r}(w) dw \\ & = (L - 1) p_{r}(r) \end{aligned} \tag {3-12}
d r d s = d r d T ( r ) = ( L − 1 ) d r d ∫ 0 r p r ( w ) d w = ( L − 1 ) p r ( r ) ( 3 - 1 2 )
将方程(3-12)代入方程(3-10),
p
s
(
s
)
=
p
r
(
r
)
∣
d
r
d
s
∣
=
p
r
(
r
)
∣
1
(
L
−
1
)
p
r
(
r
)
∣
=
1
(
L
−
1
)
,
0
≤
s
≤
L
−
1
(3-13)
\begin{aligned} p_{s}(s) & = p_{r}(r) \left| \frac{d r}{d s} \right| \\ & = p_{r}(r) \left| \frac{1}{(L - 1) p_{r}(r)} \right| \\ & = \frac{1}{(L - 1)} \end{aligned}, \quad 0 \leq s \leq L - 1 \tag {3-13}
p s ( s ) = p r ( r ) ∣ ∣ ∣ ∣ d s d r ∣ ∣ ∣ ∣ = p r ( r ) ∣ ∣ ∣ ∣ ( L − 1 ) p r ( r ) 1 ∣ ∣ ∣ ∣ = ( L − 1 ) 1 , 0 ≤ s ≤ L − 1 ( 3 - 1 3 )
即
p
s
(
s
)
p_{s}(s)
p s ( s ) 服从均匀分布(uniform probability density function)
对于离散值(discrete values),
P
r
(
r
k
)
=
n
k
M
N
(3-14)
P_{r}(r_{k}) = \frac{n_{k}}{MN} \tag {3-14}
P r ( r k ) = M N n k ( 3 - 1 4 )
s
k
=
T
(
r
k
)
=
(
L
−
1
)
∑
j
=
0
k
P
r
(
r
j
)
,
k
=
0
,
1
,
…
,
L
−
1
(3-15)
s_{k} = T(r_{k}) = (L - 1) \sum_{j = 0}^{k} P_{r}(r_{j}), ~ k = 0, 1, \dots, L - 1 \tag {3-15}
s k = T ( r k ) = ( L − 1 ) j = 0 ∑ k P r ( r j ) , k = 0 , 1 , … , L − 1 ( 3 - 1 5 )
3 直方图匹配(Histogram Matching、Histogram Specification)
给定输入图像,其亮度(intensity level)为
r
r
r 、PDF为
p
r
(
r
)
p_{r}(r)
p r ( r ) 。输出图像亮度、期望PDF分别记为
z
z
z (给定)、
p
z
(
z
)
p_{z}(z)
p z ( z ) ,
s
=
T
(
r
)
=
(
L
−
1
)
∫
0
r
p
r
(
w
)
d
w
(3-17)
s = T(r) = (L - 1) \int_{0}^{r} p_{r}(w) dw \tag {3-17}
s = T ( r ) = ( L − 1 ) ∫ 0 r p r ( w ) d w ( 3 - 1 7 )
定义函数
G
G
G
G
(
z
)
=
(
L
−
1
)
∫
0
z
p
z
(
v
)
d
v
=
s
(3-18)
G(z) = (L - 1) \int_{0}^{z} p_{z}(v) dv = s \tag {3-18}
G ( z ) = ( L − 1 ) ∫ 0 z p z ( v ) d v = s ( 3 - 1 8 )
则变量
z
z
z 必需满足:
G
(
z
)
=
s
=
T
(
r
)
G(z) = s = T(r)
G ( z ) = s = T ( r ) ,即
z
=
G
−
1
(
s
)
=
G
−
1
[
T
(
r
)
]
(3-19)
z = G^{-1}(s) = G^{-1}[T(r)] \tag {3-19}
z = G − 1 ( s ) = G − 1 [ T ( r ) ] ( 3 - 1 9 )
直方图匹配过程
给定输入图像,计算
p
r
(
r
)
p_{r}(r)
p r ( r ) ;
给定
p
z
(
z
)
p_{z}(z)
p z ( z ) ,计算
G
(
z
)
G(z)
G ( z ) ;
计算逆变换
z
=
G
−
1
(
s
)
z = G^{-1}(s)
z = G − 1 ( s )
由方程(3-17)得到
s
s
s ,并计算
z
=
G
−
1
(
s
)
z = G^{-1}(s)
z = G − 1 ( s ) 。
对于离散值(discrete values),
s
k
=
T
(
r
k
)
=
(
L
−
1
)
∑
j
=
0
k
P
r
(
r
j
)
,
k
=
0
,
1
,
…
,
L
−
1
(3-20)
s_{k} = T(r_{k}) = (L - 1) \sum_{j = 0}^{k} P_{r}(r_{j}), ~ k = 0, 1, \dots, L - 1 \tag {3-20}
s k = T ( r k ) = ( L − 1 ) j = 0 ∑ k P r ( r j ) , k = 0 , 1 , … , L − 1 ( 3 - 2 0 )
G
(
z
q
)
=
(
L
−
1
)
∑
i
=
0
q
P
z
(
z
i
)
(3-21)
G(z_{q}) = (L - 1) \sum_{i = 0}^{q} P_{z}(z_{i}) \tag {3-21}
G ( z q ) = ( L − 1 ) i = 0 ∑ q P z ( z i ) ( 3 - 2 1 )
G
(
z
q
)
=
s
k
(3-22)
G(z_{q}) = s_{k} \tag {3-22}
G ( z q ) = s k ( 3 - 2 2 )
z
q
=
G
−
1
(
s
k
)
(3-23)
z_{q} = G^{-1}(s_{k}) \tag {3-23}
z q = G − 1 ( s k ) ( 3 - 2 3 )
实际应用中,无需计算
G
−
1
G^{-1}
G − 1 。由于
z
∈
[
0
,
L
−
1
]
∩
Z
z \in [0, L - 1] \cap \Z
z ∈ [ 0 , L − 1 ] ∩ Z ,计算
G
G
G 的所有可能值并将结果存储于查找表中;然后给定一特定值,在表中查找最近匹配。通常
z
q
=
q
z_{q} = q
z q = q 。
离散直方图匹配过程
给定输入图像及待匹配直方图
p
z
(
z
i
)
,
i
=
0
,
1
,
…
,
L
−
1
p_{z}(z_{i}), i = 0, 1, \dots, L - 1
p z ( z i ) , i = 0 , 1 , … , L − 1 ,
计算输入图像的直方图
P
r
(
r
)
P_{r}(r)
P r ( r ) ,并代入方程(3-20),即将输入图像亮度映射为直方图均衡(histogram-equalized image)亮度。将结果
s
k
s_{k}
s k 舍入到整数区间
[
0
,
L
−
1
]
[0, L - 1]
[ 0 , L − 1 ] (round the resulting values);
根据方程(3-21)计算
G
(
z
q
)
G(z_{q})
G ( z q ) ,并将结果舍入到整数区间
[
0
,
L
−
1
]
[0, L - 1]
[ 0 , L − 1 ] ,存入查找表(a lookup table);
根据查找表,为每个
s
k
s_{k}
s k 分配一个
z
q
z_{q}
z q ,使得
G
(
z
q
)
G(z_{q})
G ( z q ) 与
s
k
s_{k}
s k 最近,保存
s
s
s 到
z
z
z 的映射。若存在多对一情况,则保留最小值;
将
s
k
s_{k}
s k 映射到
z
q
z_{q}
z q 即可得到直方图匹配输出图像。
import numpy as np
import matplotlib. pyplot as plt
L = 8
x = np. linspace( start= 0 , stop= L - 1 , num= L)
p_r = np. asarray( [ 0.19 , 0.25 , 0.21 , 0.16 , 0.08 , 0.06 , 0.03 , 0.02 ] )
p_z = np. asarray( [ 0.0 , 0.0 , 0.0 , 0.15 , 0.20 , 0.30 , 0.20 , 0.15 ] )
T_r = np. round ( np. cumsum( a= p_r) * ( L - 1 ) ) . astype( np. uint8)
print ( "s_k: {}" . format ( T_r) )
G_z = np. round ( np. cumsum( a= p_z) * ( L - 1 ) ) . astype( np. uint8)
print ( "G_z: {}" . format ( G_z) )
p_s = np. zeros( shape= ( L, ) )
for idx in range ( L) :
p_s[ idx] = np. sum ( p_r[ T_r == idx] )
G_z_inv = { }
for s_k in T_r:
G_z_inv[ s_k] = np. argmin( np. abs ( G_z - s_k) )
print ( "mapping s_k -> z_q: {}" . format ( G_z_inv) )
p_z_matched = np. zeros( shape= ( L, ) )
for idx in range ( L) :
if G_z_inv. get( idx) :
p_z_matched[ G_z_inv. get( idx) ] += p_s[ idx]
fig = plt. figure( figsize= ( 10 , 16 ) )
ax = fig. add_subplot( 3 , 2 , 1 )
ax. bar( x, p_r)
ax. set_xlabel( "$r_{k}$" )
ax. set_ylabel( "$p_{r}(r_{k})$" )
ax = fig. add_subplot( 3 , 2 , 2 )
ax. bar( x, p_z)
ax. set_xlabel( "$z_{q}$" )
ax. set_ylabel( "$p_{z}(z_{q})$" )
ax = fig. add_subplot( 3 , 2 , 3 )
ax. bar( x, T_r)
ax. set_title( "$T(r)$" )
ax. set_xlabel( "$r_{k}$" )
ax. set_ylabel( "$s_{k}$" )
ax = fig. add_subplot( 3 , 2 , 4 )
ax. bar( x, p_s)
ax. set_xlabel( "$s_{k}$" )
ax. set_ylabel( "$p_{s}(s_{k})$" )
ax = fig. add_subplot( 3 , 2 , 5 )
ax. bar( x, G_z)
ax. set_title( "$G_{z}$" )
ax. set_xlabel( "$z_{q}$" )
ax. set_ylabel( "$s_{k}$" )
ax = fig. add_subplot( 3 , 2 , 6 )
ax. bar( x, p_z_matched)
ax. set_xlabel( "$z_{q}$" )
ax. set_ylabel( "$p_{z}(z_{q})$" )
plt. show( )
s_k: [1 3 5 6 6 7 7 7]
G_z: [0 0 0 1 2 5 6 7]
mapping s_k -> z_q: {1: 3, 3: 4, 5: 5, 6: 6, 7: 7}