2012-02-23 51 views
3

您好此代码由红色和绿色通道之间,并且还蓝色和绿色通道之间赋予失真(X,Y)和失真(阿尔法)的大小的中心估计色差的图像。我在WarpRegion功能中出现错误色差估计在python

File "CAfeb.py", line 217, in warpRegion 
    reg_w = sp.interpolate.interp2d(yrampf,xrampf,Cwarp, yramp1f, xramp1f,'cubic'); 
    File "/usr/lib/python2.7/dist-packages/scipy/interpolate/interpolate.py", line 109, in __init__ 
    'quintic' : 5}[kind] 
TypeError: unhashable type: 'numpy.ndarray' 

下面是完整的代码 - 任何帮助将不胜感激 - 谢谢。 Areej

import math 
from PIL import Image 
import numpy as np 
from decimal import Decimal 
import scipy as sp 
from scipy import interpolate 
from scitools.std import ndgrid 
from scipy import ogrid, sin, mgrid, ndimage, array 


def ldimage(): 
    #load image 
    global im 
    im = Image.open("/home/areej/Desktop/mandril_color.tif") 

def analyzeCA(mode, im): 
    n_regions = 10; 
    reg_size = [300, 300]; 
    overlap = 0.5; 


    levels = 9; 
    steps = 2; 
    edge_width = 10; 
    hist_sz = 128; 

    # alpha_1 and alpha_2 are assumed to be between these values 
    w_data = [0.9985, 1.0015]; 

    reg_list=[] 

    #creating an array of pixels so that we can access them 
    pix=im.load() 

# 
#Analyze full image 

    if mode=='full': 
     print "Doing a full analysis" 
     # mx_shift is the third argument in 'full' mode 
     mx_shift = n_regions; 
      # [ydim,xdim,zdim]= size(im); 
     ydim=im.size[0] 
     xdim=im.size[1] 
     zdim=3 

     print "Image dimensions: [ydim, xdim, zdim]= "+str([ydim,xdim,zdim]) 


     global alpha_mx, alpha_mn 
     alpha_mx = 1 + 4*mx_shift/math.sqrt(xdim*xdim + ydim*ydim); 
     alpha_mn = 1.0/alpha_mx; 

     print "alpha_mx= "+str(alpha_mx) 
     print "alpha_mn= "+str(alpha_mn) 
     #recompute alpha_1 and alpha_2 to be between 
     #these new values 
     w_data = [alpha_mn, alpha_mx]; 
     ew = edge_width; 

     #take the image minus a ew-wide edge 
     roi = [ew+1, xdim-ew, ew+1, ydim-ew]; 

     print "edge_width= "+str(ew) 
     print "roi= "+str(roi) 

     #Analyze blue to green chromatic aberration 
     bg_params = parameterSearch(im, [3, 2], roi, ew, hist_sz, w_data); 

     # Analyze red to green chromatic aberration 
     rg_params = parameterSearch(im, [1, 2], roi, ew, hist_sz, w_data); 
    elif mode=='reg': 
     print "we should do a regional analysis here" 

    else: 
    print "unsupported call" 
#def estimateCARegions(im, [3, 2], reg_list, settings): 
def parameterSearch(im, colour_space, roi, ew, hist_sz, w_data): 

    #levels is number of iterations 
    levels = 8; 
    steps = 2; 

    #[ydim,xdim,zdim] = size(im); 
    ydim=im.size[0] 
    xdim=im.size[1] 
    zdim= 3 


    x_data = [1, xdim]; 
    y_data = [1, ydim]; 

    xlim = x_data; 
    ylim = y_data; 
    zlim = w_data; 

#work out which of height and width is the bigger 
    dim = max(xdim,ydim) 

    print "The highest dimension is : "+str(dim) 

#check that roi falls within expected boundries 
    if ((roi[0] <= ew) or (roi[1] > xdim-ew) or (roi[2] <= ew) or (roi[3] > ydim-ew)): 
     print "ROI is too close to image edges" 
     return -1 # TODO: terminate here with an error 
     #Get image regions 

    source = im.split() 
    Cfixed = source[2] 
    Cwarp = source[1] 
    #[ydim,xdim,zdim] = size(im); 
    ydimCwarp=Cwarp.size[0] 
    xdimCwarp=Cwarp.size[1] 
    print 'xdimCwarp'+str(xdimCwarp) 

    roi_pad = [roi[0]-ew, roi[1]+ew, roi[2]-ew, roi[3]+ew]; 
    for levels in range(1,8): 
    #Guess at a center and then compute best warp 
    #user defined function linear_space used to generate linearly spaced vectors 
     x_coords = np.linspace(0,511,steps+2) 
     y_coords = np.linspace(0,511,steps+2) 
     z_coords = np.linspace(alpha_mn,alpha_mx,steps+2) 
     step_x=(xlim[1]-xlim[0])/(steps+1) 
     start_x=xlim[0]+step_x 
     end_x=xlim[1]-step_x+0.5 
     step_y=(ylim[1]-ylim[0])/(steps+1) 
     start_y=ylim[0]+step_y 
     end_y=ylim[1]-step_y+0.5 
     step_z=(zlim[1]-zlim[0])/(steps+1) 
     start_z=zlim[0]+step_z 
     fudge_z=step_z/2.0 
     end_z=zlim[1]-step_z+fudge_z 
     #Do not include end points in search; 
     centers_x, centers_y, warps= np.mgrid[start_x:end_x:step_x,start_y:end_y:step_y,start_z:end_z:step_z] 
     centers_x=centers_x.flatten() 
     centers_y=centers_y.flatten() 
     warps=warps.flatten() 
     mi = np.zeros(centers_x.size) 

     for k in range(0,centers_x.size): 
      cx = centers_x[k] 
      cy = centers_y[k] 
      wz = warps[k]  
      #Warp the region 
      temp_im = warpRegion(Cwarp, roi_pad, [cx, cy, wz]) 
       #correlation 
      mi[k] = np.corrcoef(Cfixed, temp_im) 
       #Now pick the best quadrant 
     v, max_ix = math.max(mi) 
     ix, jx, kx = arrayInd(mi.size, max_ix); 
     ##The coordinates of err are off by 1 from x_coords and y_coords because 
     ##we did not include the end point 
    xlim = x_coords([jx, jx+2]); 
    ylim = y_coords([ix, ix+2]); 
    zlim = z_coords([kx, kx+2]); 

    cx = math.mean(xlim); 
    cy = math.mean(ylim); 
    wz = math.mean(zlim); 

    print "x= "+str(cx) 
    print "y= "+str(cy) 
    print "z= "+str(wz) 
def warpRegion(Cwarp, roi_pad, (cx, cy, wz)): 
#Unpack region indices 
    sx, ex, sy, ey = roi_pad 

    xramp, yramp = np.mgrid[sx:ex+1, sy:ey+1] 

    xrampc = xramp - cx; 
    yrampc = yramp - cy; 
    xramp1 = 1/wz*xrampc; 
    yramp1 = 1/wz*yrampc; 
    xrampf = xrampc.flatten() 
    yrampf = yrampc.flatten() 
    xramp1f = xramp1.flatten() 
    yramp1f = yramp1.flatten() 
    reg_w = sp.interpolate.interp2d(yrampf,xrampf,Cwarp, yramp1f, xramp1f,'cubic'); 

ldimage() 
analyzeCA('full', im) 
+3

你有什么错误?并且请正确格式化您的代码,您的“可运行”代码肯定是不可运行的。 – talonmies 2012-02-23 14:28:32

+0

这是错误我得到(文件 “CAfeb.py”,线217,在warpRegion reg_w = sp.interpolate.interp2d(yrampf,xrampf,Cwarp,yramp1f,xramp1f, '立方');文件“/ usr/lib中/ python2.7/DIST-包/ SciPy的/内插/ interpolate.py”,线109,在INIT '五次':5} [种类]类型错误:unhashable类型: 'numpy.ndarray') – 2012-02-23 19:45:18

+4

@AreejF:一点不看起来像interp2d的调用语法,它只接受三个数组参数和几个标志,并返回一个函数。输入'help(interpolate.interp2d)'获取详细信息。 – DSM 2012-02-23 19:49:46

回答

1

由于DSM正确地指出,这不是可在scipy.interp2d查看interp2d正确的调用语法。如果您想再次读取调用语法,然后你的错误信息(或任何你喜欢的模块本身),你会意识到你正在尝试使用一个数组作为索引字典这自然会抛出异常。

我认为你正在试图做的是由数组给出xrampf电网,yrampf在新的位置xrampf1,yrampf1的插值。 scipy文档还提供了一个完全相同的用法示例,其转换如下代码:

interp_func = sp.interpolate.interp2d(yrampf, xrampf, Cwarp, kind='cubic') 
reg_w = interp_func(yramp1f, xramp1f) 

我希望这是您的打算。

亲切的问候