2016-12-03 54 views
0

我正在研究一些打开jpg的python代码,并转到图像的某个部分并提取该部分。该代码旨在采取一个特定大小的矩形,并将其压缩到28-28。现在我的代码总是得到下面的输出。输出显示重复28次的一行数据。我期望输出有所不同,但事实并非如此。我希望这是某人容易发现的东西。任何帮助,将不胜感激。谢谢。python pil库调用和返回重复数据的方法

 def start_here(self): 
      ... # x,y,w,h are all valid 
      filename = "some valid filename" 
      img = self.look_at_img(filename,x,y,w,h) 
      self.print_block(img) 

     def look_at_img(self, filename, x = 0, y = 0, width = 28, height = 28): 
      img = Image.open(open(filename)) 
      size = 28, 28 

      img2 = [[0] * 28] * 28 
      oneimg = [] 


      mnist_dim = 28 

      multx = width/float(mnist_dim) 
      multy = height/float(mnist_dim) 

      xy_list = [] 
      dimx, dimy = img.size 
      #img = np.asarray(img, dtype='float64') 

      ''' Put in shrunk form. ''' 
      if not len (img.shape) < 3 : 
       if not (x + width > dimx and y + height > dimy) : 

        for aa in range(28) : 
         for bb in range(28) : 
          astart = x + aa * multx 
          bstart = y + bb * multy 
          #print astart, bstart 
          if True : 
           item = [ aa, bb, list(img.getpixel((int(astart) ,int(bstart))))] 
           xy_list.append(item) 


      ''' Put list in 28 x 28 array. ''' 
      if len(xy_list) == 0: 
       xy_list = [[0, 0,[0,0,0]]] 

      for i in range(len(xy_list)): 
       q = xy_list[i] 
       if i < 10: print(q) 
       if (q[0] < 28) and (q[1] < 28) and (q[0] >= 0) and (q[1] >= 0) : 
        img2[int(q[0])] [ int(q[1])] = q[2][0] 

      ''' Then add entire array to oneimg variable and flatten.''' 
      for yz in range(28): 
       for xz in range(28): 
        oneimg.append(img2[yz][xz]) 

      return oneimg 

     def print_block(self, img): 
      #print (img) 
      for x in range(28): 
       for y in range(28): 

        out = str(img[x *28 + y]) +" " 
        sys.stdout.write(out) 
       print "|" 
      print "---------------" 

一些输出包含如下:

[0, 0, [90, 75, 70]] 
    [0, 1, [85, 77, 66]] 
    [0, 2, [87, 73, 70]] 
    [0, 3, [88, 74, 73]] 
    [0, 4, [86, 73, 64]] 
    [0, 5, [91, 77, 68]] 
    [0, 6, [89, 74, 69]] 
    [0, 7, [86, 73, 65]] 
    [0, 8, [87, 72, 65]] 
    [0, 9, [86, 72, 63]] 
    45 35 48 61 62 61 95 91 94 88 92 93 87 98 178 194 116 98 90 91 92 85 84 88 88 90 91 92 | 
    45 35 48 61 62 61 95 91 94 88 92 93 87 98 178 194 116 98 90 91 92 85 84 88 88 90 91 92 | 
    45 35 48 61 62 61 95 91 94 88 92 93 87 98 178 194 116 98 90 91 92 85 84 88 88 90 91 92 | 
    ... more repeated values ... 

编辑:这些都是我的一些进口

import numpy as np 
    from PIL import Image 
    import os 
    import sys 

编辑:我改变了代码,并更新了输出一些。我不知道为什么print (q)行的列表与表中的数字不匹配。

+0

是*似乎后,我无法找到索引'PIL.Image'实例文档,一切*为正常。 –

+0

我尝试使用'getpixel()'后重做代码,如下文所述,并且我得到的输出基本相同[链接](http://pillow.readthedocs.io/en/3.4.x/reference/Image.html# PIL.Image.Image.getpixel)我的新输出是所有整数,但像以前一样重复。 –

+0

我已经编辑了一些我的问题。 –

回答

0

像这样的东西适合我。时需要使用一个numpy的阵列img2

def look_at_img(self, filename, x = 0, y = 0, width = 28, height = 28): 

     img = Image.open(filename) 

     img2 = [[0] * 28] * 28 
     img2 = np.asarray(img2, dtype="float32") ## 'img2' MUST BE A NUMPY ARRAY!! 

     oneimg = [] 

     mnist_dim = 28 

     multx = width/float(mnist_dim) 
     multy = height/float(mnist_dim) 

     xy_list = [] 
     dimx, dimy = img.size 

     counter = 0 

     ''' Put in shrunk form. ''' 
     if not len (img.getbands()) < 3 : 
      if not (x + width > dimx and y + height > dimy) : 

       for aa in range(28) : 
        for bb in range(28) : 
         astart = x + aa * multx 
         bstart = y + bb * multy 

         if astart >= 0 and astart < dimx and bstart >= 0 and bstart < dimy : 
          item = [ aa, bb, list(img.getpixel((int(astart) ,int(bstart))))] 
          xy_list.append(item) 
          counter = counter + 1 


     ''' Put list in 28 x 28 array. ''' 
     if len(xy_list) == 0: 
      xy_list = [[0, 0,[0,0,0]]] 
     ''' just one color ''' 
     high = img.getextrema()[0][1] /2 
     for i in range(len(xy_list)): 
      q = xy_list[i] 
      color = q[2][0] 
      if color > high : img2[int(q[0]), int(q[1])] = color 

     ''' Then add entire array to oneimg variable and flatten.''' 
     for yz in range(28): 
      for xz in range(28): 
       oneimg.append(img2[yz][xz]) 


     return oneimg