'numpy.ndarray'对象没有属性'read'

时间:2014-04-07 07:45:12

标签: python numpy

我试图将函数中声明的变量用于另一个函数。但是当我这样做时,我遇到了这样的错误:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\HP\AppData\Local\Enthought\Canopy32\App\appdata\canopy-1.0.3.1262.win-x86\lib\lib-tk\Tkinter.py", line 1410, in __call__
return self.func(*args)
File "D:\6th sem\Major project\Code\frame.py", line 198, in result
im = Image.open(resizelist[val])
File "E:\Canopy\System\lib\site-packages\PIL\Image.py", line 1956, in open
prefix = fp.read(16)
AttributeError: 'numpy.ndarray' object has no attribute 'read'

我的代码是:

def messageWindow():
  win = Toplevel()
  path = 'C:\Users\HP\Desktop\dataset'
  COLUMNS = 12
  image_count = 0
  for infile in glob.glob(os.path.join(path, '*.jpg')):
    image_count += 1
    r, c = divmod(image_count, COLUMNS)
    im = Image.open(infile)
    resized = im.resize((100, 100), Image.ANTIALIAS)
    tkimage = ImageTk.PhotoImage(resized)
    myvar = Label(win, image=tkimage)
    myvar.image = tkimage
    myvar.grid(row=r, column=c)
  i=0
  cont_list = list()
  ene_list = list()
  homo_list = list()
  cor_list = list()
  dis_list = list()
  B_mean = list()
  G_mean = list()
  R_mean = list()
  piclist = list()
  graylist = list()
  resizelist = list()
  eq_graylist = list()

 for infile in glob.glob(os.path.join(path,'*.jpg')):
    imge = cv2.imread(infile)
    arr = array(imge)
    piclist.append(imge)

    g_img = cv2.imread(infile,0)
    gray_re_img = cv2.resize(g_img,(256,256))
    graylist.append(gray_re_img)

    equ = cv2.equalizeHist(gray_re_img)
    eq_graylist.append(equ)

    re_img = cv2.resize(imge,(256,256))
    resizelist.append(imge)
    i = i + 1

 for infiles in glob.glob(os.path.join(path,'*.jpg')):
    img = cv2.imread(infiles)
    blue, green, red = cv2.split(img)
    total = img.size
    B = sum(blue) / total
    G = sum(green) / total
    R = sum(red) / total
    B_mean.append(B)
    G_mean.append(G)
    R_mean.append(R)

    im = skimage.io.imread(infile, as_grey=True)
    im = skimage.img_as_ubyte(im)
    im /= 32
    g = skimage.feature.greycomatrix(im, [1], [0], levels=8, symmetric=False, normed=True)
    cont = skimage.feature.greycoprops(g, 'contrast')[0][0]
    cont_list.append(cont)
    ene = skimage.feature.greycoprops(g, 'energy')[0][0]
    ene_list.append(ene)
    homo = skimage.feature.greycoprops(g, 'homogeneity')[0][0]
    homo_list.append(homo)
    cor = skimage.feature.greycoprops(g, 'correlation')[0][0]
    cor_list.append(cor)
    dis = skimage.feature.greycoprops(g, 'dissimilarity')[0][0]
    dis_list.append(dis)

 feature_matrix_db = zip( B_mean , G_mean , R_mean, cont_list , ene_list , homo_list , cor_list, dis_list)
 blue2.set(B_mean)
 green2.set(G_mean)
 red2.set(R_mean)
 con2.set(cont_list)
 ene2.set(ene_list)
 homo2.set(homo_list)
 corr2.set(cor_list)
 diss2.set(dis_list)        
 return(feature_matrix_db,resizelist)

def OPEN():
  path=tkFileDialog.askopenfilename(filetypes=[("Image File",'.jpg')])
  custName.set(path)
  im = Image.open(path)
  resized = im.resize((200, 200),Image.ANTIALIAS)
  tkimage = ImageTk.PhotoImage(resized)
  myvar=Label(root,image = tkimage)
  myvar.image = tkimage
  myvar.pack()
  myvar.place(x = 30, y = 100) 
  graylist1 = list()
  resizelist1 = list()
  eq_graylist1 = list()
  cont_list1 = list()
  ene_list1 = list()
  homo_list1 = list()
  cor_list1 = list()
  B_mean1 = list()
  G_mean1 = list()
  R_mean1 = list()
  dis_list1 = list()

  imge = cv2.imread(path)
  arr = array(imge)
  g_img = cv2.imread(path,0)
  gray_re_img = cv2.resize(g_img,(256,256))
  graylist1.append(gray_re_img)

  equ = cv2.equalizeHist(gray_re_img)
  eq_graylist1.append(equ)

  re_img = cv2.resize(imge,(256,256))
  resizelist1.append(re_img)

  blue, green, red = cv2.split(re_img)
  total = re_img.size
  B = sum(blue) / total
  G = sum(green) / total
  R = sum(red) / total
  B_mean1.append(B)
  G_mean1.append(G)
  R_mean1.append(R)

  im = skimage.io.imread(path, as_grey=True)
  im = skimage.img_as_ubyte(im)
  im /= 32
  g = skimage.feature.greycomatrix(im, [1], [0], levels=8, symmetric=False, normed=True)
  cont = skimage.feature.greycoprops(g, 'contrast')[0][0]
  cont_list1.append(cont)
  ene = skimage.feature.greycoprops(g, 'energy')[0][0]
  ene_list1.append(ene)
  homo = skimage.feature.greycoprops(g, 'homogeneity')[0][0]
  homo_list1.append(homo)
  cor = skimage.feature.greycoprops(g, 'correlation')[0][0]
  cor_list1.append(cor)
  dis = skimage.feature.greycoprops(g, 'dissimilarity')[0][0]
  dis_list1.append(dis)

 feature_matrix_ip = zip( B_mean1 , G_mean1 , R_mean1, cont_list1 , ene_list1 , homo_list1 , cor_list1 , dis_list1)
 blue1.set(B_mean1)
 green1.set(G_mean1)
 red1.set(R_mean1)
 con1.set(cont_list1)
 ene1.set(ene_list1)
 homo1.set(homo_list1)
 corr1.set(cor_list1)
 diss1.set(dis_list1)
 return(feature_matrix_ip)

def result():
  COLUMNS = 12
  image_count = 0
  resultlist_key = []
  result_list = list()
  i = 0
  a_list = list()
  b_list = list()
  a_list.append(feature_matrix_ip)
  while i < 70:
     b_list.append(feature_matrix_db[i])
     dist = distance.euclidean(a_list,b_list[i])
     result_list.append(dist)
     resultlist_key = OrderedDict(sorted(enumerate(result_list),key=lambda x: x[0])).keys()
     i = i + 1 

 res_lst_srt = {'values': result_list,'keys':resultlist_key}
 res_lst_srt['values'], res_lst_srt['keys'] = zip(*sorted(zip(res_lst_srt['values'], res_lst_srt['keys'])))
 key = res_lst_srt['keys']

 for i1,val in enumerate(key):
     if i1 < 4:
         image_count += 1
         r, c = divmod(image_count, COLUMNS)
         im = Image.open(resizelist[val]) # <---- This is where the error is coming
         tkimage = ImageTk.PhotoImage(resized)
         myvar = Label(win, image=tkimage)
         myvar.image = tkimage
         myvar.grid(row=r, column=c) 

即使return(feature_matrix_db, resizelist)出现同样的错误。有什么方法可以解决这个问题吗?或者我需要更改我的代码。我已经初始化的一切。正在调用/导入每个必需的标题。

提前致谢!

1 个答案:

答案 0 :(得分:5)

所以来自http://effbot.org/imagingbook/image.htm

  

Image.open(文件)⇒图像

     

Image.open(文件,模式)⇒图像

     

打开并识别给定的图像文件。这是一个懒惰的操作;   该函数读取文件头,但实际的图像数据不是   从文件中读取,直到您尝试处理数据(调用负载   强制装载的方法)。如果给出mode参数,则必须是   “R”。

     

您可以使用字符串(表示文件名)或文件   object作为文件参数。在后一种情况下,文件对象必须   实现read,seek和tell方法,并以二进制模式打开。

     来自PIL导入的

来自PIL导入的图像im = Image.open(&#34; lenna.jpg&#34;)   来自StringIO的图像导入StringIO

     

从字符串im = Image.open(StringIO(data))

中读取数据

正如文档所述,传递给Image.open的参数必须实现readseektell方法。您正在传递由OpenCv生成的numpy数组,当它需要文件名,StringIO实例或文件对象时。

我认为您可以使用Image.open替换有问题的Image.fromarray调用,这会将numpy数组作为输入。即:

im = Image.fromarray(resizelist[val])