TypeError: объект 'int' не поддерживает назначение элементов. Почему? - PullRequest
0 голосов
/ 30 января 2020

Почему я получаю эту ошибку? Я пытаюсь вывести изображение в виде вложенного списка значений RGB. Python между прочим.

def imgRGB(im):
        width, height = im.size

        #create matrix
        matrix = []
        for i in range(height):
            matrix.append([0, 0, 0] * width)

        #get the rgb values
        for x in range(width):
            for y in range(height):
                r,g,b = im.getpixel((x,y))
                matrix[x][y][0] = r
                matrix[x][y][1] = g
                matrix[x][y][2] = b
        return matrix

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Вы получаете эту ошибку, потому что вы пытаетесь сделать три слоя поиска в структуре, которая имеет глубину всего два слоя.

Чтобы сохранить вашу структуру на двух уровнях глубиной и исправить ваш код, может выглядеть так:

def imgRGB(im):
        width, height = im.size

        #create matrix
        matrix = []
        for i in range(height):
            matrix.append([0, 0, 0] * width)

        #get the rgb values
        for x in range(width):
            for y in range(height):
                r,g,b = im.getpixel((x,y))
                matrix[x][y*3+0] = r
                matrix[x][y*3+1] = g
                matrix[x][y*3+2] = b
        return matrix

Кстати, лично я бы использовал одномерный массив numpy в качестве matrix, а не какой-либо список Python вообще, и доступ с помощью что-то вроде matrix[(y*height) + x + subpixel_offset], где subpixel_offset равно 0/1/2 для r / g / b. Или, в зависимости от ваших шаблонов доступа, вы можете поместить смещение r / g / b в другое место и умножить на него (x * y).

В любом случае, выделение памяти и сбор мусора намного меньше необходимо, а для доступа требуется только (очень быстрая) арифметика указателя c.

2 голосов
/ 30 января 2020

[0,0,0] * width - это список с 3*width целыми числами, а не список из 3-х элементов.

Вы хотите

matrix.append([[0,0,0] for _ in range(width)])

вместо.

...