5

2つの画像の位相相関(fftを使用)によって回転角度を決定するにはどうすればよいですか? http://en.wikipedia.org/wiki/Phase_correlationに示されているアルゴリズムは、角度ではなく線形シフトを返します。また、回転を計算するには、画像を対数極座標に変換する必要があることにも言及しています。この変換はPythonでどのように達成されますか? 変換後、アルゴリズムの同じ手順が保持されますか?

4

3 に答える 3

4

対数極座標変換は、実際には回転とスケール不変です。回転はy軸のシフトに対応し、スケーリングは対数極座標変換のx軸のシフトに対応します。

したがって、画像yで画像xを見つけるための簡単な手順は次のとおりです。

  1. 画像yで画像xを検索します(デカルト座標で位相相関を使用します)

  2. xとyの両方の対数極変換を計算し(これはまったく別の問題です。以下の参照を参照してください)、両方の画像の同じ特徴を中心に配置してください。

  3. xとyのFFTを見つけます。たとえばF(X)とF(y)

  4. F(x)とF(y)の位相相関を見つけ、それをRと呼びます

  5. RのIFFT(逆FFT)を見つけます。Rのピーク値は、元の画像からのY軸の回転偏差とX軸のスケーリング偏差に対応します。

参照:

  1. http://etd.lsu.edu/docs/available/etd-07072005-113808/unrestricted/Thunuguntla_thesis.pdf
于 2010-05-24T05:33:57.703 に答える
3

私はしばらく同じ問題に取り組んできました。これを書くのに週末を費やしました。これは最もクリーンなコードではありませんが、私は単なる物理学者であり、プログラマーではありません...

位相相関自体は単純です。お気に入りの畳み込みアルゴリズムを使用して、2 つの画像を畳み込みます。ピーク位置は、回転/スケーリングの違いを示します。ウィキペディアでよく説明されています(質問に記載されているリンクにあります)。

私の問題は、適切な対数極変換器が見つからなかったため、作成しました。それは誰にでもできるというわけではありませんが、仕事を成し遂げます。わかりやすく書き直したい人はぜひ!

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

警告: このコードはグレースケール イメージ用に設計されています。map_coordinates()個別のカラー フレームごとにラインをループすることで、カラー イメージで作業するためのアダプターを簡単に作成できます。

編集:これで、相関を行うコードは簡単になりました。imageスクリプトが両方のイメージをととしてインポートした後target、次の操作を行います。

# 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)

配列correlationには、座標がサイズの差と角度の差であるピークが含まれている必要があります。np.correlate()また、FFT を使用する代わりに、numpy の関数を使用することもできます。

# Conversion to log-polar coordinates
lpimage = logpolar(image)
lptarget = logpolar(target)

# Correlation
correlation = np.correlate(lpimage,lptarget)
于 2012-09-03T20:08:39.833 に答える
1

これが実装です: http://www.lfd.uci.edu/~gohlke/code/imreg.py.html。2 つの 128x128 画像の類似性を見つけるのに 0.035 秒かかることがわかりました。

于 2014-08-01T03:47:08.950 に答える