'numpy.ndarray'对象没有属性'read' [英] 'numpy.ndarray' object has no attribute 'read'
问题描述
我正在尝试将函数中声明的变量用于另一个函数.但是当我这样做的时候,我得到了这样的错误:
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'
我的代码是:
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)
之后也给出相同的错误.有什么办法可以解决这个问题?还是我需要更改代码.我已初始化的所有内容.每个必需的标头都将被调用/导入.
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.
提前谢谢!
推荐答案
因此来自 http://effbot. org/imagingbook/image.htm
Image.open(文件)⇒图片
Image.open(file) ⇒ image
Image.open(文件,模式)⇒图像
Image.open(file, mode) ⇒ image
打开并标识给定的图像文件.这是一个懒惰的操作; 该函数读取文件头,但实际的图像数据不是 从文件中读取数据,直到尝试处理数据为止(调用负载 强制加载的方法).如果给出了mode参数,则必须为 "r".
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.
来自PIL导入图像im =来自PIL导入的Image.open("lenna.jpg") 图片从StringIO导入StringIO
from PIL import Image im = Image.open("lenna.jpg") from PIL import image from StringIO import StringIO
从字符串im = Image.open(StringIO(data))读取数据
read data from string im = Image.open(StringIO(data))
如文档所述,传递给Image.open
的参数必须实现read
,seek
和tell
方法.您正在传递由OpenCv生成的numpy数组,当它需要文件名,StringIO实例或文件对象时.
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.fromarray
替换有问题的Image.open
调用,这将以numpy数组作为输入.即:
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])
这篇关于'numpy.ndarray'对象没有属性'read'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!