2

1 つは元の写真で、もう 1 つは上に移動して少し左に移動し、90 度回転するように変更したものです (写真の形状も転置されます)。

ここで、変更された画像が元の画像から何ピクセル (または任意の距離単位) 変換されたか、および元の画像に対する回転角度を特定したいと思います。位相相関は、最初に座標を対数極座標に変換し、次にいくつかのことを実行して、最終的に相関行列を取得することにより、この問題を解決することになっています。その行列から、ピークを見つけ、(x,y) の組み合わせから何らかの形で平行移動と回転が明らかになるはずです。このリンクはそれをよりよく説明しています: 位相相関

これは私が持っている次のコードです:

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")
target = load_image("C:/images/testing_otherimage.jpg")

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

私が今抱えている問題は、このコードが出力として与えることです:

Traceback (most recent call last):
  File "./phase.py", line 44, in <module>
    lpimage = logpolar(image)
  File "./phase.py", line 24, in logpolar
    order=3,mode='constant')
  File "C:\Python27\lib\site-packages\scipy\ndimage\interpolation.py", line 295, in map_coordinates
    raise RuntimeError('invalid shape for coordinate array')
RuntimeError: invalid shape for coordinate array

位相相関プロセス全体で正確に何が起こっているかを非常に表面的に理解しているだけなので、問題が何であるかは不明です. 入力に問題があるかどうかを確認しようとしたのでsave_image(image,"C:/testing.jpg")、画像を読み込んだ直後に追加して、画像のnumpy配列に問題があるかどうかを確認しました。確かに、np配列に変換した画像は、画像に戻すことはできません。これは私が得るエラーです:

  Traceback (most recent call last):
  File "./phase.py", line 41, in <module>
    save_image(image,"C:/testing.jpg")
  File "./phase.py", line 36, in save_image
    img = Image.fromarray( np.asarray( np.clip(npdata,0,255), dtype="uint8"), "L" )
  File "C:\Python27\lib\site-packages\PIL\Image.py", line 1917, in fromarray
    raise ValueError("Too many dimensions.")
ValueError: Too many dimensions.

元のドキュメントを一瞥しても、問題が何であるかについてあまりインスピレーションを得ることができませんでした。画像をnumpy配列に変換するコードが間違っているとは思わないprint type(image). しかし、それを画像に戻すことはできません。私が得ることができるどんな助けも大歓迎です。

4

1 に答える 1