2017-03-29 13 views
0

opencv2では、私はいくつかのプロセスの後に2つのバイナリMat(白は前景です)を持っています。最初のMatは2番目のMatの部分グラフです。つまり:イメージをスムーズに他のイメージに分割する方法は?

Mat mat_small = .... 
    Mat mat_big = ..... 
    Mat result = someProcess(mat_small, mat_big) 

私は結果= mat_big - mat_smallを行うことができます。しかし、mat_bigの輪郭は残っています。長くて薄い殻のように見えます。シェルを外したい。

私はcv :: dilateとcv :: erodeを試しました。ほとんどの場合、正常に動作しますが、細長いシェルがはっきりとは削除されないことがあります。

そして、幅が薄いものを検出する方法はありますか?私がそれをすることができれば、私は私の問題を解決することもできます。しかし、私はそれを作る方法を知らない。

更新右から左への自己回答

から、画像がMat_big、Mat_small、Mat_minus(Mat_minus = Mat_big - Mat_small)であり、Mat_result:

enter image description here

右から左の画像はMat_big、Mat_small、Mat_minus(Mat_minus = Mat_big - Mat_small)、Mat_resultです。

mat_minusでは、削除したい細長い輪郭がいくつかあります。

私はcv :: erodeとcv :: dilateを使って4番目の画像に結果を得ました。ほとんどの場合、正常に動作しますが、細長い輪郭が少し強くなると、輪郭をはっきりと除去できません。

このような(輪郭もう少し強くなる):

enter image description here

CV ::侵食後の後に除去されていない細長いある右に輪郭。もちろん、私はcv :: erodeを何度もやって細長い輪郭を取り除くことができます。しかし、それは合理的な方法ではありません。

ある画像を別の画像から滑らかに引く方法はありますか?

+0

画像をアップロードできますか? –

+0

@Rick M.ありがとう。私の質問を補うために、答えのいくつかの画像を更新しました。 – Doone

+0

答えとしてではなく、質問に詳細を追加してください。画像を見ると、Mat_minallで「細い線」を得ないように減算する前に、Mat_small画像を拡大します。より太い線の輪郭は、あなたがそれを行うことができるもの、厚さを得ること、それに応じて浸食を適用すること、すなわち異なる画像を有することを私に伝えます。深度に応じてカーネルサイズを変更してください。行を賢明に反復するか、輪郭検出から取得することができます。 –

答えて

0

輪郭のboundingRectを見つけることができます。幅や高さ、アスペクト比(またはすべて3)に基づいて輪郭の境界を調べると、細い輪郭を取り除くことができます。特定の幅/高さ/アスペクト比と残りの部分を無視します。

+0

ありがとうございます。しかし、細長いシェルが曲線であるとき。シェルのboundingRectは長くはなく、再びシェルになります。たとえば、シェルが半円のように見える場合、シェルのboundingRectは薄くなく長くありません。私は私の質問を補うために答えのいくつかのイメージを更新しました。 – Doone

関連する問題