[英]Save 16-bit numpy arrays as 16-bit PNG image
我正在嘗試將 16 位 numpy 數組保存為 16 位 PNG,但我獲得的只是一張黑色圖片。 我在這里放了一個我正在談論的最低限度的例子。
im = np.random.randint(low=1, high=6536, size=65536).reshape(256,256) #sample numpy array to save as image
plt.imshow(im, cmap=plt.cm.gray)
鑒於上面的 numpy 數組,這是我用 matplotlib 看到的圖像,但是當我將圖像保存為 16 位 png 時,我獲得了下面的圖片:
import imageio
imageio.imwrite('result.png', im)
圖像保存:
其中一些淺灰色斑點是可見的,但圖像基本上是黑色的。 無論如何,當我讀回圖像並使用 matplotlib 再次對其進行可視化時,我看到了相同的起始圖像。 我還嘗試了其他庫而不是imageio
(如PIL
或PyPNG
),但結果相同。
我知道 16 位圖像值的范圍從 0 到 65535,在數組 numpy 數組中,這里只有 1 到 6536 的值,但我需要保存與此類似的 numpy 數組圖像,即圖像中表示的最大值是'不是最大的可表示值。 我認為保存過程中涉及某種規范化。 我需要完全按照我在 matplotlib 中看到的最大分辨率保存數組,並且不壓縮或縮小它們的值(因此除以 255 或轉換為 8 位數組是不合適的)。
它看起來像imageio.imwrite
會做正確的事情,如果你轉換數組的數據類型numpy.uint16
寫PNG文件之前:
imageio.imwrite('result.png', im.astype(np.uint16))
當我這樣做時, result.png
是一個 16 位灰度 PNG 文件。
如果您希望圖像具有從黑色到白色的完整灰度范圍,則必須將值縮放到范圍 [0, 65535]。 例如:
im2 = (65535*(im - im.min())/im.ptp()).astype(np.uint16)
然后你可以用
imageio.imwrite('result2.png', im2)
要將 NumPy 數組寫入 PNG 文件,另一種方法是numpngw
(我創建的包)。 例如,
from numpngw import write_png
im2 = (65535*(im - im.min())/im.ptp()).astype(np.uint16)
write_png('result2.png', im2)
如果您已經使用imageio
,有可能是無顯着優勢,使用numpngw
。 然而,它比imageio
依賴要輕得多—— imageio
依賴於 NumPy(不依賴於 PIL/Pillow 也不依賴於libpng
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.