python - int'对象没有属性 '__getitem__'

标签 python image python-2.7 image-processing computer-vision

我是 python 的初学者,正在尝试通过测试 test_pic 和包含图像的数据库来查找图像之间的相似性。我已经从目录传递了图像并使用 SIFT 功能对其进行了比较

from PIL import Image
from PIL import ImageStat
from PIL import ImageFilter
import os

def get_imlist(path):
    """    Returns a list of filenames for 
        all jpg images in a directory. """

    return [os.path.join(f) for f in os.listdir(path) if f.endswith('.png')]

def fe(file_name):
    im = Image.open(file_name)
    im = im.convert('L')
    w, h = 300, 300
    im = im.resize((w, h))
    imst = ImageStat.Stat(im)
    sr = imst.mean[0]
    def foo(t):
        if t < sr * 2 / 3: return 0
        if t <= sr: return 1
        if t < sr * 4 / 3: return 2
        return 3
    im = im.point(foo)
    res = [[0] * 4 for i in range(10)]
    for y in range(h):
        for x in range(w):
            k = im.getpixel((x, y))
            res[y / 60][k] += 1
            res[x / 60 + 5][k] += 1
    return res

def ff(file_name):
    im = Image.open(file_name)
    im = im.convert('L')
    w, h = 300, 300
    im = im.resize((w, h))
    im = im.filter(ImageFilter.FIND_EDGES)
    sr = ImageStat.Stat(im).mean[0]
    res = 0
    for i in range(h):
        for j in range(w):
            if im.getpixel((j, i)) > sr:
                res += 1
    #im.show()
    return res

test_pic = '128.png' #testing this pic against all pics in our db;
path='D:/ex'
imlist=[]
db=[]
imlist=get_imlist(path)
for file in imlist:
    x = [0, file]
    db.append(x)  
z = [fe(db[i][1]) for i in range(len(db))]
test_z = fe(test_pic)
for k in range(len(db)):
    for i in range(10):
        for j in range(4):
            db[k][0] += abs(z[k][i][j] - test_z[i][j])
db.sort()

print
print '1st-line sifting [by fe()]'
print '--------------------'
print test_pic
print '--------------------'
for k in range(len(db)):
    if db[k][0] < 20 * 3600:
        print '%12s %7.2f' % (db[k][1], db[k][0] / 3600.0,)
    else:
        break
print '--------------------'
print
print
print '2nd-line sifting [by ff()]'
print '--------------------'
print test_pic
print '--------------------'
test_t = ff(test_pic)
for k in range(len(db)):
    if db[k][0] < 5 * 3600:
        print '%12s' % (db[k][1],)
    elif db[k][0] < 20 * 3600:
        t = ff(db[k][1])
        if abs(t - test_t) * 200.0 / (t + test_t) < 20:
            print '%12s' % (db[k][1],)
    else:
        break
print '--------------------'

raw_input('\nPress...\n')

最佳答案

猜测:

db = [0,file]
i = 0
z = [fe(db[i][1]) for i in range(len(db))]
      # ^ here

i == 0时,db[i] == 0。然后,您尝试索引到一个整数 - 0[1] - 它在幕后有效地调用 0.__getitem__(1)。整数不实现 __getitem__,因此此操作会失败并出现您所看到的错误。

<小时/>

您的代码修订似乎有点奇怪,为什么:

for file in imlist:
    db = [[0,file]]   
    z = [fe(db[i][1]) for i in range(len(db))]

不仅仅是:

for file in imlist:
    z = [fe(file)]

但是,如果没有完整的回溯,就很难准确诊断您的错误。

关于python - int'对象没有属性 '__getitem__',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22454007/

相关文章:

python-2.7 - 使 Python 脚本全局可执行

Python 非特定写入异常

excel - 传说中的pandas python中的"None"

python - 如何在 python 中将整数日增加 5 天

python - Pandas 和 matplotlib : Different fonts between showfig and savefig (mac os x backend)

python - 自动调用按钮命令

html - css 会应用在这个特定场景中吗?

c++ - 将 C++ 中的 RGB 值数组转换为图像文件的最简单方法是什么?

python - 将 Matplotlib 与 tkinter (TkAgg) 结合使用

performance - 谷歌地图是如何工作的?