1D エッジ検出

はじめに

1D エッジ検出(またの名を 1D メジャーメント)は、機械ビジョンのクラシックな手法の一つで、画像の情報を画像の輝度の一次元プロファイルから抽出します。これは、測定だけでなく、対象物の位置決めにも使用できます。

この手法の主な利点には、サブピクセルの精度と高いパフォーマンスがあります。

コンセプト

1D エッジ検出技術は、画像内の任意のエッジがそのエッジに垂直な方向に急激な輝度変化に対応しているという観察に基づいています。したがって、画像のエッジを検出するには、画像をある経路に沿ってスキャンし、抽出された輝度プロファイルの変化が顕著な場所を探します。

計算は以下のステップで進行します:

  1. プロファイル抽出 – まず、指定された経路に沿った輝度のプロファイルを抽出します。通常、ノイズを除去するためにプロファイルが平滑化されます。
  2. エッジ抽出 – プロファイル輝度の大きな変化点は、エッジポイント として識別されます。これは、垂直エッジがスキャンラインと交差するポイントのことです。
  3. 後処理 – 最終的な結果は、利用可能なメソッドの一つを使用して計算されます。例えば、ScanSingleEdge フィルターは抽出されたエッジの中から最も強いものを選択して返します。一方で ScanMultipleEdges フィルターはすべてを返します。

画像は経路に沿ってスキャンされ、輝度プロファイルが抽出および平滑化されます。


輝度プロファイルが微分されています。プロファイルの導関数には4つのピークがあり、これらはスキャンラインと交差する4つの顕著な画像エッジに対応しています。
最終的には、選択した値よりも強いピークがエッジポイントとして識別されます(ここでは最小強度が5に設定されています)。

フィルターツールセット

エッジをスキャンする1Dエッジ検出ベースのテクニックのための基本的なツールセットには、指定されたパス(inScanPath)に沿って単一のスキャンを実行する9つのフィルターが含まれています。フィルターは興味の対象の構造(エッジ/リッジ/ストライプ(エッジのペア))とその基数(1つ/任意の固定数/不明な数)で異なります。

エッジ
単一結果 ScanSingleEdge
複数の結果 ScanMultipleEdges
固定数の結果 ScanExactlyNEdges

ストライプ
単一結果 ScanSingleStripe
複数の結果 ScanMultipleStripes
固定数の結果 ScanExactlyNStripes

リッジ
単一結果 ScanSingleRidge
複数の結果 ScanMultipleRidges
固定数の結果 ScanExactlyNRidges


オーロラビジョンライブラリでは、他の1Dエッジ検出機能を使用する前にCreateScanMap関数を使用する必要があります。この特別な関数はスキャンマップを作成し、他の関数に入力として渡すことで計算を大幅に高速化します。

パラメータ

プロファイルの抽出

9つのフィルタのいずれも、明るさプロファイルはまったく同じ方法で抽出されます。幅inScanWidthinScanPathに沿ったストライプのピクセルが走査され、パスに沿ったピクセルの値が累積され、1次元プロファイルが形成されます。右の画像では、処理されたピクセルのストライプがオレンジでマークされており、inScanPathは赤でマークされています。

抽出されたプロファイルは、標準偏差inSmoothingStdDevを使用してガウシアンスムージングで平滑化されます。このパラメータは計算の堅牢性に重要であり、ノイズが偽の/関連のない極小値を導入する可能性のある低い値を選択する必要がありますが、実際の検出するべきエッジを保持するために低い値を選択する必要があります。

inSmoothingStdDevパラメータは、以下に示すようにoutBrightnessProfile出力を使用して対話的な実験を通じて調整する必要があります。


標準偏差が低すぎるinSmoothingStdDev
ノイズが多すぎます


適切なinSmoothingStdDev
ノイズが少なく、重要なエッジが保持されています


標準偏差が高すぎるinSmoothingStdDev
重要なエッジが減衰します

エッジの抽出

明るさプロファイルが抽出および精製された後、プロファイルの導関数が計算され、その局所極値のうち少なくともinMinMagnitudeの大きさのものがエッジポイントとして識別されます。 inMinMagnitudeパラメータは、outResponseProfile出力を使用して調整する必要があります。

右の画像は、例のoutResponseProfileプロファイルを示しています。この場合、有意な極小値の大きさは11から13まで変化しており、他の極小値の大きさは3よりも低いです。したがって、(4, 10)の範囲のinMinMagnitude値が適切です。

エッジの遷移

個々のエッジを検出するフィルタは、エッジが表す遷移の種類に応じてエッジをフィルタリングできます。つまり、明るいから暗いへの強度の変化、または暗いから明るいへの変化かどうかにより、各エッジにinTransitionパラメータを使用して同じ条件を適用します(可能な選択肢は明るいから暗い暗いから明るい、および任意)。

inTransition = 任意

inTransition = 明るいから暗い

inTransition = 暗いから明るい

ストライプの強度

ストライプを検出するフィルターは、エッジがその特性を交互に持つことを期待しています。パラメータ inIntensity は、各ストライプが周囲のスペースよりも明るいか暗いかを定義します。

inIntensity = Dark

inIntensity = Bright

ケーススタディ: ブレード

写真から丸鋸の刃を数えたいとします。
この問題を解決するために、ブレードを交差する円形のパスに沿って単一の1Dエッジ検出スキャンを実行する必要があるため、適切な円形パスを生成する必要があります。これには、簡単なCreateCirclePathフィルターを使用します。ビルトインのエディターを使用して、必要な inCircle パラメータを指定できます。
次のステップは、適切な測定フィルターを選択することです。パスは暗いブレードと白い背景の間を交互に移動するため、ストライプを測定できるフィルターを使用します。画像に何枚のブレードがあるかわからない(これを計算する必要がある)ので、ScanMultipleStripesフィルターが理想的な選択肢となります。
測定フィルターは、各ブレードを単一のストライプ(または inIntensity の選択に応じて各ブレード間のスペース)として識別することが期待されるため、ブレードの数を計算するために必要なのは、測定フィルターの outStripes.Count プロパティの値を読み取るだけです。
プログラムは期待どおりに問題を解決します(おそらく、 inSmoothingStdDev をデフォルト値の0.6から大きな値の1.0または2.0に増やす必要があります) 30本の刃を正確に検出します。