实验六 - 图像阈值分割

学号 姓名 日期
1160300625 李一鸣 2018 年 12 月 7 日

相关性检测

相关函数(Correlation)

自相关也称为序列相关,是给定序列与其自身的相关性,是时滞(time lag)的函数。互相关是一个更通用的术语,它给出了两个不同序列之间的相关性与时滞的函数关系。

互相关函数

给定两个随机序列 x=(...,x2,x1,x0,x1,x2,...)\mathbf{x} = (..., -x_2, -x_1, x_0, x_1, x_2, ...)y=(...,y2,y1,y0,y1,y2,...)\mathbf{y} = (..., -y_2, -y_1, y_0, y_1, y_2, ...),互相关函数在时滞 ii 时的值为:

(1)Rxy(i)=Corr(x,y)i=j=xjyj+iR_{xy}(i) = Corr(x, y)_i = \sum_{j=-\infty}^{\infty}x_jy_{j+i}^* \tag{1}

其中 yy^* 表示 yy 的共轭,时滞的物理意义体现在求相关函数时 xxyy 错开的时间点数。

自相关函数

(1)(1) 式中,令 y=xy = x,就是自相关函数了,形式如下:

(2)Rxx(i)=Corr(x,x)i=j=xjxj+iR_{xx}(i) = Corr(x, x)_i = \sum_{j=-\infty}^{\infty}x_jx_{j+i}^* \tag{2}

我们可以使用循环计算上面的相关函数。

计算方法

计算过程解释如下:

(3)[1,2,3,4][0,0,0,1]= 4,i=3[1,2,3,4][0,0,1,2]=11,i=2[1,2,3,4][0,1,2,3]=20,i=1[1,2,3,4][1,2,3,4]=30,i=0[1,2,3,4][2,3,4,0]=20,i=1[1,2,3,4][3,4,0,0]=11,i=2[1,2,3,4][4,0,0,0]= 4,i=3\begin{aligned} [1, 2, 3, 4] \cdot [0, 0, 0, 1] &= \ 4, i = -3\\ [1, 2, 3, 4] \cdot [0, 0, 1, 2] &= 11, i = -2 \\ [1, 2, 3, 4] \cdot [0, 1, 2, 3] &= 20, i = -1 \\ [1, 2, 3, 4] \cdot [1, 2, 3, 4] &= 30, i = 0 \\ [1, 2, 3, 4] \cdot [2, 3, 4, 0] &= 20, i = 1 \\ [1, 2, 3, 4] \cdot [3, 4, 0, 0] &= 11, i = 2 \\ [1, 2, 3, 4] \cdot [4, 0, 0, 0] &= \ 4, i = 3 \end{aligned} \tag{3}

注:在 numpy 中,相关函数 correlate 默认使用 valid,卷积 convolve 默认使用 full

与卷积的区别

(4)(av)[n]=m=a[m]v[nm](a * v) [n] = \sum_{m = -\infty}^{\infty} a[m] v[n - m] \tag{4}

或者说:

(5)convolvexy(i)=m=x(m)y(im)convolve_{xy}(i) = \sum_{m=-\infty}^{\infty}x(m)y(i-m) \tag{5}

计算过程的解释如下:

(6)[1,2,3,4][1,0,0,0]= 1,i=0[1,2,3,4][2,1,0,0]= 4,i=1[1,2,3,4][3,2,1,0]=10,i=2[1,2,3,4][4,3,2,1]=20,i=3[1,2,3,4][0,4,3,2]=25,i=4[1,2,3,4][0,0,4,3]=24,i=5[1,2,3,4][0,0,0,4]= 16,i=6\begin{aligned} [1, 2, 3, 4] \cdot [1, 0, 0, 0] &= \ 1, i = 0\\ [1, 2, 3, 4] \cdot [2, 1, 0, 0] &= \ 4, i = 1 \\ [1, 2, 3, 4] \cdot [3, 2, 1, 0] &= 10, i = 2 \\ [1, 2, 3, 4] \cdot [4, 3, 2, 1] &= 20, i = 3 \\ [1, 2, 3, 4] \cdot [0, 4, 3, 2] &= 25, i = 4 \\ [1, 2, 3, 4] \cdot [0, 0, 4, 3] &= 24, i = 5 \\ [1, 2, 3, 4] \cdot [0, 0, 0, 4] &= \ 16, i = 6 \end{aligned} \tag{6}

可以看到对于长度为 NN 的序列,使用 full 参数求得的相关函数中 i[(N1),(N1)]i \in [-(N-1), (N-1)],求得的卷积中 i[0,2(N1)]i \in [0, 2(N-1)],长度都为 2N12N-1。不难得出,如果是两个长度为 MMNN 的序列,将会将较短的序列补 0 并对齐,最终产生的序列长度为 M+N1M+N-1

如果使用 same 参数将得到长度为 NN 的序列,使用 valid 将得到长度为 11 的序列。如果是两个长度为 MMNN 的序列,将会将较短的序列补 0 并对齐,最终产生的序列长度分别为 max{M,N}\max\{M, N\}min{M,N}+1\min\{M, N\}+1

总结一下三种计算方式的差别

归一化

通常,在计算自相关函数时,是没有必要进行归一化的,因为计算的结果只进行前后的横向比较,它们的值是相对的大小。比如说 (3)(3) 式中,输入同时变为原来的两倍,结果也只是每个值都做相应的增大。

但是,当两个信号之间进行比较时,就会出现问题。[0,0,0,0][0, 0, 0, 0][255,255,255,255][255, 255, 255, 255] 这两个信号分别与 [128,128,128,128][128, 128, 128, 128] 按照 (1)(1) 式计算互相关函数,得到的结果显然会是后者大于前者,但是并不能说明后者比前者更接近于 [128,128,128,128][128, 128, 128, 128]

因此,我们将使用皮尔森相关系数衡量两个信号之间的相关性,以进行中心化和归一化,给定随机变量 XXYY

(12)ρX,Y=E[(XμX)(YμY)]σXσY\rho _{X,Y}={\frac {\operatorname {E} [(X-\mu _{X})(Y-\mu _{Y})]}{\sigma _{X}\sigma _{Y}}} \tag{12}

更加具体的来说,对于已知的样本序列,样本相关系数为

(13)r=i=1n(xixˉ)(yiyˉ)i=1n(xixˉ)2i=1n(yiyˉ)2{\displaystyle r={\frac {\sum _{i=1}^{n}(x_{i}-{\bar {x}})(y_{i}-{\bar {y}})}{{\sqrt {\sum _{i=1}^{n}(x_{i}-{\bar {x}})^{2}}}{\sqrt {\sum _{i=1}^{n}(y_{i}-{\bar {y}})^{2}}}}}} \tag{13}

这样 rr 就永远在 [1,1][-1, 1] 区间之内了。

实验结果

图像噪声阈值检测

预处理

选取下面的照片作为输入数据:

fowler

图一 原图 - 维度为 3707 x 8192 的彩色图片

由于:

(7)3000=30×1008000=80×1003000 = 30 \times 100 \\ 8000 = 80 \times 100 \tag{7}

我们可以从中产生 30×80=240030 \times 80 = 2400100×100100 \times 100 的小图片(M=30,N=80,ht=100,wt=100M = 30, N = 80, ht=100, wt=100),它们的左上角在原图中的坐标分别为:

(8)((0,0)(0,100)(0,200)(0,7900)(100,0)(100,100)(100,200)(100,7900)(200,0)(200,100)(200,200)(200,7900)(2900,0)(2900,100)(2900,200)(2900,7900))30×80\begin{pmatrix} (0, 0) & (0, 100) & (0, 200) & \cdots & (0, 7900) \\ (100, 0) & (100, 100) & (100, 200) & \cdots & (100, 7900) \\ (200, 0) & (200, 100) & (200, 200) & \cdots & (200, 7900) \\ \vdots & \vdots & \vdots & \cdots & \vdots \\ (2900, 0) & (2900, 100) & (2900, 200) & \cdots & (2900, 7900) \\ \end{pmatrix}_{30 \times 80} \tag{8}

定义数组 H[30][80][100][100][3]H[30][80][100][100][3],用 H[i][j]H[i][j] 表示这 30×8030 \times 80 张小图片中的一张,是一个 100×100100 \times 100 的数组,用来存储每一个像素点,每个像素点又由 3 个通道组成,为了简单起见,我们将只使用 Red 通道的数据,即 H[i][j][:,:,0],将其记为 I[30][80][100][100]I[30][80][100][100]

加入高斯噪声

对于得到的每幅图片,加入服从 (μ,σ2)=(0,502)(\mu, \sigma^2) = (0, 50^2) 高斯分布的高斯噪声,每幅图片有 100×100100 \times 100 像素,因此生成的噪声长度也为 100×100100 \times 100,将其记为矩阵 I[30][80][100][100]I[30][80][100][100]。得到的结果记为 II',有:

(9)I[i][j]=I[i][j]+w[i][j]I'[i][j] = I[i][j] + w[i][j] \tag{9}

相关性检测

  1. 每幅未加噪声的小图像与噪声的相关性 ss

    (10)s[i][j]=(I[i][j],w[i][j])s[i][j] = 相关性(I[i][j], w[i][j]) \tag{10}

  2. 每幅加如噪声之后的小图像与噪声的相关性 rr

    (11)r[i][j]=(I[i][j],w[i][j])r[i][j] = 相关性(I'[i][j], w[i][j]) \tag{11}

相关性的计算参见式 (13)(13)

画出 s 和 r 的分布图像如下:

s-r.svg

图二 相关性检测结果

可以看到:

  1. 没有噪声的图像与噪声的相关性近似服从正态分布,
  2. 有噪声的图像和噪声的相关性 r 远大于没有噪声的图像和噪声的相关性 s

最后可以确定检测阈值 T=0.2T = 0.2,当有一个新的图片时,通过与高斯噪声计算相关性 rr,可以得到其是否加入了噪声:

PSNR

峰值信噪比(peak signal-to-noise ratio (PSNR))用来衡量原始图像和压缩图像之间的质量测量值。PSNR越高,压缩或重建图像的质量越好。

(14)MSE=1mni=0m1j=0n1[I(i,j)K(i,j)]2{\mathit {MSE}}={\frac {1}{m\,n}}\sum _{{i=0}}^{{m-1}}\sum _{{j=0}}^{{n-1}}[I(i,j)-K(i,j)]^{2} \tag{14}

(15)PSNR=10log10(MAXI2MSE)=20log10(MAXIMSE)=20log10(MAXI)10log10(MSE){\begin{aligned}{\mathit {PSNR}}&=10\cdot \log _{{10}}\left({\frac {{\mathit {MAX}}_{I}^{2}}{{\mathit {MSE}}}}\right)\\&=20\cdot \log _{{10}}\left({\frac {{\mathit {MAX}}_{I}}{{\sqrt {{\mathit {MSE}}}}}}\right)\\&=20\cdot \log _{{10}}\left({{\mathit {MAX}}_{I}}\right)-10\cdot \log _{{10}}\left({{{\mathit {MSE}}}}\right)\end{aligned}} \tag{15}

SSIM

结构相似性指标(structural similarity index,SSIM index)是一种用以衡量两张数位影像相似程度的指标。当两张影像其中一张为无失真影像,另一张为失真后的影像,二者的结构相似性可以看成是失真影像的影像品质衡量指标。相较于传统所使用的影像品质衡量指标,像是峰值信噪比(英文:PSNR),结构相似性在影像品质的衡量上更能符合人眼对影像品质的判断。

计算公式如下:

(16)SSIM(x,y)=(2μxμy+c1)(2σxy+c2)(μx2+μy2+c1)(σx2+σy2+c2){{SSIM}}(x,y)={\frac {(2\mu _{x}\mu _{y}+c_{1})(2\sigma _{{xy}}+c_{2})}{(\mu _{x}^{2}+\mu _{y}^{2}+c_{1})(\sigma _{x}^{2}+\sigma _{y}^{2}+c_{2})}} \tag{16}

直接调用 skimage.measure.compare_ssim 进行计算。

计算结果如下:

大津二值化法

大津二值化法(Otsu's method)用来自动对基于聚类的图像进行二值化,[1] 或者说,将一个灰度图像退化为二值图像。该算法以大津展之命名。算法假定该图像根据双模直方图(前景像素和背景像素)把包含两类像素,于是它要计算能将两类分开的最佳阈值,使得它们的类内方差最小;由于两两平方距离恒定,所以即它们的类间方差最大。因此,大津二值化法粗略的来说就是一维 Fisher 判别分析的离散化模拟。

在大津算法中,我们穷举搜索能使类内方差最小的阈值,定义为两个类的方差的加权和:

(17)σw2(t)=ω1(t)σ12(t)+ω2(t)σ22(t)\sigma^2_w(t)=\omega_1(t)\sigma^2_1(t)+\omega_2(t)\sigma^2_2(t) \tag{17}

权重 ωi\omega_i 是被阈值 tt 分开的两个类的概率:而 σi2\sigma^2_ i 是这两个类的方差。

大津证明了最小化类内方差和最大化类间方差是相同的:

(18)σb2(t)=σ2σw2(t)=ω1(t)ω2(t)[μ1(t)μ2(t)]2\sigma^2_b(t)=\sigma^2-\sigma^2_w(t)=\omega_1(t)\omega_2(t)\left[\mu_1(t)-\mu_2(t)\right]^2 \tag{18}

式中,μ\mu 为每一类的中心点。

算法流程如下:

  1. 计算每个强度级(0-255)的直方图、概率密度
  2. 初始化 ωi(0),μi(0)\omega_i(0), \mu_i(0)
  3. 遍历所有可能的阈值 t=1t = 1 \ldots 最大强度
    1. 更新 ωi\omega_iμi\mu_i
    2. 计算 σb2(t)\sigma^2_b(t)
  4. 找到最大的 σb2(t)\sigma^2_{b}(t) 对应的阈值 TT,即为所求

同样使用图一的红色通道作为输入,利用大津二值化法,得到下面的结果:

otsu

图三 otsu 二值划分结果

计算结果如下:

总结

  1. 深入理解了自相关函数、互相关函数、卷积等相关概念
  2. 了解了 Pearson 相关系数的得来、原理等等
  3. 实现了如向质量压缩评估计算算法
  4. 实现了 otsu 图像二值化分算法

参考文献

  1. Constructing the Auto Correlation Matrix in Matlab
  2. 应该如何理解和处理自相关(序列相关)? | 知乎
  3. 自相关函数 | 维基百科
  4. Survey of Methods to Compute Linear Convolution
  5. numpy.correlate & numpy.convolve
  6. Understanding NumPy's Convolve
  7. Pearson correlation coefficient | Wikipedia
  8. Autocorrelation | Wikipedia
  9. Cross correlation | Wikipedia
  10. Estimate Autocorrelation using Python
  11. Cosine similarity, Pearson correlation, and OLS coefficient
  12. Plot histogram and Probability Density Function (PDF) in matplotlib/Python
  13. PSNR
  14. How to Calculate PSNR value of two images using Python and OpenCv?
  15. Structural similarity | Wikipedia
  16. Structural similarity index
  17. Otsu's method