web-dev-qa-db-ja.com

python

.tifファイルに少し問題があります。私が回避できないのはマイナーな問題だと確信しています(覚えておいてください、私は比較的新しいプログラマーです)。

基本的に、私はサイズが64x64xn(nは1000まで)の.tifファイルを用意しました。画像は、このすべてのスライスを含む単一のファイルです。 (多次元)numpy配列に画像をロードしたいと思います。私が試してみました:

from PIL import Image as pilimage

file_path=(D:\luca\test\test.tif)
print("The selected stack is a .tif")
dataset = pilimage(file_path)
tiffarray = np.array(dataset)
expim = tiffarray.astype(np.double);
print(expim.shape)

その他(tifffileなど)。スタックの最初のスライスしか読み取れないようです。 「expim」にtiffスタックに保存されるすべての情報を含めることは可能ですか?

11
Luca Zangari

PILでtiffスタックの複数のスライスを開く方法があるかどうかはわかりません。

ただし、PILを使用する必要がない場合は、代わりに scikit-image を使用して、デフォルトでtiffスタックから複数のスライスを開きます。以下は、scikit-imageを使用してtiffスタックをNumpy配列にロードする方法のサンプルコードです。

>>> from skimage import io
>>> im = io.imread('an_image.tif')
>>> print im.shape
(2, 64, 64)

関数imreadは画像を直接Numpy配列にロードすることに注意してください。また、結果の配列の次元は順序付けされます(z、y、x)。ここで、zは奥行き、yは高さ、xは幅を表します。したがって、スタックから単一のスライスを取得するには、次のようにします。

>>> print im[1].shape
(64, 64)
18
forty_two

PILには、tiffスタックの別のスライスに移動する関数seekがあります。

from PIL import Image

file_path=(D:\luca\test\test.tif)
print("The selected stack is a .tif")
dataset = Image.open(file_path)
h,w = np.shape(dataset)
tiffarray = np.zeros((h,w,dataset.n_frames))
for i in range(dataset.n_frames):
   dataset.seek(i)
   tiffarray[:,:,i] = np.array(dataset)
expim = tiffarray.astype(np.double);
print(expim.shape)
2
Misha Smirnov