Rilevamento di diversi componenti:
Se stai cercando di rilevare i diversi componenti, probabilmente ci sono altri approcci per farlo oltre a rilevare i contorni. Ecco un esempio in Mathematica. Un'erosione seguita da dilatazione viene utilizzata per colmare il divario nel secondo componente prima del rilevamento (se non lo si fa, non lo rileverà).
img = Binarize@Import["http://i.stack.imgur.com/yqDyu.png"];
Colorize[MorphologicalComponents[Dilation[Erosion[img,1],1]]]
La figura a sinistra in basso, mostra il rilevamento di oggetti imperfetti (senza chiudere lo spazio) e a destra, mostra il rilevamento corretto (eseguendo il codice sopra).
Rilevamento dei diversi contorni:
Tuttavia, se vuoi davvero separare solo i contorni, ecco un esempio. L'erosione e la dilatazione vengono eseguite come prima per colmare il divario e l'immagine risultante viene eseguita attraverso un rilevatore di bordi Canny. Ho reso esplicite le opzioni predefinite, in modo da poter vedere cosa viene utilizzato.
img2 = EdgeDetect[Dilation[Erosion[img, 1], 1], Method -> "Canny"]
Questo ti darà sia il bordo interno che quello esterno (vedi figura a sinistra in basso), poiché la larghezza dei pixel è maggiore di 1 tutto intorno. Non ho avuto molta fortuna cercando di renderlo più sottile, poiché le prestazioni peggiorano (potrebbe essere diverso per le altre tue immagini). I contorni interni sono quelli desiderati e il contorno esterno è solo il contorno combinato di tutti e 4 i componenti. Ora tutto ciò che dobbiamo fare è eliminare quello più esterno con:
SelectComponents[img2, "EnclosingComponentCount", # > 0 &]
che ti dà solo i contorni interni (vedi in basso a destra). In altre parole, seleziona solo quei contorni racchiusi da almeno un altro contorno, che squalifica automaticamente quello più esterno. Non conosco l'equivalente di questi comandi / operazioni in openCV.
Si noti che le interruzioni apparenti nella figura sono dovute al salvataggio in jpeg in dimensioni inferiori. Non sembra così sul mio schermo.