Ошибка «индекс вне диапазона», но не вне диапазона. PIL IMAGE CREATE - PullRequest
0 голосов
/ 21 декабря 2018

У меня странная проблема с моим кодом Python.Я передаю цветное изображение в черно-белое изображение.

Я использую PIL для работы с изображениями, это моя функция:

class ImageEffects():

    def __init__(self, h, w, img):
        self.h = h
        self.w = w
        self.img = img

    def grayScale(self):
        ret = [[(0, 0, 0) for x in range(self.h)] for y in range(self.w)]
        last = []
        try:
            for y in range(self.h):
                for x in range(self.w):
                    if self.inside(x, y):
                        pixel = self.img[x, y]
                        newColor = int((pixel[0] + pixel[1] + pixel[2])/3)
                        ret[y][x] = (newColor, newColor, newColor)
                        last = [x, y, self.inside(x, y), self.h, self.w]
        except Exception as err:
            print(err)
            print(last)
        return np.array(ret, dtype=np.uint8)

    def inside(self, x, y):
        return 0 <= x < self.w and 0 <= y < self.h

Я использовал некоторые попытки, кроме какпонять проблему.Теперь я вызываю это следующим образом:

im = Image.open(destination) # open the image to work
matrixImg = im.load()
h, w = im.size # size images            
newEffects = ImageEffects(h, w, matrixImg)
gray = newEffects.grayScale()
new_image = Image.fromarray(gray)
destination = "/".join([target, userId, "gray_" + fileHashed])
new_image.save(destination)

Попробуйте с этим образом: (https://i.imgur.com/XuwgsC3.jpg) Я получил (https://i.imgur.com/4jpgrzm.png), и это мой журнал исключений в консоли:

image index out of range # first print exception in grayscale function
[1114, 1114, True, 1280, 1115] # second print exception in grayscale function

Но я не понимаю, почему индекс выходит за пределы диапазона.

Может быть, я так устал, что не вижу ошибки, но не могли бы вы мне помочь? Спасиботак много, ребята!

ОБНОВЛЕНИЕ: Я ПОЛУЧИЛ РЕШЕНИЕ!

class ImageEffects():

def __init__(self, size, img):
    self.size = size
    self.img = img

def grayScale(self):
    ret = [[(0, 0, 0) for x in range(self.size[0])] for y in range(self.size[1])]
    last = []
    try:
        pixels = self.img.load()
        for x in range(self.size[0]):
            for y in range(self.size[1]):
                if self.inside(x, y):
                    pixel = pixels[x, y]
                    newColor = abs(int((pixel[0] + pixel[1] + pixel[2])/3))
                    ret[y][x] = (newColor, newColor, newColor)
                    last = [x, y, self.inside(x, y), self.size]
    except Exception as err:
        print(last)
        print(err)
    return np.array(ret, dtype=np.uint8)

def inside(self, x, y):
    return 0 <= x < self.size[0] and 0 <= y < self.size[1]

Это работает, я передаю объект "Image.open (file)" в img param класса ImageEffects. ЗатемЯ не знаю, где большая разница между двумя кодами.

...