кодирование пикселей с использованием PIL - PullRequest
1 голос
/ 27 марта 2020

У меня наивный вопрос, но после долгого дня я все еще не могу получить ответ. В настоящее время я загружаю свое изображение в формате png, используя PIL, оно работает хорошо. Тем не менее, некоторые из моих изображений PNG являются 16-битными на пиксель. Я отчаянно пытаюсь запросить эту информацию, но я не могу ее получить, используя PIL. Действительно, если я просто использую системный двоичный файл file, он работает.

$ file flower_16b.png 
flower_16b.png: PNG image data, 660 x 600, 16-bit/color RGB, non-interlaced

Однако в моем коде python:

img = Image.open(filename, "r")
print(img.mode)

я получаю RGB. Следуя документации PIL RGB означает (3x8-битные пиксели, истинный цвет), похоже, что изображение было брошено. Так существует ли способ получить глубину изображения, используя PIL или другой модуль python?

1 Ответ

3 голосов
/ 27 марта 2020

PIL / Pillow не поддерживает 48-битные подобные изображения. Один из вариантов может быть OpenCV , но имейте в виду, что это BGR, а не RGB:

import cv2

# Read with whatever bit depth is specified in the image file
BGR = cv2.imread('image.png', cv2.IMREAD_ANYDEPTH|cv2.IMREAD_ANYCOLOR)

# Check dtype and number of channels
print(BGR.dtype, BGR.shape)

dtype('uint16'), (768, 1024, 3)

Другой вариант может быть pyvips, который работает немного по-другому, но имеет некоторые хорошие преимущества:

import pyvips

im = pyvips.Image.new_from_file('image.png', access="sequential")

print(im)
<pyvips.Image 1024x768 ushort, 3 bands, rgb16>

Если вы действительно, действительно застряли и не можете / не можете установить OpenCV или pyvips , у вас есть * еще пара опций с ImageMagick ...

Вы можете уменьшить ваши 3 канала RGB (16 бит каждый) до 3 каналов RGB (8 бит каждый) с помощью:

magick input.png PNG24:output.png      # then open "output.png" with PIL

Или вы можете разделить 3 канала RGB на 3 отдельных 16-разрядных файла и обработать их отдельно с помощью PIL / Pillow :

magick input.png -separate channel-%d.png

, и вы получите красный канал в виде 16-битного изображения в channel-0.png, который можно открыть с помощью PIL / Pillow , зеленый как channel-1.png и синий как channel-2.png

...