[英]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>
如果你真的,真的卡住了,不能/不會安裝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
您將在channel-0.png
獲得紅色通道作為 16 位圖像,您可以使用PIL/Pillow打開它,綠色channel-1.png
為channel-1.png
,藍色channel-2.png
為channel-2.png
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.