直方图处理(Histogram Processing)

直方图处理(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 表示 L L 阶(level)数字图像(an L L -level digital image) f ( x , y ) f(x, y) 的亮度(intensity),则 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}

其中, n k n_{k} f f 中亮度为 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}

其中, M M N N 分别为图像的长、宽。

k p ( r k ) = 1 \sum_{k} p(r_{k}) = 1

2 直方图均衡(Histogram Equalization)

假设亮度 r [ 0 , L 1 ] r \in [0, L - 1] r = 0 r = 0 表示黑色(black); r = L 1 r = L - 1 表示白色(white)。给定变换(transformation) 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}

在区间 0 r L 1 0 \leq r \leq L - 1 上,假设 T T 满足:

  1. T T 为单调递增函数(monotonic increasing function)

  2. 0 T ( r ) L 1 0 \leq T(r) \leq 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}

T T 必需为严格单调递增函数(strictly monotonic increasing function),以满足 r r s s 间一一对应(one-to-one)的关系。

p r ( r ) p_{r}(r) p s ( s ) p_{s}(s) 分别表示亮度 r r s s 的概率密度函数(PDF)。由概率论(probability theory)可知,给定 p r ( r ) p_{r}(r) T ( r ) T(r) ,且 T ( r ) T(r) 连续可微,则 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}

图像处理中的重要变换方程(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}

方程右端为随机变量 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}

将方程(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_{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}

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}

在这里插入图片描述
在这里插入图片描述

3 直方图匹配(Histogram Matching、Histogram Specification)

给定输入图像,其亮度(intensity level)为 r r 、PDF为 p r ( r ) p_{r}(r) 。输出图像亮度、期望PDF分别记为 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}

定义函数 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}

则变量 z z 必需满足: 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}

直方图匹配过程

  1. 给定输入图像,计算 p r ( r ) p_{r}(r)

  2. 给定 p z ( z ) p_{z}(z) ,计算 G ( z ) G(z)

  3. 计算逆变换 z = G 1 ( s ) z = G^{-1}(s)

  4. 由方程(3-17)得到 s 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}

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 ) = s k (3-22) G(z_{q}) = s_{k} \tag {3-22}

z q = G 1 ( s k ) (3-23) z_{q} = G^{-1}(s_{k}) \tag {3-23}

实际应用中,无需计算 G 1 G^{-1} 。由于 z [ 0 , L 1 ] Z z \in [0, L - 1] \cap \Z ,计算 G G 的所有可能值并将结果存储于查找表中;然后给定一特定值,在表中查找最近匹配。通常 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

  1. 计算输入图像的直方图 P r ( r ) P_{r}(r) ,并代入方程(3-20),即将输入图像亮度映射为直方图均衡(histogram-equalized image)亮度。将结果 s k s_{k} 舍入到整数区间 [ 0 , L 1 ] [0, L - 1] (round the resulting values);

  2. 根据方程(3-21)计算 G ( z q ) G(z_{q}) ,并将结果舍入到整数区间 [ 0 , L 1 ] [0, L - 1] ,存入查找表(a lookup table);

  3. 根据查找表,为每个 s k s_{k} 分配一个 z q z_{q} ,使得 G ( z q ) G(z_{q}) s k s_{k} 最近,保存 s s z z 的映射。若存在多对一情况,则保留最小值;

  4. s k s_{k} 映射到 z q z_{q} 即可得到直方图匹配输出图像。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


# given p_r(r_k) in table 3.1 and specified histogram p_z(z_q),
# calculate the histogram matching

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}

在这里插入图片描述

发布了103 篇原创文章 · 获赞 162 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/zhaoyin214/article/details/103034870