2016-12-09 33 views
1

我需要使用Python 2從磁盤讀取單通道32位整數TIFF圖像以執行一些圖像分析。我試圖image.imread從matplotlib,但我無法獲取代碼的工作,因爲數據被讀取爲4通道8位整數圖像:如何使用matplotlib讀取32位整數圖像?

>>> import numpy as np 
>>> import matplotlib.image as mpimg 
>>> img = mpimg.imread('my_image.tif') 
>>> img.shape 
(52, 80, 4) 
>>> img[0:2, 0:2] 
array([[[255, 255, 255, 255], 
     [255, 255, 255, 255]], 

     [[255, 255, 255, 255], 
     [255, 255, 255, 255]]], dtype=uint8) 

問題:是否可以讀取單通道32位整數圖像使用matplotlib?

我知道有從PIL的替代方式來讀取在Python這樣的圖像,例如使用Image.open

>>> from PIL import Image 
>>> img = np.asarray(Image.open('my_image.tif')) 
>>> img.dtype 
dtype('int32') 
>>> img.shape 
(52, 80) 
>>> img[0:2, 0:2] 
array([[8745, 8917], 
     [8918, 9479]]) 

另一種可能性是使用io.imread從scikit學習:

>>> from skimage import io 
>>> img = io.imread('my_image.tif') 

另一種方法是利用來自OpenCV的imread函數。但是,在這種情況下數據都將被強制轉換爲32位整數:

>>> import cv2 
>>> img = cv2.imread('my_image.tif', -1) 
>>> img[0:2, 0:2] 
array([[ 1.22543551e-41, 1.24953784e-41], 
     [ 1.24967797e-41, 1.32829081e-41]], dtype=float32) 
>>> img.dtype = np.int32 
>>> img[0:2, 0:2] 
array([[8745, 8917], 
     [8918, 9479]]) 
+2

另一種選擇是[tifffile](https://pypi.python.org/pypi/tifffile)包。 –

+0

Matplotlib主要用於數據可視化,而不是數據生成。 'imread'是一個有其侷限性的便利功能。由於有很多專門的圖像處理工具可用,因此matplotlib中不需要這種特殊情況處理。 – ImportanceOfBeingErnest

回答

1

this tutorial,有沒有辦法使用matplotlib讀取32位整數圖像:

Matplotlib繪圖可以處理float32和uint8,但對於除PNG以外的任何格式的圖像讀/寫僅限於uint8數據。

僅供參考,我發現基於ndimage.imread從SciPy的多了一個解決辦法:

from scipy import ndimage 
img = ndimage.imread('my_image.tif', mode='I') 

基於tifffile(由@Warren Weckesser建議)的方法也能正常工作:

from tifffile import TiffFile 

with TiffFile('my_image.tif') as tif: 
    img = tif.asarray()