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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22906394/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 01:57:31  来源:igfitidea点击:

'numpy.ndarray' object has no attribute 'read'

pythonnumpy

提问by user3483746

I am trying to use the variables declared in the functions to another function. But when I do so, I'm getting this kind of error:

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

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:th 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'

My code is:

我的代码是:

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) 

Even after return(feature_matrix_db, resizelist)its giving the same error. Is there any way to resolve this? Or do I need to change my code. Everything I have initialized. Every required header is being called/ imported.

即使在return(feature_matrix_db, resizelist)它给出相同的错误之后。有没有办法解决这个问题?或者我需要更改我的代码。我已经初始化的一切。正在调用/导入每个必需的标头。

Thanks in advance!

提前致谢!

采纳答案by ebarr

So from http://effbot.org/imagingbook/image.htm

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

Image.open(file) ? image

Image.open(file, mode) ? image

Opens and identifies the given image file. This is a lazy operation; the function reads the file header, but the actual image data is not read from the file until you try to process the data (call the load method to force loading). If the mode argument is given, it must be “r”.

You can use either a string (representing the filename) or a file object as the file argument. In the latter case, the file object must implement read, seek, and tell methods, and be opened in binary mode.

from PIL import Image im = Image.open("lenna.jpg") from PIL import image from StringIO import StringIO

read data from string im = Image.open(StringIO(data))

图像.打开(文件)?图片

Image.open(文件,模式)?图片

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

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

from PIL import Image im = Image.open("lenna.jpg") from PIL import image from StringIO import StringIO

从字符串中读取数据 im = Image.open(StringIO(data))

As the documentation says, the argument passed to Image.openmust implement read,seekand tellmethods. You are passing a numpy array generated by OpenCv, when it is expecting a filename, StringIO instance or file object.

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

I think you can replace the offending Image.opencall with Image.fromarrayand this will take the numpy array as input. i.e.:

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

im = Image.fromarray(resizelist[val])