2011-10-07 43 views
6

我想使用TIFF圖像來有效地保存大量測量數據。將它們設置爲mode =「I; 16」(對應於我的16位數據範圍),它們產生2MB文件(〜1000x1000「像素」)。這很好。「我; 16」圖像文件的numpy.array

但是,我有麻煩重新將它們轉換成數組,當分析它們。對於32位數據( - >「I」),numpy.array命令正常工作。在「I; 16」的情況下,結果是具有TIFF作爲[0,0]條目的0D numpy數組。

有沒有辦法讓這個工作?我真的很想避免使用32位圖像,因爲我不需要這個範圍,所以它需要兩倍的硬盤空間(很多很多的測量計劃......)

+1

你能告訴我們代碼如何加載圖像嗎?你在使用PIL的'Image'類嗎? –

+0

我使用Image類,並加載圖像我只是使用Image.open(「im.tif」) – Jakob

+1

PIL bug:http://stackoverflow.com/questions/7247371/python-and-16-bit-tiff – mankoff

回答

6

這應該工作(pillow/PIL解決方案,對於16位圖像慢,見下文)。

from PIL import Image 
import numpy as np 

data = np.random.randint(0,2**16-1,(1000,1000)) 
im = Image.fromarray(data) 
im.save('test.tif') 

im2 = Image.open('test.tif') 
data2 = np.array(im2.getdata()).reshape(im2.size[::-1]) 

由C. Gohlke(非常快)使用tifffile另一種解決方案:

import tifffile 

fp = r'path\to\image\image.tif' 

with tifffile.TIFFfile(fp) as tif: 
    data = tif.asarray() 
+2

我設法以某種方式沒有注意到你的答案之前,我張貼我的。我同意,這是最好的解決方法,但我認爲你需要重新排列整形的大小......它應該是'... reshape(im2.size [:: - 1])' –

+0

謝謝,那很完美 – Jakob

+0

對! im.size =>(寬度,高度),但我們希望我們的numpy數組在(高度,寬度)。感謝您的更正。 – otterb

3

你可以使用GDAL + numpy的/ SciPy的讀取與16位通道數據的光柵圖像:

import gdal 
tif = gdal.Open('path.tif') 
arr = tif.ReadAsArray() 
0

將(ImageJ)TIFF轉換爲8位numpy陣列

im = numpy.array(Image.open('my.tiff')) 
n = (im/numpy.amax(im) * 255).astype(numpy.uint8)