2010-05-14 13 views
5

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

4

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

  1. Bul görüntü x (kartezyen koordinatlarda kullanım aşaması korelasyonu)

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

  3. x ve y'nin Bul FFT, f (x) ve F (y), F

  4. Bul faz korelasyon (x) ve F (y) o Bul

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

  1. http://etd.lsu.edu/docs/available/etd-07072005-113808/unrestricted/Thunuguntla_thesis.pdf
2

. 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) 
+0

Tam kaynak kodu gönderebilir misiniz (sadece logpolar değil)? – mrgloom

+0

Geç cevap için özür dilerim, bir süredir afedeydim ... Cevabımı şimdi düzenliyorum. – PhilMacKay

+0

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/ –

1

İş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ü.

İlgili konular