Kenarları birbirine temas ettiğinde farklı nesneleri nasıl saptarım?


21

Kameradan alınan görüntüdeki tüm kontürleri bulmam gerekiyor. Bu yüzden ilk önce kenarları bulmak için kenarlı dedektörü kullanıyorum ve sonra kontürleri buluyorum. Oldukça basit.

Bununla birlikte, kontürlerim "birleştiriliyor". Örneğin, aşağıdaki resimde açıkça 4 farklı nesnem var. Kenarlar bazı noktalarda hafifçe temas ediyor, bu yüzden dört ayrı nokta yerine büyük bir kontur elde ediyorum. Eşikleri değiştirmeyi, aşınmayı, morfoloji işlemlerini ve benzeri şeyleri değiştirmeyi denedim, ancak kenarları hafifçe dokunmaya devam ediyor. Aşağıdakilere benzer görüntülerde ayrı kontürlerin nasıl alınacağı hakkında önerisi olan var mı? (Aşağıdaki görüntü açıkçası sadece bir örnek, gerçek görüntülerim çok daha karmaşık, ancak aynı temel soruna sahip).

görüntü tanımını buraya girin


Havza segmentasyonu çalışabilir.
sm176357

İletişim bir çizgidir ve sadece bir noktası çok (dokunmadan ama örtüşmeyen) nerede olduğunu, ayrıca durumları dikkate almalıdır
Shravya Boggarapu

Yanıtlar:


11

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.

görüntü tanımını buraya girin görüntü tanımını buraya girin

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.

görüntü tanımını buraya girin görüntü tanımını buraya girin

Ş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.


2

Resimlerinizi erozyona benzeyen morfolojik bir filtre ile önceden işlemeyi deneyin . Bu, dokunma hatlarının ayrılmasını sağlar. Konturlarınızı tespit ettikten sonra, kafesleri tamamlamak için bir dilasyon işlemi uygulayabilirsiniz .


Bunu denedim, ancak sonuçta iyileşme olmadı.

1
Gerçek bir örnek resim gösterebilir misiniz?

2

Sorunuza bir cevap değil, kontur analizi hataya açık. Bu konuda çok fazla şey yapamazsınız ve sadece çok basit senaryolarda çalışır.

Kullanmakta sorun yaşıyorsanız, tamamen farklı bir algoritma aramalısınız. Bir şeyleri çözmenin daha karmaşık ve daha sağlam yolları vardır, ancak elde etmek istediğiniz şeye bağlıdır (nesne algılama, izleme vb.)


Teşekkür ederim. Programım el tespiti için kullanılıyor, bu yüzden nesne tespiti ile çok benzer olacağını düşünüyorum. Daha karmaşık ve sağlam algoritmalar için herhangi bir öneriniz var mı? Haar Özellikleri, SURF ve benzeri makine öğrenme algoritmaları yapabileceğim bir şey değil.

Bu kaynaklara baktın mı? paginas.fe.up.pt/~hgc2011 Bunlar esas olarak veri tabanları / sonuçlarıdır, ancak umarım burada iyi yazılar bulabileceksiniz.

0

Kontürlerin mutlaka açık olması gerekmez, onları tespit etmek için canny kullandığınızı düşünün. Canny ile ilgili sorunlar burada zaten tartışıldı . Tartışma açıkgöz üzerinde size hala değerlendirilen kapalı hatlarına açıkgöz üstünde gerektirir kapanış ve dilatasyon gibi operasyonlar olduğunu temel bir fikir verir.

Bu aynı zamanda konturları mı yoksa bölümleri mi aradığımızı da gösterir (Canny - Graphcuts gibi yöntemler ). Bu yüzden sağlam bir çözüm aramanın son uygulamanıza bağlı olduğunu düşünüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.