![]() |
OpenCV 4.13.0
Open Source Computer Vision
|
前のチュートリアル: モーションブラー除去フィルタ
次のチュートリアル: 周期性ノイズ除去フィルタ
| 原著者 | Karpushin Vladislav |
| 互換性 | OpenCV >= 3.0 |
このチュートリアルでは以下を学ぶ:
数学において、勾配構造テンソル(2次モーメント行列、2次モーメントテンソル、慣性テンソルなどとも呼ばれる)は、関数の勾配から導かれる行列である。これはある点の指定された近傍における勾配の支配的な方向と、それらの方向がどの程度コヒーレント(コヒーレンシ)であるかを要約する。勾配構造テンソルは、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 で計算された。アルゴリズムが単一方向を持つ領域のみを選択していることがわかる。