2012-12-16 67 views
3

使用Scipy toimageimsave保存二維Numpy數組(單值)時,像素值與Numpy數組中的像素值不完全一致。相反,有些區域,大部分是邊緣,圖像算法似乎使用某種插值。使用Scipy imsave將Numpy數組保存爲圖像時保留不變數據

是否有一個選項停止插值並保留確切的數據(例如7總是得到RGB(7,7,7)中的一個PNG?

回答

7

如果你有一個二維數組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/modescipy.misc.toimage一個PNG

+0

是否有一些適當的文檔/教程如何做圖像轉換和保存與數據類型,精度和文件格式的PIL? –

+0

@Juh_,有幾個關於PIL圖像轉換的教程(就Google而言),但我對數據類型和精度的瞭解並不多。大多數圖像是24位(每個通道8位,所以'uint8'),因此精度和數據類型的問題並不常見。 – tiago

+0

當使用谷歌搜索時,我發現的所有內容都是基本教程或特定問題,如「16位tiff」。在我的情況下,我有(科學)圖像數據,我喜歡以可查看的格式(即圖像文件)保存,如果可能,會壓縮,但不會失去精度。我很想爲每種情況制定一個最佳保存方法的表格。 –

相關問題