ブロブがいくつかある画像があります。1 ピクセル ドットとそうでないものがあります。cvBlobsLibs を使用して 1 ピクセルのドットの高さと幅を調べると、値がゼロに等しいことが示されます。これは正しいです?輪郭を使用して 1 つのドット ピクセルを埋めようとしましたが、失敗したようです。1つのドットピクセルを削除したり、ゼロに等しい高さや幅を削除したりできる他のアプローチはありますか?
1 に答える
単一のピクセル要素の面積がゼロである理由がわかりません。(私の心はそれが1つであるべきだと言っています)。のドキュメントを確認してくださいcontourArea
。面積はを使用して計算されるGreen Formula
ため、面積とピクセル数が異なる場合があります。
次に、このノイズを除去するために、medianFilterを使用できます。以下にPythonを使用して示しました。
入力画像:
今コード:
>>> img2 = cv2.imread('D:\Abid_Rahman_K\work_space\mask.png',0)
>>> contours,hierarchy = cv2.findContours(img,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
ゼロ以外のピクセルの数:
>>> cv2.countNonZero(img2)
121
次に、medianFilterを適用し、ゼロ以外のピクセルの数を再度確認します。
>>> blur = cv2.medianBlur(img2,5)
>>> cv2.countNonZero(blur)
0
出力画像:
編集:
画像にオブジェクトがある場合、ぼかしの影響はあまり受けません。
入力画像:
出力画像:
この回答への2番目のコメントの後に編集してください。
ミズキがコメントしたように、メジアンフィルタリングの後に、近くに配置されたオブジェクトが互いに接続される可能性があります。これを理解するために、ウィキペディアのページから画像をここに示します。高半径のメジアンフィルターを使用した後、黒い線で区切られた黄色のオブジェクトがどのように接続されるかを確認します。
これは、中央値フィルターがウィンドウを使用して、そのウィンドウ内のすべての値の中央値を計算し、中央値をその中央値に置き換えるためです。ウィンドウのサイズが大きくなると、中央値の計算に使用される要素が増えます。したがって、狭いギャップが削除されます。
ウィキペディアの記事は良いものです:リンク
簡単な説明については、このリンクも参照してください:リンク
したがって、これを回避するために、侵食と拡張と呼ばれる別の方法があります(どちらもOpenCVに実装されています)。簡単に言うと、侵食は白い物体のサイズを小さくし、膨張は白い物体のサイズを大きくします。
したがって、侵食によって小さな白いピクセルが削除されますが、オブジェクトのサイズも小さくなります。そのため、拡張を使用してサイズを元に戻します。侵食によりすべてのホワイトノイズがすでに除去されているため、膨張して戻ってくることはありません。
これは、ノイズを除去するための良い手順です。