OpenCV 4.13.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 4.13.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
勾配構造テンソルによる異方性画像セグメンテーション

前のチュートリアル: モーションブラー除去フィルタ
次のチュートリアル: 周期性ノイズ除去フィルタ

原著者Karpushin Vladislav
互換性OpenCV >= 3.0

目的

このチュートリアルでは以下を学ぶ:

  • 勾配構造テンソルとは何か
  • 勾配構造テンソルによって異方性画像の方向とコヒーレンシをどのように推定するか
  • 勾配構造テンソルによって単一の局所方向を持つ異方性画像をどのようにセグメンテーション(領域分割)するか

理論

覚え書き
この解説は書籍 [140][29][289] に基づいている。勾配構造テンソルの優れた物理的な説明は [313] に示されている。また、Wikipediaのページ Structure tensor も参照できる。
このページの異方性画像は実世界の画像である。

勾配構造テンソルとは何か?

数学において、勾配構造テンソル(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 で計算された。アルゴリズムが単一方向を持つ領域のみを選択していることがわかる。

参考文献