Farklı bileşenleri tespit etmek:
Farklı bileşenleri algılamaya çalışıyorsanız, kontürleri tespit etmekten başka muhtemelen bunları yapmak için başka yaklaşımlar vardır. İşte Mathematica'da bir örnek. Tespit öncesi ikinci bileşendeki boşluğu kapatmak için genişlemenin ardından erozyon kullanılır (bunu yapmazsanız algılamaz).
img = Binarize@Import["http://i.stack.imgur.com/yqDyu.png"];
Colorize[MorphologicalComponents[Dilation[Erosion[img,1],1]]]
Aşağıdaki soldaki şekil, kusurlu nesne algılamasını (boşluğu kapatmadan) gösterir ve sağdaki doğru algılamayı (yukarıdaki kodu çalıştırarak) gösterir.
Farklı kontürleri tespit etmek:
Ancak, gerçekten sadece kontürleri ayırmak istiyorsanız, işte bir örnek. Erozyon ve genişleme boşluğu kapatmadan önce olduğu gibi gerçekleştirilir ve elde edilen görüntü bir Canny kenar detektöründen geçirilir. Varsayılan seçenekleri açıkça belirttim, böylece ne kullanıldığını görebilirsiniz.
img2 = EdgeDetect[Dilation[Erosion[img, 1], 1], Method -> "Canny"]
Bu, piksel genişliğinin her yanından 1'den büyük olması nedeniyle hem iç hem de dış kenarı (aşağıdaki soldaki şekle bakınız) verecektir. Performans azaldıkça onu inceltmek için fazla şansım olmadı (diğer görüntüler için farklı olabilir). İç konturlar istediğinizlerdir ve dış kontur 4 bileşenin sadece kombine kontürüdür. Şimdi tek yapmamız gereken en dıştaki olanı bırakmak:
SelectComponents[img2, "EnclosingComponentCount", # > 0 &]
Bu size sadece iç konturları verir (sağ alttaki). Başka bir deyişle, yalnızca en dıştakiini otomatik olarak diskalifiye eden en az bir başka kontur tarafından çevrelenen konturları alır. OpenCV'deki bu komutların / işlemlerin eşdeğerini bilmiyorum.
Şekildeki belirgin kırılmaların, daha küçük boyutta jpeg'e kaydetmekten kaynaklandığını unutmayın. Ekranımda bu şekilde görünmüyor.