PIL, im.getdata () возвращает целые числа вместо кортежей - PullRequest
0 голосов
/ 15 февраля 2019

Я пишу функцию, которая принимает ввод изображения и возвращает список кодов RGB.

im = Image.open('picture.jpg')
pix = list(im.getdata())

pix должен быть списком кортежей RGB.В большинстве случаев это так, но я нашел несколько таких случаев:
[(244,255,255), (100,100,90), (23,0,80), ..., 220, (100,100,100)]

т.е. как-то im.getdata () получает целое число из значений пикселей ??
Аналогичным образом, есть случаи, когда один из элементов в пикселе представляет собой 4-кортеж: (1,0,0,255).Может кто-нибудь объяснить, почему это так?
Как я могу изменить это так, чтобы я получал список только RGB-кортежей изображения?
Буду признателен за любую помощь или руководство!

1 Ответ

0 голосов
/ 15 февраля 2019

Растровые изображения могут быть сохранены различными способами - главным образом, чтобы быть эффективными с точки зрения дискового пространства и полосы пропускания, требуемой для передачи.Вот некоторые из вариантов:

  • RGB триплетов - это наиболее распространенный способ хранения изображений, и вы получаете 3 значения ... 1 красное,1 зеленый и 1 синий для каждого пикселя,

  • RGBA квад - это означает, что у вас есть 4 значения для каждого пикселя ... 1 красный, 1 зеленый, 1 синийи альфа (A) значение, которое указывает, насколько непрозрачный / прозрачный этот пиксель,

  • оттенки серого - это означает, что все пиксели на изображении серые, и вы просто получитеодно значение для каждого пикселя, указывающее, где находится Sts на шкале между чистым черным (0) и чистым белым (255),

  • в палитре - это означает, чтоменее 256 различных цветов в изображении, и вместо того, чтобы хранить каждый из них как 3 байта RGB, вы просто сохраняете один байт для каждого пикселя и используете его для поиска соответствующего значения из встроенной таблицы из 256 значений RGB.Это означает, что вы используете только 1 байт на пиксель вместо 3.

    Несмотря на все это, некоторые изображения используют 8 бит на выборку.некоторые используют 16 бит, некоторые используют 32 бита, а другие используют 64 бита.Также некоторые используют сжатие, а некоторые нет.Но все это независимо и является отдельной проблемой из списка пунктов, которые я сделал выше.

Если вы хотите быть уверены, что всегда получаете 3 значения на пиксель, просто убедитесь, что преобразовали вРежим RGB при открытии:

im = Image.open('picture.jpg').convert('RGB')

Обратите внимание, что вы, возможно, излишне увеличиваете объем памяти, необходимый для хранения изображения (если он отображается в оттенках серого или в цветовой гамме), или вы можете отбрасывать альфа-канал.*

Другой вариант - получить тип изображения и разобраться с различными случаями:

# Open image 
im = Image.open('start.png')                                                                

# Check bands present - e.g. ('R', 'G', 'B')
bands = im.getbands() 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...