OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
通过梯度结构张量进行各向异性图像分割

上一个教程: 运动去模糊滤波器
下一个教程: 周期性噪声去除滤波器

原始作者Karpushin Vladislav
兼容性OpenCV >= 3.0

目标

在本教程中,您将学习

  • 了解什么是梯度结构张量
  • 了解如何通过梯度结构张量估计各向异性图像的方向和相干性
  • 了解如何通过梯度结构张量分割具有单一局部方向的各向异性图像

理论

注意
本解释基于书籍 [137], [28][286]。关于梯度结构张量良好的物理解释可在 [310] 中找到。此外,您还可以参考维基百科页面 结构张量
此页面上的各向异性图像是真实世界的图像。

什么是梯度结构张量?

在数学中,梯度结构张量(也称为二阶矩矩阵、二阶矩张量、惯性张量等)是一个从函数梯度导出的矩阵。它总结了在点指定邻域内梯度的主要方向,以及这些方向的一致性程度(相干性)。梯度结构张量广泛用于图像处理和计算机视觉,用于2D/3D图像分割、运动检测、自适应滤波、局部图像特征检测等。

各向异性图像的重要特征包括局部各向异性的方向和相干性。本文将展示如何估计方向和相干性,以及如何通过梯度结构张量分割具有单一局部方向的各向异性图像。

图像的梯度结构张量是一个2x2对称矩阵。梯度结构张量的特征向量表示局部方向,而特征值则表示相干性(各向异性度量)。

图像 \(Z\) 的梯度结构张量 \(J\) 可以写为:

\[J = \begin{bmatrix} J_{11} & J_{12} \\ J_{12} & J_{22} \end{bmatrix}\]

其中 \(J_{11} = M[Z_{x}^{2}]\),\(J_{22} = M[Z_{y}^{2}]\),\(J_{12} = M[Z_{x}Z_{y}]\) 是张量的分量,\(M[]\) 是数学期望的符号(我们可以将此操作视为在窗口w中的平均),\(Z_{x}\) 和 \(Z_{y}\) 是图像 \(Z\) 对 \(x\) 和 \(y\) 的偏导数。

张量的特征值可以通过以下公式找到:

\[\lambda_{1,2} = \frac{1}{2} \left [ J_{11} + J_{22} \pm \sqrt{(J_{11} - J_{22})^{2} + 4J_{12}^{2}} \right ] \]

其中 \(\lambda_1\) 是最大特征值,\(\lambda_2\) 是最小特征值。

如何通过梯度结构张量估计各向异性图像的方向和相干性?

各向异性图像的方向

\[\alpha = 0.5arctg\frac{2J_{12}}{J_{22} - J_{11}}\]

相干性

\[C = \frac{\lambda_1 - \lambda_2}{\lambda_1 + \lambda_2}\]

相干性范围从0到1。对于理想的局部方向(\(\lambda_2\) = 0, \(\lambda_1\) > 0),它为1;对于各向同性灰度结构(\(\lambda_1\) = \(\lambda_2\) > 0),它为0。

源代码

您可以在OpenCV源代码库的samples/cpp/tutorial_code/ImgProc/anisotropic_image_segmentation/anisotropic_image_segmentation.cpp中找到源代码。

解释

各向异性图像分割算法包括梯度结构张量计算、方向计算、相干性计算以及方向和相干性阈值处理。

函数 calcGST() 使用梯度结构张量计算方向和相干性。输入参数 w 定义了窗口大小。

以下代码将阈值 LowThr 和 HighThr 应用于图像方向,并将阈值 C_Thr 应用于前一个函数计算的图像相干性。LowThr 和 HighThr 定义了方向范围。

最后,我们结合阈值处理结果。

结果

您可以在下面看到具有单一方向的真实各向异性图像:

您可以在下面看到各向异性图像的方向和相干性:

您可以在下面看到分割结果:

结果是使用 w = 52, C_Thr = 0.43, LowThr = 35, HighThr = 57 计算的。我们可以看到算法只选择了具有单一方向的区域。

参考文献