Detectando diferentes componentes:
Se você estiver tentando detectar os diferentes componentes, provavelmente existem outras abordagens para fazê-los além de detectar os contornos. Aqui está um exemplo no Mathematica. Uma erosão seguida de dilatação é usada para fechar a lacuna no segundo componente antes da detecção (se você não fizer isso, ele não detectará).
img = Binarize@Import["http://i.stack.imgur.com/yqDyu.png"];
Colorize[MorphologicalComponents[Dilation[Erosion[img,1],1]]]
A figura à esquerda abaixo mostra a detecção imperfeita de objetos (sem fechar a lacuna) e à direita mostra a detecção correta (executando o código acima).
Detectando os diferentes contornos:
No entanto, se você realmente deseja separar apenas os contornos, aqui está um exemplo. A erosão e a dilatação são realizadas como antes para fechar a lacuna e a imagem resultante é executada através de um detector de borda Canny. Tornei explícitas as opções padrão, para que você possa ver o que está sendo usado.
img2 = EdgeDetect[Dilation[Erosion[img, 1], 1], Method -> "Canny"]
Isso fornecerá a borda interna e externa (veja a figura à esquerda abaixo), pois a largura do pixel é maior que 1 ao redor. Não tive muita sorte em tentar diminuí-lo, pois o desempenho diminui (pode ser diferente para as outras imagens). Os contornos internos são os que você deseja e o contorno externo é apenas o contorno combinado de todos os 4 componentes. Agora tudo o que precisamos fazer é soltar o mais externo com:
SelectComponents[img2, "EnclosingComponentCount", # > 0 &]
que fornece os contornos internos (veja o canto inferior direito). Em outras palavras, ele seleciona apenas os contornos que são delimitados por pelo menos um outro contorno, que desqualifica automaticamente o mais externo. Eu não sei o equivalente desses comandos / operações no openCV.
Observe que as quebras aparentes na figura devem ser salvas no jpeg em um tamanho menor. Não parece assim na minha tela.