Ошибка выхода за пределы оси в Python с использованием PIL и OpenCV 2 - PullRequest
0 голосов
/ 13 сентября 2018

Я хотел изменить все пиксели изображения на серый цвет (r = g = b = 128), если они находятся в определенном пороговом значении (если значение находится в диапазоне от 50 до 150, измените его).Я импортировал изображение, и при попытке обработать изображение выдает следующую ошибку: IndexError: index 3474 is out of bounds for axis 0 with size 3474 (изображение 3474x4632).

Вот код:

from PIL import Image
import numpy as np

image = Image.open("texture.jpg")
w, h = image.size
print ("%d %d" % (w, h)) #to be sure what the width and height are
im = np.array(image)
for x in range(0, w):
    for y in range(0, h):
        if (im[x][y][0] <= 150 and im[x][y][0] >= 50):
            im[x][y][0] = 128
            im[x][y][1] = 128
            im[x][y][2] = 128

cv2.imwrite("image2.jpg", im)

А вот изображение, которое я пытаюсь преобразовать: https://ibb.co/hnjq4p (слишком большой, чтобы загрузить его здесь).Есть идеи о том, почему это не работает?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Я считаю, что numpy меняет порядок оси в PIL.На самом деле первый индекс это строки.Так что вместо этого вы должны перебирать w,h = im.shape или h,w = image.size.Может быть, вы можете проверить, что это правильно, сравнив image.size и im.shape?

Тем не менее, будет намного лучше, если вы не зацикливаетесь.Вы можете использовать маскирование и трансляцию для выполнения задачи цикла, например:

im[(im[...,0]<=150)&(im[...,0]>=50)] = 128 # will modify im in place 

Это будет намного быстрее, особенно на таких больших изображениях.

Обратите внимание, что это проверяет только первый канал изображения между 150 и 50. Это то, что говорит ваш цикл for, так что я думаю, это то, что вы хотите.

0 голосов
/ 13 сентября 2018

Пожалуйста, отметьте im.shape: вы должны индексировать свои пиксели как im[y,x] после преобразования в numpy.array.

...