Количество каналов в изображении pil (pillow) - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь найти способ получить количество каналов изображения с помощью Подушки.Это кажется довольно тривиальным, но я не смог найти (простой ответ).

Я знаю, что могу обойти это с незначительными накладными расходами, такими как (2 варианта мысли):

  • Конвертироватьпроверить и проверить array.shape
  • Проверить image.size[0]*image.size[1] против len(image.getdata())

, поэтому я не очень заинтересован в поиске рабочего решения, а скорее в достижении этого с помощью подушки.

Код, который я использую, прост:

from PIL import Image

image = Image.open(image_path)
image.size  # <- this gives the size of the image but not the channel as in numpy.

(609, 439)

Я также нашел этот подход, вдохновленный этим ответ (что, конечно, тоже накладные расходы):

num_channel = len(image.split())

Мне кажется странным, что я не могу найти этот простой ответ.

1 Ответ

0 голосов
/ 21 декабря 2018

Я решил ответить на свой собственный вопрос (хотя я в основном суммирую комментарий @cryptonome).

Ну, когда дело доходит до PIL, варианты, которые я получаю:

  • image.mode: возвращает строку, содержащую режим чтения данных.Типичные значения "RGB" и "L" для изображений RGB и оттенков серого соответственно.Здесь представлены режимы .
  • im2.info: возвращает подсказку, содержащую различную информацию об изображении.Это специфический формат изображения.Например, для изображений jpg он (возможно) содержит поля с ключами: dpi, jfif, jfif_density, exif и т. Д. Более подробную информацию о jpg изображениях можно найти здесь .
  • image.getbands(): возвращает кортеж (даже один элемент), содержащий все различные каналы, присутствующие в данных.Для типичного изображения RGB это будет ('R', 'G', 'B'), а для типичного изображения в оттенках серого будет ('L',).

Так что, исходя из вышеизложенного, на мой взгляд, более кратким методом будетсравните image.mode со строками L и RGB, чтобы определить, является ли изображение серым или нет, или если количество каналов (как в этом вопросе) является основным вопросом, тогда простой len(image.getbands()) сделает эту работу.

Обычно len(image.mode) совпадает с len(image.getbands()) и может использоваться вместо него, но поскольку существует хотя бы один режим YCbCr, который содержит 5 символов, но только 3 канала (3x8-битные пиксели, цветформат видео) безопаснее использовать len(image.getbands()) наверное

...