次のようなpng画像を取得しました。
青色は透明を表します。そして、円はすべてピクセルグループです。したがって、最大のものを見つけて、最大のものとグループ化されていない小さなピクセルをすべて削除したいと思います。この例では、最大のものは赤色のカラー サークルであり、これを保持します。でも緑と黄色は小さすぎるので外します。その後、次のようなものがあります。
何か案は?ありがとう。
次のようなpng画像を取得しました。
青色は透明を表します。そして、円はすべてピクセルグループです。したがって、最大のものを見つけて、最大のものとグループ化されていない小さなピクセルをすべて削除したいと思います。この例では、最大のものは赤色のカラー サークルであり、これを保持します。でも緑と黄色は小さすぎるので外します。その後、次のようなものがあります。
何か案は?ありがとう。
オブジェクトのサイズのみを考慮する場合は、次のアルゴリズムを使用します: オブジェクトのマスク イメージの結合コンポーネントにラベルを付けます (すべてのオブジェクト ピクセルは白、透明ピクセルは黒です)。次に、結合コンポーネントの面積を計算し、それらをフィルター処理します。このステップでは、ラベル マップと許可されたラベルのリストが用意されています。ラベル マップを読み取り、許可されたラベルがあれば、すべてのピクセルを白に設定してマスク イメージを上書きできます。
OpenCV にはラベル付け機能がないようですが、cvFloodFill はいくつかの呼び出しで同じことを行うことができます: ラベル付けされていない白いピクセルごとに、このピクセルをマーカーとして FloodFill を呼び出します。次に、新しく割り当てられた各ピクセルにそのラベルを割り当てることにより、このステップの結果を (画像のサイズの) 配列に格納できます。ラベル付けされていないピクセルがある限り、これを繰り返します。
それ以外の場合は、バイナリ イメージの connex コンポーネント関数を再コーディングできます。このアルゴリズムはよく知られており、簡単に実装できます (Matlab の から始めることもできますbwlabel
)。