3

二値化後の白黒画像があります。その後、私は以下のようなイメージを持っています:

http://ifotos.pl/zobacz/ipng_xhnxhrh.png/

OpenCV を使用して、長い曲線に平行な小さな線を削除するにはどうすればよいですか? 小さなオブジェクトをすべて削除することでそれらを削除できますが、小さな平行線だけを削除したいです。

4

6 に答える 6

2

これは、私にはキャニー アーティファクト (または何らかの鳴り響くアーティファクト) のように見えます。それらを削除するにはいくつかの方法があります。

経験的ではあるが計算量が多すぎない方法は、すべての小さな特徴を見つけて、それらを [+/-]X、[+/-]Y だけシフトした同じ画像に重ね合わせることです。特徴がシフトされた画像と完全に一致している場合、つまり、白い特徴のすべてのピクセルがシフトされた画像でも白い場合、おそらくアーティファクトが見られます。

機能の「小ささ」を評価するには、基本的なフラッドフィルを使用できます。この方法は、4 つのシフトされたイメージを実際に割り当てることなく、ポインターを使用してシフトをシミュレートできるため、コストがかかりません。平行線が実際に小さい場合は誤検知が発生しやすく、アーティファクトが非常に大きい場合は誤検知が発生しやすくなります。

別の方法は、元の画像を異なるしきい値で 2 回ポスタライズすることです。「本物の」線は一緒にとどまりますが、鳴り響くアーティファクトは異なる強さを持ちます。その時点で、画像の違いを評価し、画像トラックから特定のしきい値よりも離れたすべてのフィーチャを「アーティファクト」と見なします。これはもう少し計算集約的で、より良い結果が得られますが、元の画像の内容、つまりワークフローによって異なります。

ワークフローを再評価する (エッジ検出フェーズを変更する) ことで、アーティファクトの作成を完全に回避できる可能性があります。

于 2012-09-12T20:47:02.893 に答える
2

cvBlobslib ライブラリを使用して白いパッチをブロブとして検出します... cvBlobslib ライブラリは、 area や楕円率などのブロブのさまざまな機能を見つけることができる関数を提供します...したがって、長い曲線に平行な小さなパッチのみが必要な場合...それから ..

  1. ブロブまたはプレメーター、つまりブロブの輪郭の長さによってカバーされる領域に基づいて長い曲線を取得します...
  2. 楕円を当てはめた後、楕円率または長い曲線の長軸の方向を取得します(cvBlobslibライブラリがそれを行います..!!)...
  3. 面積または輪郭に関してしきい値よりも小さく、長い曲線と同じ向きを持つブロブをすべてフィルタリングします ....

これがうまくいくことを願っています..

于 2012-09-13T13:33:46.290 に答える
1

平行線がエッジ密度を増加させているという事実を利用する手順を次に示します。

1)adaptive Thresholdグレーの画像に適用して、多くのエッジを取得します。

2) Erode3x3 (または実験ではあるが小さい) モルフォロジー演算。

3)Logical Notエッジ密度を取得します。

4) Dilate3x3 または 5x5 のように適用します。エッジを拡張してマージし、領域を作成します。

5) ここErodeで 7x7 (または前回よりも高い膨張を実験) 形態学的操作。不要な領域、長い線、小さな迷路領域のほとんどが削除されます。

出力は除去領域の MASK です。元画像に輪郭検出を適用し、マスク高精度除去で位置合わせ用の輪郭オブジェクトを除去できます。または、高精度の結果が必要ない場合はAnd、マスクのNOT.

于 2014-10-27T14:11:11.443 に答える
1

おそらく他の人が言ったことに似ていますが、簡単に言えば、細い線は長い線の約半分の太さのように見えるので、長い線をそのまま維持することをあまり気にしない場合は、いくつか適用できます小さなものが消えるまで、「線を細くする」単純なアルゴリズムを倍増します。必要なことは、画像をピクセルごとにスキャンし、黒いピクセルの上または下または左または右に白いピクセルを検出すると、その座標をベクトルに保存することです。イメージ全体をトラバースした後、ベクトル内の座標で指定されたすべてのピクセルを黒にします。このアルゴリズムの反復回数のしきい値を経験的に定義できます。

于 2012-09-12T21:46:55.993 に答える
1

ラインの向きが事前にわかっている場合は、ニーズに合わせたカスタム構造化要素を使用してモルフォロジー クロージングを行うことができます。

ウィキペディアのモルフォマットを参照してください

opencvのドキュメントを参照してください

于 2012-09-12T20:43:08.283 に答える
0

次のようなことをしないのはなぜですか:

  1. 長い曲線を見つけます (使用findContoursしてサイズでフィルタリングします)。
  2. 小さな曲線を見つける
  3. 長い曲線ごとに、すべての小さな曲線の各点と長い曲線の間の最小距離を計算します。
  4. これらの最小距離の平均と標準偏差を計算します。
  5. 長い曲線までの平均最小距離が大きすぎる小さな曲線、または最小距離の標準偏差が大きい小さな曲線を拒否します。

最初に画像をスケルトン化すると、結果はおそらくより良く (そしてより速く) なります。

頑張ってください、

于 2012-09-13T07:09:43.047 に答える