Обычно изображения имеют цвет RGB, что означает, что у них есть 3 канала: один для красного, один для зеленого и один для синего. Обычно это означает, что каждый пиксель занимает 3 байта памяти, один для красного, один для зеленого и один для синего.
Если у вас есть изображение в режиме P, это означает, что оно палитрировано. Это означает, что в палитре может быть до 256 различных цветов, и вместо сохранения 3 байт для R, G и B для каждого пикселя вы сохраняете 1 байт, который является индексом в палитре. Это дает как преимущества, так и недостатки. Преимущество в том, что вашему изображению требуется 1/3 места в памяти и на диске. Недостатком является то, что он может представлять только 256 уникальных цветов - так что вы можете получить полосы или артефакты.
Если у вас есть изображение в L режиме, это означает, что это изображение с одним каналом, которое обычно интерпретируется как оттенки серого. L Означает, что это просто сохраняет яркость. Он очень компактный, но сохраняет только оттенки серого, а не цвет.
Вы можете определить, какой режим у вашего изображения, посмотрев на:
image.mode
Если ваше изображение имеет палитру, оно будет таким P, или PA если оно также имеет палитру с альфа-каналом. Если ваше изображение в оттенках серого, оно будет в L, или LA если в оттенках серого с альфа-каналом.
Вы конвертируете между ними с помощью функции convert (mode), например, чтобы перейти в режим RGB, используйте:
image.convert('RGB')
Я довольно часто использовал слово "нормально"! Почему? Потому что вы можете делать ненормальные вещи!
Вы можете сохранить серое изображение в формате RGB. Все, что вы делаете, это приравниваете красный компонент к зеленому компоненту, равному синему компоненту (R = G = B), и он будет выглядеть серым, но будет сохранен в неэффективном формате RGB, который занимает в 3 раза больше места, чем могло бы потребоваться в противном случае.
Вы можете сохранить серое изображение в формате P, просто убедитесь, что все элементы палитры имеют R = G = B.
Вот в чем фишка... если вы хотите и ожидаете изображение RGB, вам следует просто преобразовать в RGB при открытии:
im = Image.open("image.jpg").convert('RGB')
таким образом, у вас никогда не возникнет проблем с файлами GIF (которые всегда имеют палитру) или с файлами PNG, которые могут быть палитрой и могут быть оттенками серого или RGB. Обычно у вас не возникнет проблем с изображениями в формате JPEG, потому что они в любом случае почти всегда RGB.
Вот пример для демонстрации. Начните с этого красно-синего градиентного изображения:
Давайте воспользуемся IPython для просмотра в пространстве RGB. Сначала посмотрим на красный канал:
Now you can see that the top row of the image has palette index 15, which, if you look it up in the preceding palette, you will see is Red.
Now let's look at the same image in L mode - remember L means "Luminance" which is just a fancy way of saying "brightness" on a scale of black to white, i.e. greyscale :
# Open into greyscale, or L mode In [1]: im = Image.open('a.png').convert('L')