web-dev-qa-db-ja.com

numpyを使用したPythonでのTIFFの操作(インポート、エクスポート)

TIFF画像を開いてnumpy配列にインポートできるpythonルーチンが必要です。そのため、含まれているデータを分析および変更し、後でTIFFとして再度保存できます。 (これらは基本的にグレースケールの光強度マップで、ピクセルごとのそれぞれの値を表します)

私は何かを見つけようとしましたが、TIFFに関するPILメソッドに関するドキュメントはありません。私はそれを理解しようとしましたが、サポートされていないエラー/モード/ファイルタイプが間違っていました。

ここで何を使用する必要がありますか?

61
Jakob

最初に、 このページa_image.tifという名前のテストTIFFイメージをダウンロードしました。次に、PILで次のように開きました。

>>> from PIL import Image
>>> im = Image.open('a_image.tif')
>>> im.show()

これは、虹の画像を示しています。 numpy配列に変換するには、次のように簡単です:

>>> import numpy
>>> imarray = numpy.array(im)

画像のサイズと配列の形状が一致していることがわかります。

>>> imarray.shape
(44, 330)
>>> im.size
(330, 44)

そして、配列にはuint8値が含まれます。

>>> imarray
array([[  0,   1,   2, ..., 244, 245, 246],
       [  0,   1,   2, ..., 244, 245, 246],
       [  0,   1,   2, ..., 244, 245, 246],
       ..., 
       [  0,   1,   2, ..., 244, 245, 246],
       [  0,   1,   2, ..., 244, 245, 246],
       [  0,   1,   2, ..., 244, 245, 246]], dtype=uint8)

配列の変更が完了したら、次のようにPILイメージに戻すことができます。

>>> Image.fromarray(imarray)
<Image.Image image mode=L size=330x44 at 0x2786518>
80
jterrace

TIFFファイルの読み取りにmatplotlibを使用します。

import matplotlib.pyplot as plt
I = plt.imread(tiff_file)

Indarrayタイプになります。

ドキュメンテーションによると、matplotlibはPNGをネイティブに読み取るだけなので、TIFFを処理するときに実際に動作するのは実際にはPILですが、これは私にとってうまく機能しています。

保存用のplt.imsave関数もあります。

45
Michael Brennan

GDALを使用してこれを行うこともできます。私はそれが地理空間ツールキットであることを認識していますが、地図作成製品を持っている必要はありません。

ウィンドウ用のプリコンパイル済みGDALバイナリへのリンク(ここではウィンドウを想定) http://www.gisinternals.com/sdk/

配列にアクセスするには:

from osgeo import gdal

dataset = gdal.Open("path/to/dataset.tiff", gdal.GA_ReadOnly)
for x in range(1, dataset.RasterCount + 1):
    band = dataset.GetRasterBand(x)
    array = band.ReadAsArray()
14
Jzl5325

pylibtiff は、PILよりもうまく機能しました。PILは、 色ごとに8ビットを超えるカラー画像をサポートしていません

from libtiff import TIFF

tif = TIFF.open('filename.tif') # open tiff file in read mode
# read an image in the currect TIFF directory as a numpy array
image = tif.read_image()

# read all images in a TIFF file:
for image in tif.iter_images(): 
    pass

tif = TIFF.open('filename.tif', mode='w')
tif.write_image(image)

Pylibtiffは次のコマンドでインストールできます。

pip3 install numpy libtiff

Pylibtiffのreadmeにも tifffile.py が記載されていますが、試していません。

6
Boris

pytiff を使用することもできます。このうちの著者です。

    import pytiff

    with pytiff.Tiff("filename.tif") as handle:
        part = handle[100:200, 200:400]

    # multipage tif
    with pytiff.Tiff("multipage.tif") as handle:
        for page in handle:
            part = page[100:200, 200:400]

それはかなり小さなモジュールであり、他のモジュールほど多くの機能を持たないかもしれませんが、タイル化されたtiffとbigtiffをサポートしているので、大きな画像の一部を読むことができます。

4
hnfl

画像スタックの場合、scikit-imageを使用して読み取り、matplotlibを使用して表示または保存する方が簡単です。次のコードで16ビットTIFF画像スタックを処理しました。

from skimage import io
import matplotlib.pyplot as plt

# read the image stack
img = io.imread('a_image.tif')
# show the image
plt.imshow(mol,cmap='gray')
plt.axis('off')
# save the image
plt.savefig('output.tif', transparent=True, dpi=300, bbox_inches="tight", pad_inches=0.0)
3
Claire

OpenImageIOにpythonバインディングを使用することをお勧めします。これは、vfxの世界でさまざまな画像形式を処理するための標準です。私は、PILと比較して、さまざまな圧縮タイプの読み取りの信頼性が高いことを発見しました。

import OpenImageIO as oiio
input = oiio.ImageInput.open ("/path/to/image.tif")
0
zeno