簡體   English   中英

使用 PIL 進行像素編碼

[英]pixel encoding using PIL

我有一個天真的問題,但經過漫長的一天后,我仍然無法得到答案。 我目前正在使用 PIL 加載我的 png 圖像,它運行良好。 但是,我的一些 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 模塊獲取圖像深度的方法?

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>

如果你真的,真的卡住了,不能/不會安裝OpenCVpyvips ,你有幾個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

您將在channel-0.png獲得紅色通道作為 16 位圖像,您可以使用PIL/Pillow打開它,綠色channel-1.pngchannel-1.png ,藍色channel-2.pngchannel-2.png

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM