Rotasyon açısı, 2 resmin faz korelasyonu (fft kullanılarak) ile nasıl belirlenebilir? http://en.wikipedia.org/wiki/Phase_correlation'da verilen algoritma, doğrusal değil, açısal olarak döndürür. Ayrıca, döndürme işleminin yapılabilmesi için görüntülerin log-polar koordinatlarına dönüştürülmesi gerektiğinden bahseder. Bu dönüşüm pythonda nasıl başarılır? Ve dönüşüm sonrası, algoritmanın bekletme adımlarını aynen yapıyor mu? polar bir dönüşüm aslında dönme ve değişmez bir ölçektirFaz korelasyonu
cevap
Giriş .. Dönme y ekseni olarak kaydırmaya uygun olan ve ölçekleme bir görüntü x içinde bulmak için, aşağıdaki gibi
kadar basit adım günlük kutup dönüşümü x ekseninde kayması tekabül resim y: görüntü y
Bul görüntü x (kartezyen koordinatlarda kullanım aşaması korelasyonu)
hesaplayın x ve y her ikisi de polar dönüşümlerinin (bu başvuru, bkz bütün diğer bir sorun, log Aşağıda), her iki görüntüde de aynı özelliği ortaladığınızdan emin olun.
x ve y'nin Bul FFT, f (x) ve F (y), F
Bul faz korelasyon (x) ve F (y) o Bul
R çağrı demek R'nin IFFT (ters FFT) değeri R'nin tepe değeri Y Ekseni içindeki dönme sapmasına ve orijinal Görüntüden X Ekseni içindeki Ölçekleme sapmasına karşılık gelir.
Referanslar: Bir süre aynı sorun üzerinde çalışıyoruz
. Bunu yazmak için hafta sonunu aldım. Orası en temiz kod değil, ben sadece bir fizikçiyim, programcı değil ...
Faz korelasyonunun kendisi basittir: İki görüntüyü canlandırmak için en sevdiğiniz konvolüsyon algoritmasını kullanın. En yüksek konum size döndürme/ölçekleme farkını verir. Vikipedi'de (soruda belirtilen bağlantıda) iyi açıklanmıştır.
Sorunum iyi bir log-polar dönüştürücü bulamadım, bu yüzden bir tane yazdım. Bu aptalca değil, ama işi halleder. Bunu daha açık hale getirmek için yeniden yazmak isteyen herkes, lütfen bunu yapın!
import scipy as sp
from scipy import ndimage
from math import *
def logpolar(input,silent=False):
# This takes a numpy array and returns it in Log-Polar coordinates.
if not silent: print("Creating log-polar coordinates...")
# Create a cartesian array which will be used to compute log-polar coordinates.
coordinates = sp.mgrid[0:max(input.shape)*2,0:360]
# Compute a normalized logarithmic gradient
log_r = 10**(coordinates[0,:]/(input.shape[0]*2.)*log10(input.shape[1]))
# Create a linear gradient going from 0 to 2*Pi
angle = 2.*pi*(coordinates[1,:]/360.)
# Using scipy's map_coordinates(), we map the input array on the log-polar
# coordinate. Do not forget to center the coordinates!
if not silent: print("Interpolation...")
lpinput = ndimage.interpolation.map_coordinates(input,
(log_r*sp.cos(angle)+input.shape[0]/2.,
log_r*sp.sin(angle)+input.shape[1]/2.),
order=3,mode='constant')
# Returning log-normal...
return lpinput
Uyarı: Bu kod gri tonlamalı görüntüler için tasarlanmıştır. Her ayrı renk çerçevesindeki çizgiyi map_coordinates()
ile döngüleyerek renkli görüntüler üzerinde çalışmak için kolayca adaptör olabilir.
DÜZENLEME: Şimdi, korelasyon yapmak için kod basittir. senaryonuz image
ve target
olarak her iki görüntüyü içe sonra aşağıdakileri yapın:
# Conversion to log-polar coordinates
lpimage = logpolar(image)
lptarget = logpolar(target)
# Correlation through FFTs
Fcorr = np.fft.fft2(lpimage)*np.conj(np.fft.fft2(lptarget))
correlation = np.fft.ifft2(Fcorr)
dizisi correlation
koordinatlar boyut farkı ve açı farkı vardır zirveye içermelidir.
# Conversion to log-polar coordinates
lpimage = logpolar(image)
lptarget = logpolar(target)
# Correlation
correlation = np.correlate(lpimage,lptarget)
İşte bir uygulama var: http://www.lfd.uci.edu/~gohlke/code/imreg.py.html Ayrıca yerine FFTs kullanmak yerine, basitçe numpy en np.correlate()
işlevini kullanabilirsiniz. İki 128x128 görüntü arasındaki benzerliği bulmak için 0.035 saniye sürdü.
- 1. Geniş Faz Çarpışma Algılama - Karşılaştırma
- 2. Python'da Bir Zaman Serisinde İki Değişkenli Korelasyonu?
- 3. Scipy: Pearson korelasyonu her zaman geri döner 1
- 4. zaman aralığı boyunca komşu pikseller için ortalama korelasyonu hesaplar
- 5. Fourier faz ve büyüklüğünün Transform alma gibi tanımlanmıştır Matlab
- 6. caffe: model tanımı: caffe.NetSpec kullanarak farklı faz ile aynı katmanı yazın()
- 7. elasticsearch hata ile başarısız oldu "Faz [query_fetch] yürütülemedi, tüm parçaları başarısız"
- 8. Açık CV'de Varsayılan Gabor fazı 90 derece neden dengeleniyor?
- 9. Jenkins - Devam durumu Durum
- 10. SVN'ye erişmek için Objective-C kütüphanesi
- 11. Varsayılan istemci Azure hizmet paketini kullanırken istek üzerine ileti üstbilgisi nasıl eklenir?
- 12. Çiftler için eksen konumunu nasıl değiştirebilirim()?
- 13. R 'de yer alan doğru noktadaki önemli ilişkiyi nasıl vurgulayabilirim?
- 14. Sahne Alanı Bildirimi :: add(), TherapyElement :: add (TherapyElement $ TA)
- 15. R: filtreleme verileri ve korelasyon hesaplaması
- 16. Seaborn eklem bölgesinde efsane alma
- 17. Matlab İçerisindeki Spears SDIF Dosyalarını İçe Aktarma
- 18. DataNucleus Maven Plugin Eclipse maven projesi ile bu sorunu gidermek için nasıl
- 19. Eclipse mars içinde maven nasıl yapılandırılır
- 20. Aşırı takmayı önlemek için rakip ağları kullanın
- 21. Maven 2
- 22. Maven, ben "patladı" maven-savaş Eklentinin hedefi yapılandırmak istediğiniz belirli hedefe
- 23. Yayıncılık wsdl java M2E eklentisi yürütme
- 24. low pass FIR filtresi - gecikme olmaksızın
- 25. Hata Etki Alanı = NSPOSIXErrorDomain Code = 61 "İşlem tamamlanamadı. Bağlantı reddedildi"
- 26. uitableview altbilgisini dinamik olarak değiştirin
- 27. Docker-makine IP adresi çakışması İşte
- 28. Doğrudan dijital sentezde doğrusal enterpolasyon
- 29. Maven maven bağımlılık eklentisi kopya bağımlılıkları, çıktıları gözardı ediyorDört etme
- 30. xcodebuild (XCode 7.1) - iptal edilen komutunun
Tam kaynak kodu gönderebilir misiniz (sadece logpolar değil)? – mrgloom
Geç cevap için özür dilerim, bir süredir afedeydim ... Cevabımı şimdi düzenliyorum. – PhilMacKay
Hey Phil, İşlevinizi çalıştırmayı denedim ancak bir çalışma zamanı hatası alıyorum. Bana yardım eder misin? http://stackoverflow.com/questions/16654083/ –