2016-12-03 9 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 ... 

EDIT:これらは私の輸入品の一部です

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

EDIT:私は、コードを変更し、更新をいくつか出力します。私はprint (q)行のリストがテーブルの数字と一致しない理由を理解できません。

+0

に使用するために必要なnumpyの配列*がOKであることを*そうです。 –

+0

私は、下記のように 'getpixel()'を使ってコードを再作成しようとしましたが、私はほぼ同じ出力を得ました[link](http://pillow.readthedocs.io/ja/3.4.x/reference/Image.html# PIL.Image.Image.getpixel)私の新しい出力はすべてintですが、前と同じように繰り返されます。 –

+0

少し質問を編集しました。 –

答えて

0

このようなものは私のために働く。私は `PIL.Image`インスタンスをインデックスに関するドキュメント、およびそれ以降のすべてを見つけることができません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 
関連する問題