实验六 - 图像阈值分割
学号 |
姓名 |
日期 |
1160300625 |
李一鸣 |
2018 年 12 月 7 日 |
相关性检测
相关函数(Correlation)
自相关也称为序列相关,是给定序列与其自身的相关性,是时滞(time lag)的函数。互相关是一个更通用的术语,它给出了两个不同序列之间的相关性与时滞的函数关系。
互相关函数
给定两个随机序列 x=(...,−x2,−x1,x0,x1,x2,...) 和 y=(...,−y2,−y1,y0,y1,y2,...),互相关函数在时滞 i 时的值为:
Rxy(i)=Corr(x,y)i=j=−∞∑∞xjyj+i∗(1)
其中 y∗ 表示 y 的共轭,时滞的物理意义体现在求相关函数时 x 和 y 错开的时间点数。
自相关函数
在 (1) 式中,令 y=x,就是自相关函数了,形式如下:
Rxx(i)=Corr(x,x)i=j=−∞∑∞xjxj+i∗(2)
我们可以使用循环计算上面的相关函数。
计算方法
-
numpy: numpy.correlate(x, x, 'full')
Cross-correlation of two 1-dimensional sequences.
This function computes the correlation as generally defined in signal processing texts:
c_{av}[k] = sum_n a[n+k] * conj(v[n])
with a and v sequences being zero-padded where necessary and conj being the conjugate.
-
MATLAB: xcorr(x)
-
输入:x=[1,2,3,4]
-
调用 numpy.correlate(x, x, 'full')
,输出:[ 4 11 20 30 20 11 4]
-
调用 numpy.correlate(x, x, 'same')
,输出:[11 20 30 20]
-
调用 numpy.correlate(x, x, 'valid')
,输出:[30]
计算过程解释如下:
[1,2,3,4]⋅[0,0,0,1][1,2,3,4]⋅[0,0,1,2][1,2,3,4]⋅[0,1,2,3][1,2,3,4]⋅[1,2,3,4][1,2,3,4]⋅[2,3,4,0][1,2,3,4]⋅[3,4,0,0][1,2,3,4]⋅[4,0,0,0]= 4,i=−3=11,i=−2=20,i=−1=30,i=0=20,i=1=11,i=2= 4,i=3(3)
注:在 numpy
中,相关函数 correlate
默认使用 valid
,卷积 convolve
默认使用 full
。
与卷积的区别
(a∗v)[n]=m=−∞∑∞a[m]v[n−m](4)
或者说:
convolvexy(i)=m=−∞∑∞x(m)y(i−m)(5)
- 输入:x=[1,2,3,4]
- 调用
numpy.convolve(x, x, 'full')
,输出:[ 1 4 10 20 25 24 16]
- 调用
numpy.convolve(x, x, 'same')
,输出:[ 4 10 20 25]
- 调用
numpy.convolve(x, x, 'valid')
,输出:[20]
计算过程的解释如下:
[1,2,3,4]⋅[1,0,0,0][1,2,3,4]⋅[2,1,0,0][1,2,3,4]⋅[3,2,1,0][1,2,3,4]⋅[4,3,2,1][1,2,3,4]⋅[0,4,3,2][1,2,3,4]⋅[0,0,4,3][1,2,3,4]⋅[0,0,0,4]= 1,i=0= 4,i=1=10,i=2=20,i=3=25,i=4=24,i=5= 16,i=6(6)
可以看到对于长度为 N 的序列,使用 full
参数求得的相关函数中 i∈[−(N−1),(N−1)],求得的卷积中 i∈[0,2(N−1)],长度都为 2N−1。不难得出,如果是两个长度为 M 和 N 的序列,将会将较短的序列补 0 并对齐,最终产生的序列长度为 M+N−1。
如果使用 same
参数将得到长度为 N 的序列,使用 valid
将得到长度为 1 的序列。如果是两个长度为 M 和 N 的序列,将会将较短的序列补 0 并对齐,最终产生的序列长度分别为 max{M,N}、min{M,N}+1。
总结一下三种计算方式的差别:
valid
: 没有任何补 0 的操作,直接在完全对齐时进行计算
full
: 对所有可能的对齐都进行计算,当超出边界时,用 0 来补齐
same
: 只是对 full
得到的结果从中间偏前进行了截断,以产生和最长输入长度相同的结果
归一化
通常,在计算自相关函数时,是没有必要进行归一化的,因为计算的结果只进行前后的横向比较,它们的值是相对的大小。比如说 (3) 式中,输入同时变为原来的两倍,结果也只是每个值都做相应的增大。
但是,当两个信号之间进行比较时,就会出现问题。[0,0,0,0] 和 [255,255,255,255] 这两个信号分别与 [128,128,128,128] 按照 (1) 式计算互相关函数,得到的结果显然会是后者大于前者,但是并不能说明后者比前者更接近于 [128,128,128,128]。
因此,我们将使用皮尔森相关系数衡量两个信号之间的相关性,以进行中心化和归一化,给定随机变量 X 和 Y,
ρX,Y=σXσYE[(X−μX)(Y−μY)](12)
更加具体的来说,对于已知的样本序列,样本相关系数为
r=∑i=1n(xi−xˉ)2∑i=1n(yi−yˉ)2∑i=1n(xi−xˉ)(yi−yˉ)(13)
这样 r 就永远在 [−1,1] 区间之内了。
实验结果
图像噪声阈值检测
预处理
选取下面的照片作为输入数据:

图一 原图 - 维度为 3707 x 8192 的彩色图片
由于:
3000=30×1008000=80×100(7)
我们可以从中产生 30×80=2400 张 100×100 的小图片(M=30,N=80,ht=100,wt=100),它们的左上角在原图中的坐标分别为:
⎝⎜⎜⎜⎜⎜⎛(0,0)(100,0)(200,0)⋮(2900,0)(0,100)(100,100)(200,100)⋮(2900,100)(0,200)(100,200)(200,200)⋮(2900,200)⋯⋯⋯⋯⋯(0,7900)(100,7900)(200,7900)⋮(2900,7900)⎠⎟⎟⎟⎟⎟⎞30×80(8)
定义数组 H[30][80][100][100][3],用 H[i][j] 表示这 30×80 张小图片中的一张,是一个 100×100 的数组,用来存储每一个像素点,每个像素点又由 3 个通道组成,为了简单起见,我们将只使用 Red 通道的数据,即 H[i][j][:,:,0]
,将其记为 I[30][80][100][100]。
加入高斯噪声
对于得到的每幅图片,加入服从 (μ,σ2)=(0,502) 高斯分布的高斯噪声,每幅图片有 100×100 像素,因此生成的噪声长度也为 100×100,将其记为矩阵 I[30][80][100][100]。得到的结果记为 I′,有:
I′[i][j]=I[i][j]+w[i][j](9)
相关性检测
-
每幅未加噪声的小图像与噪声的相关性 s
s[i][j]=相关性(I[i][j],w[i][j])(10)
-
每幅加如噪声之后的小图像与噪声的相关性 r
r[i][j]=相关性(I′[i][j],w[i][j])(11)
相关性的计算参见式 (13)。
画出 s 和 r 的分布图像如下:

图二 相关性检测结果
可以看到:
- 没有噪声的图像与噪声的相关性近似服从正态分布,
- 有噪声的图像和噪声的相关性 r 远大于没有噪声的图像和噪声的相关性 s
最后可以确定检测阈值 T=0.2,当有一个新的图片时,通过与高斯噪声计算相关性 r,可以得到其是否加入了噪声:
PSNR
峰值信噪比(peak signal-to-noise ratio (PSNR))用来衡量原始图像和压缩图像之间的质量测量值。PSNR越高,压缩或重建图像的质量越好。
MSE=mn1i=0∑m−1j=0∑n−1[I(i,j)−K(i,j)]2(14)
PSNR=10⋅log10(MSEMAXI2)=20⋅log10(MSEMAXI)=20⋅log10(MAXI)−10⋅log10(MSE)(15)
SSIM
结构相似性指标(structural similarity index,SSIM index)是一种用以衡量两张数位影像相似程度的指标。当两张影像其中一张为无失真影像,另一张为失真后的影像,二者的结构相似性可以看成是失真影像的影像品质衡量指标。相较于传统所使用的影像品质衡量指标,像是峰值信噪比(英文:PSNR),结构相似性在影像品质的衡量上更能符合人眼对影像品质的判断。
计算公式如下:
SSIM(x,y)=(μx2+μy2+c1)(σx2+σy2+c2)(2μxμy+c1)(2σxy+c2)(16)
直接调用 skimage.measure.compare_ssim 进行计算。
计算结果如下:
大津二值化法
大津二值化法(Otsu's method)用来自动对基于聚类的图像进行二值化,[1] 或者说,将一个灰度图像退化为二值图像。该算法以大津展之命名。算法假定该图像根据双模直方图(前景像素和背景像素)把包含两类像素,于是它要计算能将两类分开的最佳阈值,使得它们的类内方差最小;由于两两平方距离恒定,所以即它们的类间方差最大。因此,大津二值化法粗略的来说就是一维 Fisher 判别分析的离散化模拟。
在大津算法中,我们穷举搜索能使类内方差最小的阈值,定义为两个类的方差的加权和:
σw2(t)=ω1(t)σ12(t)+ω2(t)σ22(t)(17)
权重 ωi 是被阈值 t 分开的两个类的概率:而 σi2 是这两个类的方差。
大津证明了最小化类内方差和最大化类间方差是相同的:
σb2(t)=σ2−σw2(t)=ω1(t)ω2(t)[μ1(t)−μ2(t)]2(18)
式中,μ 为每一类的中心点。
算法流程如下:
- 计算每个强度级(0-255)的直方图、概率密度
- 初始化 ωi(0),μi(0)
- 遍历所有可能的阈值 t=1… 最大强度
- 更新 ωi 和 μi
- 计算 σb2(t)
- 找到最大的 σb2(t) 对应的阈值 T,即为所求
同样使用图一的红色通道作为输入,利用大津二值化法,得到下面的结果:

图三 otsu 二值划分结果
计算结果如下:
总结
- 深入理解了自相关函数、互相关函数、卷积等相关概念
- 了解了 Pearson 相关系数的得来、原理等等
- 实现了如向质量压缩评估计算算法
- 实现了 otsu 图像二值化分算法
参考文献
- Constructing the Auto Correlation Matrix in Matlab
- 应该如何理解和处理自相关(序列相关)? | 知乎
- 自相关函数 | 维基百科
- Survey of Methods to Compute Linear Convolution
- numpy.correlate & numpy.convolve
- Understanding NumPy's Convolve
- Pearson correlation coefficient | Wikipedia
- Autocorrelation | Wikipedia
- Cross correlation | Wikipedia
- Estimate Autocorrelation using Python
- Cosine similarity, Pearson correlation, and OLS coefficient
- Plot histogram and Probability Density Function (PDF) in matplotlib/Python
- PSNR
- How to Calculate PSNR value of two images using Python and OpenCv?
- Structural similarity | Wikipedia
- Structural similarity index
- Otsu's method