[SOLVED] 'numpy.ndarray' object has no attribute 'read'

Issue

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

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.

Thanks in advance!

Solution

So from 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))

As the documentation says, the argument passed to Image.open must implement read,seek and tell methods. You are passing a numpy array generated by OpenCv, when it is expecting a filename, StringIO instance or file object.

I think you can replace the offending Image.open call with Image.fromarray and this will take the numpy array as input. i.e.:

im = Image.fromarray(resizelist[val])

Answered By – ebarr

Answer Checked By – David Goodson (BugsFixing Volunteer)

Leave a Reply

Your email address will not be published. Required fields are marked *