TIFF画像を開いてnumpy配列にインポートできるpythonルーチンが必要です。そのため、含まれているデータを分析および変更し、後でTIFFとして再度保存できます。 (これらは基本的にグレースケールの光強度マップで、ピクセルごとのそれぞれの値を表します)
私は何かを見つけようとしましたが、TIFFに関するPILメソッドに関するドキュメントはありません。私はそれを理解しようとしましたが、サポートされていないエラー/モード/ファイルタイプが間違っていました。
ここで何を使用する必要がありますか?
最初に、 このページ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>
TIFFファイルの読み取りにmatplotlibを使用します。
import matplotlib.pyplot as plt
I = plt.imread(tiff_file)
I
はndarray
タイプになります。
ドキュメンテーションによると、matplotlibはPNGをネイティブに読み取るだけなので、TIFFを処理するときに実際に動作するのは実際にはPILですが、これは私にとってうまく機能しています。
保存用のplt.imsave
関数もあります。
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()
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 が記載されていますが、試していません。
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をサポートしているので、大きな画像の一部を読むことができます。
画像スタックの場合、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)
OpenImageIOにpythonバインディングを使用することをお勧めします。これは、vfxの世界でさまざまな画像形式を処理するための標準です。私は、PILと比較して、さまざまな圧縮タイプの読み取りの信頼性が高いことを発見しました。
import OpenImageIO as oiio
input = oiio.ImageInput.open ("/path/to/image.tif")