使用Scipy toimage
或imsave
保存二維Numpy數組(單值)時,像素值與Numpy數組中的像素值不完全一致。相反,有些區域,大部分是邊緣,圖像算法似乎使用某種插值。使用Scipy imsave將Numpy數組保存爲圖像時保留不變數據
是否有一個選項停止插值並保留確切的數據(例如7總是得到RGB(7,7,7)中的一個PNG?
使用Scipy toimage
或imsave
保存二維Numpy數組(單值)時,像素值與Numpy數組中的像素值不完全一致。相反,有些區域,大部分是邊緣,圖像算法似乎使用某種插值。使用Scipy imsave將Numpy數組保存爲圖像時保留不變數據
是否有一個選項停止插值並保留確切的數據(例如7總是得到RGB(7,7,7)中的一個PNG?
如果你有一個二維數組numpy的,那麼你就節省了到一個灰度PNG,所以你永遠不會得到一個RGB圖像(只有一個通道)我不確定你的意思是單個值,也許它是單精度浮點數?雖然PIL支持單精度浮點數,但PNG不。 PNG您可以使用每通道8位(默認)或每通道16位,這意味着您的陣列將被縮放到最大2^8/2^16(8/16位),並轉換爲整數,正是在這種轉換中,結果可能會有所不同。由於scipy.misc.image
似乎沒有選擇保存爲16位,所以它會一直寫入一個8位PNG。但是您可以使用scipy.misc.toimage
創建一個16位圖像,只需確保通過mode='I'
即可。還要確保指定數組最小和最大值以避免縮放。以下是如何用它來保存一個16位PNG:
import numpy as np
import scipy.misc
a = np.random.uniform(0, 2**16 - 1, (500, 500)).astype('int32')
img = scipy.misc.toimage(a, high=np.max(a), low=np.min(a), mode='I')
img.save('my16bit.png')
# check that you got the same values
b = scipy.misc.imread('my16bit.png')
b.dtype
# dtype('int32')
np.array_equal(a, b)
# True
注意,在這個例子中,我使用int32
數據類型。但是,數據必須符合uint16
。如果您輸入負值或大於2^16的值,那些將被保存到PNG中。相反,即使sp.misc.imread
的讀數爲int32
,數據永遠不會超過uint16
。
總結:如果你想準確地寫相同numpy的數組,你需要確保它是uint8/uint16
類型,你傳遞正確high/low/mode
到scipy.misc.toimage
一個PNG。
是否有一些適當的文檔/教程如何做圖像轉換和保存與數據類型,精度和文件格式的PIL? –
@Juh_,有幾個關於PIL圖像轉換的教程(就Google而言),但我對數據類型和精度的瞭解並不多。大多數圖像是24位(每個通道8位,所以'uint8'),因此精度和數據類型的問題並不常見。 – tiago
當使用谷歌搜索時,我發現的所有內容都是基本教程或特定問題,如「16位tiff」。在我的情況下,我有(科學)圖像數據,我喜歡以可查看的格式(即圖像文件)保存,如果可能,會壓縮,但不會失去精度。我很想爲每種情況制定一個最佳保存方法的表格。 –