私の主な問題はここで説明されています: Python での位相相関による変換/回転
具体的には、相関行列からピークを見つける方法と、値を解釈する方法を知りたいです。リンクから、問題全体が興味のある人のために詳細に説明されていますが、知っておくべき主なことは、ある画像が別の画像に対してどれだけ平行移動および回転されているかを調べようとしていることです (これは、別の画像)。そして、これを達成するために位相相関を使用しようとしています。これにより、結果として(numpy配列タイプの)相関行列が得られます。相関行列で argmax() を使用してみましたが、実際には意味を持たない単一の数値 (215) が得られました。私は 2 つの数字を期待しています。そのうちの 1 つは平行移動のオフセットを示し、もう 1 つは一方の画像の他方に対する回転を示します。
要するに:相関行列(Python)でピークを見つけるにはどうすればよいですか?
import scipy as sp
from scipy import ndimage
from PIL import Image
from math import *
import numpy as np
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
def load_image( infilename ) :
img = Image.open( infilename )
img.load()
data = np.asarray( img, dtype="int32" )
return data
def save_image( npdata, outfilename ) :
img = Image.fromarray( np.asarray( np.clip(npdata,0,255), dtype="uint8"), "L" )
img.save( outfilename )
image = load_image("C:/images/testing_image1.jpg")[:,:,0]
target = load_image("C:/images/testing_otherimage.jpg")[:,:,0]
# Conversion to log-polar coordinates
lpimage = logpolar(image)
lptarget = logpolar(target)
# Correlation through FFTs
Fcorr = np.fft.fft(lpimage)*np.fft.fft(lptarget)
correlation = np.fft.ifft(Fcorr)
max = np.argmax(correlation)
print max