2014-03-06 80 views
2

我第一次在論壇中。希望我已經夠具體了。 在PIL中使用ImageChops,我試圖乘兩個圖像(兩個模式=「L」),但我總是得到相同的錯誤消息。我到處尋找,但找不到任何有用的東西。我非常感謝任何有用的想法! 附上代碼的相關部分。Pythons PIL(v2.6)中的TypeError消息:預期的整數,得到浮點數

def point(self, f, searchImage, technique): # technique - inpaint or bicubic 

    dimx, dimy = searchImage.size 

    reader = csv.reader(f) 
    for line in reader: #f.readlines(): 
     coord = line 
     print coord 
     if searchImage.size[0] > float(coord[0])+95.5 and searchImage.size[1]\ 
      > float(coord[1])+95.5: 
      box = (float(coord[0])-93.5,float(coord[1])-93.5,\ 
        float(coord[0])+95.5,float(coord[1])+95.5)  # left upper right 
     elif searchImage.size[0] < float(coord[0])+95.5 and searchImage.size[1]\ 
      > float(coord[1])+95.5: 
      box = (float(coord[0])-93.5,float(coord[1])-93.5,\ 
        searchImage.size[0]-0.5,float(coord[1])+95.5) # size of box 
      # depends on pixel size. A pixel size of 14 micrometer results in a 
      # cross size of 189 pixels 
     else: 
      box = (float(coord[0])-93.5,float(coord[1])-93.5,\ 
        float(coord[0])+95.5,searchImage.size[1]-0.5) 

     box = (math.floor(box[0]), math.floor(box[1]), math.floor(box[2]),\ 
       math.floor(box[3])) 

     searchCrop = searchImage.crop(box) 

     c_x = int(float(coord[1])) 
     c_y = int(float(coord[0])) 
     abst_y = c_x - int(math.floor(box[1])) - 1 # x shift 

     center = num.asarray(searchImage)[c_x,c_y] 
     if center == 0: 
      center = center + 0.00001 # to avoid division by zero 
     val = [num.asarray(searchImage)[c_x-1,c_y+1], num.asarray(searchImage)\ 
       [c_x-1,c_y-1], num.asarray(searchImage)[c_x+1,c_y-1], \ 
       num.asarray(searchImage)[c_x+1,c_y+1]] # ERDAS upper right, 
     # upper left, lower left, lower right 

     val_dict = {0:1,1:-1,2:-1,3:1} 
     flag = val_dict[val.index(min(val))] 
     if float(min(val))/center > 2. or min(val) > 100: 
      flag = 0 

     newima = num.zeros((searchCrop.size[1], searchCrop.size[0]),\ 
          dtype = "float") 

     Ayo = num.array(int(searchCrop.size[0])*[255]) 
     Ay = num.array((abst_y + flag)*[255] + 3*[0] + ((int(searchCrop.size[0]\ 
                  )-3-abst_y)-flag)*[255]) 
     Ax = num.array(int(searchCrop.size[0])*[0]) 
     Kx = num.array(3*[Ayo] + ((int(searchCrop.size[1])-9)/2+flag)*[Ay] + 3*[Ax] \ 
         + ((int(searchCrop.size[1])-9)/2-flag)*[Ay] + 3*[Ayo]) 

     Kxlist = list(itertools.chain(*Kx)) 

     i=0 
     for y in range(int(searchCrop.size[1])): 
      for x in range(int(searchCrop.size[0])):   
       newima[y,x] = Kxlist[i+y+x] 
      i=i+x 

     kernel = Image.fromarray(newima) 
     kernel = kernel.convert(mode="L") 

     # ----- 
     modified = ImageChops.multiply(searchCrop,kernel) # Results in an image 
     # where the pixels along the cross axes will get a value of 0 
     # --- 

的錯誤消息如下:

File "D:\GIS_dbase\Data\hma_cci\hexagon\KH9_Python\interpolate_cross.py", line 58, in 
crossInterpolation filledImage = self.p_model.point(f, searchImage, method) 
File "D:\GIS_dbase\Data\hma_cci\hexagon\KH9_Python\interpolate_cross.py", line 207, in 
point modified = ImageChops.multiply(searchCrop,kernel) # Results in an image where 
the pixels along the cross axes will get a value of 0 
File "C:\Python27\lib\site-packages\PIL\ImageChops.py", line 119, in multiply 
image1.load() 
File "C:\Python27\lib\site-packages\PIL\Image.py", line 1730, in load 
self.im = self.im.crop(self.__crop) 
TypeError: integer argument expected, got float 
+0

檢查'searchCrop = searchImage.crop(box)'。這是你共享的代碼中唯一可以調用該函數的部分,並且據我所知,box值可能會在else之前被設置。 – BWStearns

回答

0

的問題是,PIL的莊稼方法需要的4個整數元素的元組,但你逝去的漂浮。這應該工作:

box = tuple([int(math.floor(x)) for x in box])

相關問題