Nokta Deseni Tanıma


46

İki farklı boyut karesinde dağılmış iki farklı boyutta nokta kümesinin (basitlik için 2D) olması şöyledir:

1- küçük olandan büyük olana nasıl rastlanır?
2- Olayları aşağıdaki şekilde gösterildiği gibi nasıl sıralayacağınıza dair bir fikriniz var mı?

İşte sorunun basit bir gösterimi ve istenen bir çözüm: görüntü tanımını buraya girin


Güncelleme 1:
Aşağıdaki şekilde, incelenmekte olan sorunun biraz daha gerçekçi bir görünümü gösterilmektedir. görüntü tanımını buraya girin

Yorumlar hakkında aşağıdaki özellikler uygulanır:

  • noktaların kesin yerleri mevcuttur
  • noktaların kesin boyutu mevcuttur
    • boyut sıfır olabilir (~ 1) = yalnızca bir nokta
  • tüm noktalar beyaz zemin üzerine siyah
  • gri tonlama / kenar yumuşatma etkisi yok

Burada endolithbazı küçük değişikliklerle sunulan yöntemi uygulamam (benim için daha küçük ve daha hızlı olduğu için kaynak yerine hedefi döndürdüm). Endolith'in cevabını kabul ettim çünkü bunu daha önce düşünüyordum. RANSAC hakkında Şu ana kadar hiçbir tecrübem yok. Ayrıca, RANSAC'ın uygulanması çok sayıda kod gerektirir. görüntü tanımını buraya girin


1
Bu tür noktaları eşleştirmek veya daha karmaşık resimler için bir çözüm mü arıyorsunuz? Resimlerde kaç nokta olabilir?

Evet, bu çok önemli. Bilinen boyutta sadece noktalar varsa, bunun için optimize edebilirsiniz. Üzerinde kontrol sahibi olduğunuz inançlı işaretler varsa, bunun için optimize edebilirsiniz. Bunu ne için kullandığınız konusunda daha net olun.
Endolith

Üzerinde çalışmakta olduğum problem için, boyut setinde daha küçük (başka bir deyişle <100) aranmakta olan bir takım noktalar (her birkaç yüz puan) vardır. Yukarıdaki gösteri çok basit ve açık, ancak asıl sorun karmaşık görünüyor. İstenmeyen noktalara göre sıralanan eşleşmeleri de aralarında bulabilirsiniz.
Geliştirici

1
Sadece siyah ve beyaz noktalar olacak mı? Onları kameradan / tarayıcıdan mı başka bir şeyden mi alıyorsun? İkili değerler hesaplamaları çok daha hızlı yapabilir.
Endolith

Noktaların merkezlerini bulmakta ya da sadece büyük resimdeki minyatürleri bulmakla ilgili sorunlarınız mı var?

Yanıtlar:


17

Bu en iyi çözüm değil, ama bir çözüm. Daha iyi teknikler öğrenmek isterdim:

Dönmeyecekler veya ölçeklenmeyeceklerse, görüntülerin basit çapraz korelasyonunu kullanabilirsiniz. Büyük görüntüde küçük görüntünün gerçekleştiği yerde parlak bir tepe olacaktır.

FFT yöntemini kullanarak çapraz korelasyonu hızlandırabilirsiniz, ancak küçük bir kaynak görüntüyü büyük bir hedef görüntüyle eşleştiriyorsanız, kaba kuvvet çarpma ve ekleme yöntemi bazen (genellikle değil) daha hızlı olur.

Kaynak:

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

Hedef:

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

Çapraz korelasyon:

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

İki parlak nokta, eşleşen konumlardır.

Ama bunu o kendisi tarafından çalışma olmaz, böylece Örnek resimdeki bir rotasyon parametresi var. Yalnızca dönmeye izin veriliyorsa ve ölçeklenmiyorsa, yine de çapraz korelasyon kullanmak mümkündür, ancak çapraz korelasyon kurmanız, kaynağı döndürmeniz, tüm hedef görüntü ile çapraz ilişkilendirmeniz, tekrar döndürmeniz vb. Tüm rotasyonlar

Bunun mutlaka görüntüyü bulamayacağını unutmayın. Kaynak görüntü rastgele gürültü ve hedef rastgele gürültü ise, tam olarak doğru açıda aramadığınız sürece bulamazsınız. Normal durumlar için muhtemelen onu bulacak, ancak resim özelliklerine ve aradığınız açılara bağlı.

Bu sayfa nasıl yapılacağına dair bir örnek gösterir, ancak algoritmayı vermez.

Toplamın bir miktar eşiğin üstünde olduğu herhangi bir denge bir eşleşmedir. Kaynak görüntünün kendisiyle ilişkilendirerek ve tüm miktarlarınızı bu sayıya bölerek eşleşmenin iyi olduğunu hesaplayabilirsiniz. Mükemmel bir eşleşme 1.0 olacaktır.

Yine de, bu hesaplama oldukça ağır olacak ve nokta kalıplarını eşleştirmek için daha iyi yöntemler var (bilmek istiyorum).

Gri tonlamalı ve FFT yöntemiyle Hızlı Python örneği:

from __future__ import division
from pylab import *
import Image
import ImageOps

source_file = 'dots source.png'
target_file = 'dots target.png'

# Load file as grayscale with white dots
target = asarray(ImageOps.invert(Image.open(target_file).convert('L')))

close('all')
figure()
imshow(target)
gray()
show()

source_Image = ImageOps.invert(Image.open(source_file).convert('L'))

for angle in (0, 180):
    source = asarray(source_Image.rotate(angle, expand = True))
    best_match = max(fftconvolve(source[::-1,::-1], source).flat)

    # Cross-correlation using FFT
    d = fftconvolve(source[::-1,::-1], target, mode='same')

    figure()
    imshow(source)


    # This only finds a single peak.  Use something that finds multiple peaks instead:
    peak_x, peak_y = unravel_index(argmax(d),shape(d))

    figure()    
    plot(peak_y, peak_x,'ro')
    imshow(d)

    # Keep track of all these matches:
    print angle, peak_x, peak_y, d[peak_x,peak_y] / best_match

1 renkli bitmapler

1 renkli bitmapler için bu çok daha hızlı olurdu. Çapraz korelasyon:

  • Kaynak resmi hedef resmin üzerine yerleştirin
  • Kaynak görüntüyü 1 piksele taşı
    • Bitsel-AND tüm çakışan pikseller
    • 1'leri topla
  • ...

Gri tonlamalı bir görüntünün binary'e eşiklenmesi ve ardından bunu yapmak yeterince iyi olabilir.

Nokta bulutu

Kaynak ve hedef her iki nokta paterni ise, daha hızlı bir yöntem, her noktanın merkezlerini bulmak (bir kez bilinen bir noktayla çapraz korelasyon yapmak ve sonra zirveleri bulmak) ve bunları bir nokta kümesi olarak saklamak, sonra kaynağı eşleştirmek olacaktır. İki setteki en yakın noktalar arasındaki en küçük kareler hatasını döndürerek, çevirerek ve bularak hedeflemektir.


1
Doğru, araştırılmakta olan sorun için ölçeklendirme yok, ancak rotasyon olabilir. Bağlantı ve cevap için teşekkürler.
Geliştirici

@ Geliştirici: Peki, o zaman işe yarayacak, ama muhtemelen daha iyi bir yol var. Eğer sadece ikili bir görüntü ise, çapraz korelasyon olsa da çok daha hızlı olacaktır. (İkili sinyal için FFT diye bir şey var mı?) Dönüş keyfi mi? 1 derece veya 5 derece vb. Artış gibi iyi sonuçlar veren bir dizi dönme değeri denemeniz gerekir
11’e kadar

1
Evet bu ikili bir sorundur. Ayrıca bir yerden, farklı genliklere sahip daha uzun bir sinyalde modüle edilmiş daha kısa bir sinyal bulmak için böyle bir yöntem olduğunu hatırlıyorum. Karmaşıklıktan bağımsız olarak, toplama noktalarını olayların başlangıç ​​noktaları olarak göstererek çok iyi çalıştığını hatırlıyorum. Sorun 2D olduğu için benzer bir kavramın nasıl kullanılacağı bana açık değildir. Bu, 2D olarak uygulanan rotasyon nedeniyle de karmaşıktır.
Geliştirici

1
Evet, dönme özgürlüğü eklenirken bu mümkün olmaz. Bu yüzden RANSAC gibi yöntemler geliştirildi. Bunun üzerinde DSP kutusunun dışında düşünmek yardımcı olur diye düşünüyorum.
Matt M.

@MattM .: Çalışıyor, sadece yavaş. :)
Endolit

22

Bir bilgisayar vizyonu açısından: temel sorun, hedef nokta setiniz ile büyük setteki nokta alt kümeleri arasındaki bir homografiyi tahmin etmektir. Sizin durumunuzda, sadece rotasyon ile afin bir homografi olacak. RANSAC yöntemine bakmalısınız . Birçok aykırı olan bir sette bir eşleşme bulmak için tasarlanmıştır. Öyleyse iki önemli anahtar kelimeyle silahlısınız , homografi ve RANSAC .

OpenCV bu çözümleri hesaplamak için araçlar sunar, ancak MATLAB'ı da kullanabilirsiniz. İşte OpenCV kullanan bir RANSAC örneği . Ve başka bir tam uygulama .

Tipik bir uygulama, bir resimdeki kitap kapağını bulmak olabilir. Kitap kapağının bir resmini ve bir masada kitabın bir fotoğrafını görebilirsiniz. Yaklaşım şablon eşleştirmesi yapmak değil, her görüntüdeki belirgin köşeleri bulmak ve bu nokta kümelerini karşılaştırmaktır. Sorununuz bu sürecin ikinci yarısına benziyor - büyük bir bulutta belirlenen noktayı bulmak. RANSAC bunu sağlam bir şekilde yapmak için tasarlandı.

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

Veriler çok temiz olduğu için çapraz korelasyon yöntemleri de sizin için işe yarayabilir. Sorun şu ki, rotasyonla birlikte başka bir serbestlik derecesi eklersiniz ve yöntem çok yavaşlar.


Bu soruya biraz daha detay ekledim. Bağlantılarınızı derinden kontrol edeceğim ancak hızlı bir izlenim onlar farklı kavramlardı!
Geliştirici

1
Görünüşe göre gerçekten bir RANSAC / homografi problemi :)
Matt M.

İyi. Bu benim için yeni bir konseptti. En kısa zamanda deneyeceğim. Eğer zorluklarla karşılaşırsam sizlerle paylaşacağım, büyük ve destekleyici topluluk üyeleri.
Geliştirici

Basit S: RANSAC / homografi yöntemini 3D nokta bulutuna uygulamak mümkün mü / mümkün mü?
Geliştirici

Bu geçerli bir çözüm değil. Maalesef soru yoğunluk bilgisi içermiyor ve bu nedenle basit tanımlayıcı programlar işe yaramayacak. Sorun bundan çok daha geometrik.
Tolga Birdal,

3

Desen seyrek bir ikili ise, görüntüler yerine koordinat vektörlerinin basit kovaryansını yapabilirsiniz. Sol üste dizilmiş alt penceredeki noktaların koordinatlarını alın, tüm koordinatlardan bir vektör yapın ve sola dizilmiş desen noktalarının koordinatlarından oluşan vektör ile kovaryansı hesaplayın. Ağırlıkları da kullanabilirsiniz. Bundan sonra komşuya en yakın kaba kuvveti, büyük penceredeki bazı ızgaralarda (ve ayrıca dönüş açılarında ızgara) maksimum kovaryans arayın. Arama ile yaklaşık koordinatları bulduktan sonra, onları en az kare yöntemi ile düzeltebilirsiniz.

PS Idea, görüntüyle çalışmak yerine sıfır olmayan piksellerin koordinatlarıyla çalışabileceğinizdir. Ortak en yakın komşu araması. Koordinat ve çürük açıdaki bir adım olan bazı ızgaraları kullanarak hem çevirmeli hem de döndürmeli olarak tüm arama alanlarını ayrıntılı olarak aramalısınız. Her koordinat / açı için pencerede, o koordinat o açıya döndürülen merkezin altından pikselin alt kümesini alır, koordinatlarını alır (merkezden rel) ve bunları aradığınız desenin piksel koordinatlarıyla karşılaştırın. Her iki ayar noktasında da aynı şekilde sıralandığından emin olmalısınız. Koordinatları minimum farkla (maksimum kovaryans) bulabilirsiniz. Bu kaba maçtan sonra, bazı optimizasyon yöntemleriyle hassas eşleşmeler bulabilirsiniz. Üzgünüm, bundan daha kolay yayınlayamıyorum.


1
Bize fikrinizi daha fazla açıklayan bir örnek verir misiniz? Cevabınızın şu anki sürümü kafamı karıştırıyor.
Geliştirici

3

Neden hiç kimsenin Generalize Hough Transform ailesinin yöntemlerinden bahsetmediğine çok şaşırdım . Bu sorunu doğrudan çözerler.

İşte önerdiğim şey:

  1. Şablonu alın ve şablonun kenarlarını indeksleyerek R-tablosu oluşturun. Seçtiğim kenarlar aşağıdaki gibidir:

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

  1. Aşağıdakileri elde etmek için genelleştirilmiş Hough dönüşümünün varsayılan OpenCV uygulamasını kullanın : görüntü tanımını buraya girin

eşleşen konumların işaretlendiği yer. Aynı yöntem, kenarlar tek bir noktaya düşse bile yine de işlevsel olacaktır, çünkü yöntem görüntü yoğunluğunu gerektirmez.

Dahası, rotasyonların taşınması Hough programları için çok doğaldır. Aslında, 2B durum için, bu sadece akümülatörde eklenmiş bir boyuttur. Gerçekten verimli kılma ayrıntılarına girmek istersen, M. Ulrich makalesinde birçok püf noktası anlatıyor .


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.