簡體   English   中英

將 16 位 numpy 數組保存為 16 位 PNG 圖像

[英]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 (如PILPyPNG ),但結果相同。

我知道 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.

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