8-bağlı piksel listesinden çıkarma kesimleri | Netgez.com
SORU
20 HAZÄ°RAN 2011, PAZARTESÄ°


8-bağlı piksel listesinden çıkarma kesimleri

Şimdiki durum: Bir görüntü segmentleri ayıklamak için çalışıyorum. OpenCV sayesinde findContours() Bu yöntem, şimdi 8-bağlı her kontür için nokta bir listesi var. Ancak, bu listeler çiftleri çok içerdikleri için değil, doğrudan kullanılabilir.

Sorun:8-bağlı çiftleri içerebilir puan listesini göz önüne alındığında, parçaları ayıklamak.

Olası çözümler :

  • Ä°lk baÅŸta, openCV 12 ** yöntemi kullandım. Ancak, sonuçları çok kötü... Burada YakınlaÅŸtırılmış hatlarını :

enter image description here

Burada approxPolyDP() sonuç : (9 parça! Üst üste bazı)

enter image description here

ama istediÄŸim gibi

enter image description here

approxPolyDP() bir şey dönüştürebilirsiniz çünkü kötü "birkaç parça gibi görünüyor" "birkaç parça". Ne var ancak, kendilerini birkaç kez yineleme eğilimindedir puan listesidir.

Örneğin, eğer benim puan ise:

0 1 2 3 4 5 6 7 8 
  9   

Sonra, nokta listesi olacak 0 1 2 3 4 5 6 7 8 7 6 5 4 3 2 1 9... Ve eğer puan büyük hale (>sayısı 100) daha sonra kesimleri approxPolyDP() tarafından çıkarılan maalesef çiftleri (ben değil.e : söyleyemem yani birbirimizi, ama değil stricly eşit, üst üste "çoğaltır" örneğin piksel), karşıt olarak kaldırın

  • Belki de, bir çözüm var, ama oldukça uzun ilginç olsa da). Öncelikle tüm 8-baÄŸlı liste, benseyrek bir matris oluÅŸturun(verimliliÄŸi) ve set matris eÄŸer piksel listesine ait ise. 1 deÄŸerleri O zaman, bir ben yaratmakgrafikdüğümleri ile piksel ve komÅŸu pikseller arasında kenarlarına karşılık gelen. Bu da benim demektirpikseller arasında eksik olan tüm kenarlar ekleyin(karmaşıklık küçük) seyrek matris çünkü Olası. Ben De O Zamantüm olası "kareler" kaldırın(4 neighouring düğümleri), ve bu zaten çok ince hatlarını üzerinde çalışıyorum, çünkü bu mümkündür. Sonra bir baÅŸlatabilirimminimal Kapsayan aÄŸaçalgoritma. Ve son olarak, approxPolyDP() openCV ile aÄŸacın her ÅŸube yaklaşık edebilirim

segmentation

Burada fantastik resimler (teşekkür Boya!) özgün listesi ve ilişkili grafik. Komşular arasında kenarları ekliyorum o zaman. Ve son olarak, ben kenarlarını kaldırın ve en az yayılan ağacı yapmak (faydalı)

Sıkıcı bir yöntem var, hata eğilimli göründüğü gibi henüz uygulanmadı aldım. özetle : Ancak, soruyorumsana, StackOverflow kişi : diğer mevcut yöntemler, muhtemelen iyi uygulamaları olan var mı?


Edıt : açıklığa kavuşturmak İçin, bir kez ben bir ağaç, ben özü "dal" (dallar başlangıçta yaprakları veya düğüm bağlı 3 veya daha fazla düğüm) Sonra, algoritma openCV approxPolyDP() Ramer–Douglas–Peucker algorithm ve işte Wikipedia resmin ne yapar :

enter image description here

Bu resimde, kolay puan birbirlerinin kopyası olabilir neden başarısız anlamak mümkün değildir


Başka bir edit : benim yöntem, dikkat çekici bir şeyler var. Noktaları bir ızgara yer alan (piksel gibi) dikkate alındığında, genellikle, en az yayılan ağaç algoritması birçok olası en az ağaç var çünkü kullanışlı değildir

X-X-X-X
|
X-X-X-X

fundammentally çok farklıdır

X-X-X-X
| | | |
X X X X

ama hem az yayılan ağaçlar

Ancak, benim durumumda, benim düğümleri hatlarını olması gerekiyordu çünkü nadiren kümeleri, ve zaten önceden findContours() çalışan inceltme algoritması var.


Tomalak yorum cevap :

enter image description here

Eğer DP algoritması 4 Bölüm (noktadan kesimi 2 merkezi iki defa olmak üzere) dönerse çok mutlu olurum! Tabii ki, iyi parametreleri ile, bir devlet için bir "şans" aynı kesimleri ve çiftleri kaldırabilirsiniz. - Ancak, belli ki, bu algoritma için tasarlanmamıştır.

Burada çok fazla kesimleri ile gerçek bir örnek :

enter image description here

CEVAP
27 HAZÄ°RAN 2011, PAZARTESÄ°


Sturm kullanarak 8, görüntüde beyaz piksel listesinden morfolojik bir grafik oluşturdu. İlk olarak, görüntü üzerinde çalışıyor, ama:

enter image description here

enter image description here

Morfolojik grafik oluÅŸturmak:

graph = MorphologicalGraph[binaryimage];

O zaman seni ilgilendiren grafik özellikleri sorgulayabilirsiniz.

Bu grafikte tepe isimlerini verir:

vertex = VertexList[graph]

Kenarları listesi:

EdgeList[graph]

Ve bu köşe pozisyonları verir:

pos = PropertyValue[{graph, #}, VertexCoordinates] & /@ vertex

Bu sonuçlar ilk resim için:

In[21]:= vertex = VertexList[graph]

Out[21]= {1, 3, 2, 4, 5, 6, 7, 9, 8, 10}

In[22]:= EdgeList[graph]

Out[22]= {1 \[UndirectedEdge] 3, 2 \[UndirectedEdge] 4,  3 \[UndirectedEdge] 4, 
          3 \[UndirectedEdge] 5, 4 \[UndirectedEdge] 6,  6 \[UndirectedEdge] 7, 
          6 \[UndirectedEdge] 9, 8 \[UndirectedEdge] 9,  9 \[UndirectedEdge] 10}

In[26]:= pos = PropertyValue[{graph, #}, VertexCoordinates] & /@ vertex

Out[26]= {{54.5, 191.5}, {98.5, 149.5},  {42.5, 185.5}, 
          {91.5, 138.5}, {132.5, 119.5}, {157.5, 72.5},
          {168.5, 65.5}, {125.5, 52.5},  {114.5, 53.5}, 
          {120.5, 29.5}}

Belgelere bakılırsa, http://reference.wolfram.com/mathematica/ref/MorphologicalGraph.html komut MorphologicalGraph ilk morfolojik inceltme tarafından iskeleti hesaplar:

skeleton = Thinning[binaryimage, Method -> "Morphological"]

Daha sonra tepe noktası tespit edilir; şube noktaları ve bitiş noktaları:

verteximage = ImageAdd[
                  MorphologicalTransform[skeleton, "SkeletonEndPoints"],   
                  MorphologicalTransform[skeleton, "SkeletonBranchPoints"]]

enter image description here

Ve sonra kendi köşe bağlantı analizi sonra bağlantılıdır.

Örneğin, bir köşe etrafında yapısını bozarak başlamak ve bağlı bileşenleri arayın, grafiğin kenarları açıklamadan sonra olabilir:

comp = MorphologicalComponents[
           ImageSubtract[
               skeleton, 
               Dilation[vertices, CrossMatrix[1]]]];
Colorize[comp] 

enter image description here

Şeytan ayrıntıda gizlidir, ama eğer kendi uygulama geliştirmek istiyorsanız sağlam bir başlangıç noktası gibi görünüyor.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • 24 Канал

    24 КанаÐ

    5 ÅžUBAT 2006
  • Dive In

    Dive In

    17 Temmuz 2013
  • Vsauce

    Vsauce

    30 Temmuz 2007