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
'numpy.ndarray' object has no attribute 'read'
提问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.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.
正如文档所说,传递给的参数Image.open
必须实现read
,seek
和tell
方法。您正在传递由 OpenCv 生成的 numpy 数组,当它需要文件名、StringIO 实例或文件对象时。
I think you can replace the offending Image.open
call with Image.fromarray
and this will take the numpy array as input. i.e.:
我认为你可以用 替换有问题的Image.open
调用,Image.fromarray
这将把 numpy 数组作为输入。IE:
im = Image.fromarray(resizelist[val])