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

  • ecf150king

    ecf150king

    20 Ocak 2006
  • PaysNatalAu's channel

    PaysNatalAu'

    11 Aralık 2010
  • TecNoob

    TecNoob

    15 AĞUSTOS 2013