二値化後の白黒画像があります。その後、私は以下のようなイメージを持っています:
OpenCV を使用して、長い曲線に平行な小さな線を削除するにはどうすればよいですか? 小さなオブジェクトをすべて削除することでそれらを削除できますが、小さな平行線だけを削除したいです。
二値化後の白黒画像があります。その後、私は以下のようなイメージを持っています:
OpenCV を使用して、長い曲線に平行な小さな線を削除するにはどうすればよいですか? 小さなオブジェクトをすべて削除することでそれらを削除できますが、小さな平行線だけを削除したいです。
これは、私にはキャニー アーティファクト (または何らかの鳴り響くアーティファクト) のように見えます。それらを削除するにはいくつかの方法があります。
経験的ではあるが計算量が多すぎない方法は、すべての小さな特徴を見つけて、それらを [+/-]X、[+/-]Y だけシフトした同じ画像に重ね合わせることです。特徴がシフトされた画像と完全に一致している場合、つまり、白い特徴のすべてのピクセルがシフトされた画像でも白い場合、おそらくアーティファクトが見られます。
機能の「小ささ」を評価するには、基本的なフラッドフィルを使用できます。この方法は、4 つのシフトされたイメージを実際に割り当てることなく、ポインターを使用してシフトをシミュレートできるため、コストがかかりません。平行線が実際に小さい場合は誤検知が発生しやすく、アーティファクトが非常に大きい場合は誤検知が発生しやすくなります。
別の方法は、元の画像を異なるしきい値で 2 回ポスタライズすることです。「本物の」線は一緒にとどまりますが、鳴り響くアーティファクトは異なる強さを持ちます。その時点で、画像の違いを評価し、画像トラックから特定のしきい値よりも離れたすべてのフィーチャを「アーティファクト」と見なします。これはもう少し計算集約的で、より良い結果が得られますが、元の画像の内容、つまりワークフローによって異なります。
ワークフローを再評価する (エッジ検出フェーズを変更する) ことで、アーティファクトの作成を完全に回避できる可能性があります。
cvBlobslib ライブラリを使用して白いパッチをブロブとして検出します... cvBlobslib ライブラリは、 area や楕円率などのブロブのさまざまな機能を見つけることができる関数を提供します...したがって、長い曲線に平行な小さなパッチのみが必要な場合...それから ..
これがうまくいくことを願っています..
平行線がエッジ密度を増加させているという事実を利用する手順を次に示します。
1)adaptive Threshold
グレーの画像に適用して、多くのエッジを取得します。
2) Erode
3x3 (または実験ではあるが小さい) モルフォロジー演算。
3)Logical Not
エッジ密度を取得します。
4) Dilate
3x3 または 5x5 のように適用します。エッジを拡張してマージし、領域を作成します。
5) ここErode
で 7x7 (または前回よりも高い膨張を実験) 形態学的操作。不要な領域、長い線、小さな迷路領域のほとんどが削除されます。
出力は除去領域の MASK です。元画像に輪郭検出を適用し、マスク高精度除去で位置合わせ用の輪郭オブジェクトを除去できます。または、高精度の結果が必要ない場合はAnd
、マスクのNOT
.
おそらく他の人が言ったことに似ていますが、簡単に言えば、細い線は長い線の約半分の太さのように見えるので、長い線をそのまま維持することをあまり気にしない場合は、いくつか適用できます小さなものが消えるまで、「線を細くする」単純なアルゴリズムを倍増します。必要なことは、画像をピクセルごとにスキャンし、黒いピクセルの上または下または左または右に白いピクセルを検出すると、その座標をベクトルに保存することです。イメージ全体をトラバースした後、ベクトル内の座標で指定されたすべてのピクセルを黒にします。このアルゴリズムの反復回数のしきい値を経験的に定義できます。
ラインの向きが事前にわかっている場合は、ニーズに合わせたカスタム構造化要素を使用してモルフォロジー クロージングを行うことができます。
ウィキペディアのモルフォマットを参照してください
opencvのドキュメントを参照してください
次のようなことをしないのはなぜですか:
findContours
してサイズでフィルタリングします)。最初に画像をスケルトン化すると、結果はおそらくより良く (そしてより速く) なります。
頑張ってください、