2016-06-10 68 views
0

獲得numpy的陣列我需要一些灰度TIF文件工作,我一直在使用PIL將其導入爲圖像,並將它們轉換成numpy的數組:解釋從TIF文件

np.array(Image.open(src)) 

我希望有一個透明瞭解這些數組的值究竟與哪些值相對應,特別是不清楚什麼值適合作爲我的圖像的白點或黑點。例如,如果我想將此數組轉換爲浮點數組,其像素值爲1,白色值爲0,黑色爲0,其他值之間爲線性縮放。

我已經嘗試了一些天真的方法,包括按數組中的最大值進行縮放,但打開生成的文件,顏色級別總是存在一些移位。

有沒有任何文件的正確方法來理解存儲在這些tif數組中的值?

回答

1

A TIFF基本上是用於存儲光柵圖形圖像的計算機文件格式。它有很多specs,在網上快速搜索將爲您提供所需的資源。

事情是你使用PIL作爲你的輸入庫。你有數組很可能有uint8數據類型,這意味着你的數據可以在0到255之間的任意位置獲得0到1的色彩範圍工作執行以下操作:

im = np.array(Image.open(src)).astype('float32')/255 

注意到你的陣列將有可能在第三維im[:,:, here]im.shape = (i,j,k))中給出4層。因此,每條跡線im[i,j,:](代表像素)將成爲RGBA值的四元組。

R代表紅色(或紅色),G代表綠色,B代表藍色。 A是alpha通道,它可以讓你獲得透明度(值越低意味着透明度越低,透明度越高)。

它也可以有三層只用於RGB,或者一層如果打算用灰度繪製。

如果你有RGB(或RGBA,但不考慮阿爾法),但需要一個單一的值,你應該明白,有很多不同的方式來做到這一點。在this post @denis建議使用下列配方:

Y = .2126 * R^gamma + .7152 * G^gamma + .0722 * B^gamma 

其中伽馬是2.2多臺PC機。通常的R G B有時被寫成 作爲R'G'B'(R'= Rlin ^(1 /γ))(純粹主義者的舌頭點擊),但是這裏我會放棄'。

最後L* = 116 * Y^1/3 - 16獲得亮度。

我建議你閱讀他的文章。也可以考慮尋找到以下概念:

+0

謝謝您的回答。有一件事在我看來很奇怪,那就是我的numpy數組顯然不是'uint8'數組。數組中的最大值在30000數量級左右,儘管公平,我正在使用16位灰度tif。 –

+0

@FrankWang解釋它比。這是PIL的一個老問題,我認爲它現在可以解決。無論如何,都有解決方案。檢查例如這個鏈接:http://blog.philippklaus.de/2011/08/handle-16bit-tiff-images-in-python/ – armatita