我有两张图片,一张是原版,另一幅是我修改过的,它被翻译成左边一点然后旋转了90度(所以图片的形状也被转换了)。
现在我想确定修改过的图片从原件转换的像素数(或任何距离单位),以及相对于原件的旋转度。相位相关应该通过首先将坐标转换为logpolar坐标,然后做很多事情来解决这个问题,最终得到一个相关矩阵。从那个矩阵我应该找到峰值,而(x,y)组合将以某种方式揭示平移和旋转。此链接解释得更好: Phase correlation
这是我的以下代码:
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)
测试了类型,结果看起来是合法的。但我无法将其转换回图像。我能得到的任何帮助都将不胜感激。
答案 0 :(得分:2)
我认为问题在于您尝试将3D图像阵列(R,G,B,A?)输入到您的功能中。而输入仅采用2D阵列。尝试使用单个通道来确定转换。例如。
image = load_image("/path/to/image")[:,:,0]