![]() |
OpenCV 4.13.0
开源计算机视觉库 (Open Source Computer Vision)
|
上一篇教程: 运动去模糊滤波器
下一篇教程: 周期性噪声去除滤波器
| 原作者 | Karpushin Vladislav |
| 兼容性 | OpenCV >= 3.0 |
在本教程中你将学习
在数学中,梯度结构张量(也称为二阶矩矩阵、二阶矩张量、惯性张量等)是从函数梯度派生出的一个矩阵。它总结了给定点邻域内梯度的主要方向以及这些方向的相干性程度(相干性)。梯度结构张量广泛应用于图像处理和计算机视觉中,用于二维/三维图像分割、运动检测、自适应滤波、局部图像特征检测等。
各向异性图像的重要特征包括局部各向异性的方向和相干性。在本文中,我们将展示如何估计方向和相干性,以及如何通过梯度结构张量对具有单一局部方向的各向异性图像进行分割。
图像的梯度结构张量是一个 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 计算得出的。我们可以看到该算法只选择了具有单一方向的区域。