简体   繁体   中英

pixel encoding using PIL

I have a naive question, but after a long day, I am not still able to get my answer. I am currently loading my png image using PIL, it works well. However, some of my png images are 16-bit per pixel. I am trying desperately to query this information, but I am not able to get it, using PIL. Indeed, if I am simply using the file system binary it works.

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

However in my python code:

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

I get RGB . Following the documentation PIL RGB means (3x8-bit pixels, true color), it look likes the image has been casted. So does it exist a way to get the depth of an image, using PIL or an other python module ?

PIL/Pillow doesn't support 48-bit images like that. One option might be OpenCV but be aware it comes as BGR not 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)

Another option may be pyvips , which works a slightly different way, but has some good benefits:

import pyvips

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

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

If you are really, really stuck and can't/won't install OpenCV or pyvips , you have a couple more options with ImageMagick ...

You could reduce your 3 RGB channels (16-bits each) to 3 RGB channels (8-bits each) with:

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

Or, you could separate the 3 RGB channels into 3 separate 16-bit files and process them separately with PIL/Pillow :

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

and you will get the red channel as a 16-bit image in channel-0.png which you can open with PIL/Pillow , the green as channel-1.png and the blue as channel-2.png

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM