Как избежать ошибки IndexError "вне допустимого диапазона" во время цикла изображения и доступа к соседним пикселям с указанной координатой c? - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь получить доступ к соседним пикселям указанной координаты c при зацикливании фотографии, чтобы получить цвет RGB, но в некоторых случаях я получаю IndexError: image index out of range. Я пытался избежать этого, используя некоторые условные выражения, но не сработало. Я хотел бы знать, как предотвратить эту ошибку.

img = Image.open('Images/test.jpg')
width, height = img.size
pixel_distance = 1

for x in range(width):
  for y in range(height):

    if y - pixel_distance < 0:
        continue
    if y + pixel_distance < height:
        continue
    if x - pixel_distance < 0:
        continue
    if x + pixel_distance > width:
        continue

    r, g, b = img.getpixel((x, y))  # Center pixel
    r1, g1, b1 = img.getpixel((x, y + pixel_distance))  # Bottom pixel
    r2, g2, b2 = img.getpixel((x, y - pixel_distance))  # Top pixel
    r3, g3, b3 = img.getpixel((x + pixel_distance, y))  # Right pixel
    r4, g4, b4 = img.getpixel((x - pixel_distance, y))  # Left pixel

    r5, g5, b5 = img.getpixel((x + pixel_distance, y + pixel_distance))  # Bottom right pixel
    r6, g6, b6 = img.getpixel((x + pixel_distance, y - pixel_distance))  # Top right pixel
    r7, g7, b7 = img.getpixel((x - pixel_distance, y - pixel_distance))  # Top left pixel
    r8, g8, b8 = img.getpixel((x - pixel_distance, y + pixel_distance))  # Bottom left pixel

Ответы [ 2 ]

1 голос
/ 02 августа 2020

Вам просто нужно, чтобы x и y не доходили до внешних краев изображения. Размер изображения - ширина по высоте. Очевидно, что x, y оба должны быть больше 0. Кроме того, они должны быть меньше ширины и высоты соответственно, НО помните, что в Python что-то вроде X [1: 7] включает первое число, но не второе. Таким образом, x и y должны быть на 2 меньше ширины и высоты соответственно. Попробуйте вместо ваших условий следующее:

if x and y and x + 1 < width and y + 1 < height:
    # Indent and put in all the image stuff here:

0 голосов
/ 02 августа 2020

Возможно, вам стоит изменить оператор диапазона. если вы добавляете 1 к x, а x - максимальное значение вашего массива, вы находитесь вне диапазона. Возможно, вам стоит использовать диапазон вроде: range (1, width-1). То же для y.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...