2D画像のエッジ検出ではなく、画像のすべての行(ig a line)のエッジを個別に検出したいと思います。これは、値が0〜255の範囲のピクセル強度である入力1Dベクトルからのエッジの検出です(下の画像)。
サンプル入力(下の画像)に表示される主要なエッジを検出したい
2D画像のエッジ検出ではなく、画像のすべての行(ig a line)のエッジを個別に検出したいと思います。これは、値が0〜255の範囲のピクセル強度である入力1Dベクトルからのエッジの検出です(下の画像)。
サンプル入力(下の画像)に表示される主要なエッジを検出したい
希望する結果を得る1つの方法は、2D Cannyエッジ検出器を次のように適合させることです(Mathematicaのコード)。
まず、ガウス微分フィルターを使用して空間微分を計算し、検出するエッジのスケールに関連するシグマ値を設定します。結果の絶対値を取ります。
d = Abs@GaussianFilter[data, {{10, 5}}, 1];
次に、しきい値を自動的に決定して、以前の導関数値を2つのグループにクラスター化します(ここでは大津の方法を使用)。
thrd = FindThreshold[d];
次に、微分値のステップ(「デッドバンド」への/からの遷移)を検出します。
steps = Flatten@Image`StepDetect[d, thrd]["NonzeroPositions"];
この時点で、エッジの端があります。
ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps]}]
オプションで-それはあなたが望むもののようです-エッジの下端だけを保持します。この場合、エッジの端でデータポイントをクラスタリングすることは機能しますが、それがどれほど堅牢かはわかりません。
t = FindThreshold@data[[steps]];
steps2 = Select[steps, data[[#]] <= t &];
ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps2]}]
これらのエッジの優れたコントラストを考えると、堅牢に機能する簡単なソリューションがあります。ピクセル値のすべての単調なシーケンスを検出します(厳密に増加または減少)。ノイズの多いピークを拒否するために、合計の高さがしきい値(この場合は50)を超えるシーケンスを維持します。
副産物として、開始点と終了点を取得します(ただし、正確には期待した場所ではありませんが、必要に応じて改善することができます)。
バーコード?
それで、あなたは傾きの特定の変化を探しています-すなわち、サンプルごとのYの特定の変化?
2つのサンプル間のYの差を単純に見て、絶対値が限界を超えて変化した場合は、それをエッジとしてマークしませんか?