2D画像のエッジ検出の代わりに、画像のすべての単一の行(i行、1行)を別々に検出したいと考えています。すなわち、値が0から255までの範囲の画素強度(下の画像)が入力された1次元ベクトルからエッジの検出である:サンプル入力(下の画像)に表示される 1次元エッジ検出
Iは、主要なエッジを検出したい
2D画像のエッジ検出の代わりに、画像のすべての単一の行(i行、1行)を別々に検出したいと考えています。すなわち、値が0から255までの範囲の画素強度(下の画像)が入力された1次元ベクトルからエッジの検出である:サンプル入力(下の画像)に表示される 1次元エッジ検出
Iは、主要なエッジを検出したい
次のように、所望の結果を得るための一つの方法は、(Mathematicaのコード)2Dキャニーエッジ検出器を適応させることである。
まず、シグマ値を相対的に設定、ガウシアン微分フィルタを用いて空間微分を計算します検出したいエッジのスケール。結果の絶対値を取る。そして
d = [email protected][data, {{10, 5}}, 1];
、(ここで大津の方法を用いて)二つのグループ内の前の微分値をクラスタ化するために、自動的にしきい値を決定します。
thrd = FindThreshold[d];
次に、微分値のステップ(「不感帯」への遷移)を検出します。この時点で
steps = [email protected]`StepDetect[d, thrd]["NonzeroPositions"];
あなたは、エッジの両端を持っている:
オプションListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps]}]
- それはあなたが好きなものだと思われる - の唯一の最低端を保ちますエッジ。この場合、エッジの端にあるデータポイントをクラスタリングすることはできますが、どれだけ頑強であるかはわかりません。これらのエッジの素敵なコントラストを考える
t = [email protected][[steps]];
steps2 = Select[steps, data[[#]] <= t &];
ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps2]}]
スロープの特定の変化、つまり1サンプルあたりの特定の変化を探していますか?
2つのサンプルの間のYの違いを見て、絶対値が何らかの制限マーク以上に変化した場合は、それをエッジとして見ないのですか?
いいえ、それは全く単純ではありません。 (なぜエッジ検出が重要でないのか) –
@Cgraphics:あなたが投稿した画像上に、ガウス演算子の簡単な違いや派生物がうまくいくはずです。 。 「それほど単純ではない」と思う場合は、問題のある実際のデータを投稿してください。 – Niki
@nikieこれは実際の画像ですが、単純な閾値を適用するのと同じくらい単純ではありません。エッジを正確に検出する必要があります。たとえば、エッジを数えるだけではありません。 –
、ロバストに動作する簡単な解決策がある(厳密に増加または減少)の画素値のすべての単調な配列を検出します。ノイズの多いピークを排除するために、合計高さがスレッショルド(あなたの場合は50)を超えるシーケンスを維持します。
副産物として、開始点と終了点が表示されます(正確には予測できませんが、必要に応じて改善できます)。
バーコード?
正確に終了しませんが、色付きバーコードと考えることができます –
返信いただきありがとうございます。もう新しいアイデア(1つのエッジの検出)が出てきたら、こちらもそれを共有してください。 –