さまざまなコンポーネントの検出:
さまざまなコンポーネントを検出しようとしている場合は、おそらく輪郭を検出する以外の方法でそれらを実行できます。Mathematicaの例を次に示します。侵食に続いて膨張を使用して、検出前に2番目のコンポーネントのギャップを閉じます(これを行わないと、検出されません)。
img = Binarize@Import["http://i.stack.imgur.com/yqDyu.png"];
Colorize[MorphologicalComponents[Dilation[Erosion[img,1],1]]]
下の左の図は、不完全なオブジェクトの検出(ギャップを閉じない)を示し、右の図は、正しい検出(上のコードを実行)を示しています。
異なる輪郭の検出:
ただし、実際に輪郭のみを分離したい場合は、ここに例を示します。前と同じように収縮と膨張を実行してギャップを閉じ、結果の画像をキャニーエッジ検出器に通します。デフォルトのオプションを明示的に指定したので、使用されているものを確認できます。
img2 = EdgeDetect[Dilation[Erosion[img, 1], 1], Method -> "Canny"]
これにより、ピクセルの幅が1より大きいため、内側と外側の両方のエッジが得られます(左下の図を参照)。パフォーマンスが低下するため(他の画像では異なる場合があります)、薄くすることはできませんでした。内側の輪郭は必要な輪郭であり、外側の輪郭は4つのコンポーネントすべてを組み合わせた輪郭です。ここで必要なのは、最も外側のものをドロップすることです:
SelectComponents[img2, "EnclosingComponentCount", # > 0 &]
内側の輪郭だけが表示されます(右下を参照)。つまり、少なくとも1つの他の輪郭に囲まれた輪郭のみを選択し、最も外側の輪郭を自動的に不適格にします。openCVのこれらのコマンド/操作に相当するものがわかりません。
図の明らかな中断は、より小さなサイズでjpegに保存するためです。私の画面ではそのようには見えません。