您好我在https://github.com/gskielian/PNG-2-CIFAR10/blob/master/convert-images-to-cifar-format.py
中找到了此代码我想以这种格式转换我的图像数据集,但是我收到错误:
data.append(pix[x,y][color])
TypeError: 'int' object has no attribute '__getitem__'
我是python的初学者,我不知道错误,请帮帮我
`#python script for converting 32x32 pngs to format
from PIL import Image
import os
from array import *
data = array('B')
for dirname, dirnames, filenames in os.walk('./classes'):
for filename in filenames:
if filename.endswith('.png'):
################
#grab the image#
################
im = Image.open(os.path.join(dirname, filename))
pix = im.load()
#print(os.path.join(dirname, filename))
#store the class name from look at path
class_name = int(os.path.join(dirname).split('/')[-1])
#print class_name
###########################
#get image into byte array#
###########################
# create array of bytes to hold stuff
#first append the class_name byte
data.append(class_name)
#then write the rows
#Extract RGB from pixels and append
#note: first we get red channel, then green then blue
#note: no delimeters, just append for all images in the set
for color in range(0,3):
for x in range(0,32):
for y in range(0,32):
data.append(pix[x,y][color])
############################################
#write all to binary, all set for cifar10!!#
############################################
output_file = open('cifar10-ready.bin', 'wb')
data.tofile(output_file)
output_file.close()
`
答案 0 :(得分:0)
您的收藏中至少有一个图像是“单波段”图像。
__getitem__
method of a PixelAccess object为单波段图像返回单个整数,或为多波段图像返回元组。 __getitem__
是一个“魔术”方法名称:如果对象obj
有一个名为__getitem__
的方法,那么您可以将obj[something]
写为obj.__getitem__(something)
。因此,可以编写pix[x,y]
而不是pix.__getitem__((x,y))
。
四个三波段RGB图像,pix[x,y]
返回一个3元组的整数,表示像素处的颜色(x
,y
)。因此pix[x,y][color]
返回这三个中的一个。对于单波段图像,pix[x,y]
返回单个整数,尝试在整数上调用__getitem__
没有意义,因此pix[x,y][color]
将抛出异常。
您找到的脚本似乎只能处理三波段RGB图像(也许是四波段RGBA图像,忽略A通道)。正如您所见,单频段图像失败了。它可能会成功,但会返回CMYK或YCbCr图像的错误结果。幸运的是,对这些问题的修复似乎相当简单:如果im
不是RGB或RGBA图像,请将其转换为1。通过添加以下两行
if im.mode not in ("RGB", "RGBA"):
im = im.convert("RGB")
立即
im = Image.open(os.path.join(dirname, filename))