Ошибка индекса: индекс 512 выходит за пределы оси 0 с размером 512 - PullRequest
0 голосов
/ 19 марта 2020

Итак, я пытаюсь воспроизвести «дизеринг Флойда-Стейнберга» на изображении в python, и пока что это то, что у меня есть:

import cv2

# returns an array with rgb values of all pixels
x_img = cv2.imread("lenac.tif")

# returns an image with the rgb values turned to black and white
x_img_g = cv2.cvtColor(x_img,cv2.COLOR_BGR2GRAY)



def dither(img):

    col = len(img[0])
    li = len(img)

    print(col)
    print(li)

    for i in range (li):
        for j in range(col):

            oldpixel = img[li][col]
            newpixel = quantificacao(oldpixel)

            print(newpixel)

print(dither(x_img_g))

Так что в основном метод не закончен, и единственное, что он делает, - это прохождение через каждый пиксель черно-белой версии изображения «lena.tif» (очень известное в манипулировании изображениями) и применение к ним метода, называемого «quantificacao», не имеет отношения к вопросу.

Изображение: 512 x 512

Все идет хорошо, пока в определенной точке не появится следующая ошибка:

oldpixel = img[li][col]

IndexError: index 512 is out of bounds for axis 0 with size 512

Оба переменные col и li, как показано, равны 512, поэтому for cycle должен go от 0 до 511, верно?

Следовательно, индексирование только до 511

I ' Я в некотором роде заблудился и был бы чрезвычайно осторожен, если бы кто-то мог мне помочь

Ответы [ 2 ]

1 голос
/ 19 марта 2020

В функции dither вы пытаетесь выполнить итерацию по осям вашего img и извлечь значение в переменную oldpixel. li и col соответствуют размерам массива img; i и j - ваши переменные, которые увеличиваются от 0 до длины каждой оси (обе из которых равны 512). Следовательно, внутри for l oop вы должны использовать эти переменные, а не li и col, то есть:

for i in range(li):
    for j in range(col):
        oldpixel = img[i][j]

Вы можете сделать это более понятным, указав временные переменные li и col:

for i in range (len(img)):
    for j in range(len(img[0])):
        oldpixel = img[i][j]
1 голос
/ 19 марта 2020

конечно, у вас есть эта ошибка, li и col имеют значение 512, а на l oop вы получаете доступ к этому значению. img[li][col] должно быть img[i][j].

...