Tifffile は Python ライブラリです。
画像とメタデータは、TIFF、BigTIFF、OME-TIFF、GeoTIFF、Adobe DNG、ZIF (Zoomable Image File Format)、MetaMorph STK、Zeiss LSM、ImageJ hyperstack、Micro-Manager MMStack および NDTiff、SGI、NIHImage、Olympus FluoView から読み取ることができます。 SIS、ScanImage、Molecular Dynamics GEL、Aperio SVS、Leica SCN、 Roche BIF、PerkinElmer QPTIFF (QPI、PKI)、Hamamatsu NDPI、Argos AVS、および Philips DP 形式のファイル。
画像データは、ストリップ、タイル、ページ (IFD)、SubIFD、高次シリーズ、およびピラミッド レベルから NumPy 配列または Zarr 配列/グループとして読み取ることができます。
画像データは、TIFF、BigTIFF、OME-TIFF、および ImageJ ハイパースタック互換ファイルに、マルチページ、ボリューム、ピラミッド、メモリ マップ可能、タイル、予測、または圧縮形式で書き込むことができます。
画像コーデック ライブラリを介して、LZW、PackBits、Deflate、PIXTIFF、LZMA、LERC、Zstd、JPEG (8 および 12 ビット、ロスレス)、JPEG 2000、JPEG XR、JPEG XL、WebP、PNG などの多くの圧縮および予測スキームがサポートされています。 、EER、Jetraw、24 ビット浮動小数点、水平差分。
Tifffile は、TIFF 構造の検査、多次元ファイル シーケンスからのイメージ データの読み取り、TIFF ファイルおよびイメージ ファイル シーケンスの fsspec ReferenceFileSystem の書き込み、TIFF タグ値のパッチ、および多くの独自のメタデータ形式の解析にも使用できます。
著者: | クリストフ・ゴールケ |
---|---|
ライセンス: | BSD 3 節 |
バージョン: | 2024.9.20 |
土井: | 10.5281/ゼノド.6795860 |
Python パッケージ インデックスから tifffile パッケージとすべての依存関係をインストールします。
python -m pip install -U tifffile[すべて]
Tifffile は、Anaconda、Debian、MSYS2 などの他のパッケージ リポジトリでも利用できます。
tifffile ライブラリには型の注釈が付けられ、docstring によって文書化されます。
python -c "tifffileをインポート; help(tifffile)"
Tifffile は、TIFF ファイルを検査およびプレビューするためのコンソール スクリプトとして使用できます。
python -m tifffile --help
プログラミング インターフェイスの使用例を参照してください。
ソース コードとサポートは GitHub で入手できます。
image.sc フォーラムでもサポートが提供されています。
このリビジョンは、次の要件と依存関係でテストされました (他のバージョンも動作する可能性があります)。
2024.9.20
2024.8.30
2024.8.28
2024.8.24
2024.8.10
2024.7.24
2024.7.21
2024.7.2
2024.6.18
2024.5.22
2024.5.10
2024.5.3
2024.4.24
2024.4.18
2024.2.12
2024.1.30
2023.12.9
2023.9.26
2023.9.18
2023.8.30
2023.8.25
2023.8.12
2023.7.18
古いリビジョンについては、CHANGES ファイルを参照してください。
TIFF (タグ付き画像ファイル形式) は、Aldus Corporation と Adobe Systems Incorporated によって作成されました。
Tifffile は、TIFF6 仕様のサブセット、主に 8、16、32、および 64 ビットの整数、16、32、および 64 ビットの浮動小数点数、グレースケール、およびマルチサンプル イメージをサポートします。具体的には、CCITT および OJPEG 圧縮、JPEG 圧縮を使用しないクロマ サブサンプリング、色空間変換、異なるタイプのサンプル、または IPTC、ICC、および XMP メタデータは実装されていません。
tifffile は、従来の TIFF に加えて、TIFF6 仕様に厳密に準拠していないいくつかの TIFF に似た形式をサポートしています。一部の形式では、ファイルとデータのサイズがクラシック TIFF の 4 GB 制限を超えることができます。
Python から科学 TIFF ファイルの読み取り、書き込み、検査、または操作を行うためのその他のライブラリには、aicsimageio、apeer-ometiff-library、bigtiff、fabio.TiffIO、GDAL、imread、large_image、openslide-python、opentile、pylibtiff、pylsm、pymimage、python があります。 -bioformats、pytiff、scanimagetiffreader-python、 SimpleITK、slideio、tiffslide、tifftools、tyf、xtiff、および ndtiff。
NumPy 配列を単一ページの RGB TIFF ファイルに書き込みます。
>> > data = numpy . random . randint ( 0 , 255 , ( 256 , 256 , 3 ), 'uint8' )
>> > imwrite ( 'temp.tif' , data , photometric = 'rgb' )
TIFF ファイルから画像を NumPy 配列として読み取ります。
>> > image = imread ( 'temp.tif' )
>> > image . shape
( 256 , 256 , 3 )
フォトメトリック引数と planarconfig 引数を使用して、3x3x3 NumPy 配列をインターリーブ RGB、プラナー RGB、または 3 ページ グレースケール TIFF に書き込みます。
>> > data = numpy . random . randint ( 0 , 255 , ( 3 , 3 , 3 ), 'uint8' )
>> > imwrite ( 'temp.tif' , data , photometric = 'rgb' )
>> > imwrite ( 'temp.tif' , data , photometric = 'rgb' , planarconfig = 'separate' )
>> > imwrite ( 'temp.tif' , data , photometric = 'minisblack' )
extrasamples 引数を使用して、アルファ チャネルが関連付けられていない RGBA 画像など、追加のコンポーネントがどのように解釈されるかを指定します。
>> > data = numpy . random . randint ( 0 , 255 , ( 256 , 256 , 4 ), 'uint8' )
>> > imwrite ( 'temp.tif' , data , photometric = 'rgb' , extrasamples = [ 'unassalpha' ])
3 次元の NumPy 配列をマルチページの 16 ビット グレースケール TIFF ファイルに書き込みます。
>> > data = numpy . random . randint ( 0 , 2 ** 12 , ( 64 , 301 , 219 ), 'uint16' )
>> > imwrite ( 'temp.tif' , data , photometric = 'minisblack' )
マルチページ TIFF ファイルから画像スタック全体を NumPy 配列として読み取ります。
>> > image_stack = imread ( 'temp.tif' )
>> > image_stack . shape
( 64 , 301 , 219 )
>> > image_stack . dtype
dtype ( 'uint16' )
TIFF ファイルの最初のページから画像を NumPy 配列として読み取ります。
>> > image = imread ( 'temp.tif' , key = 0 )
>> > image . shape
( 301 , 219 )
選択したページ範囲から画像を読み取ります。
>> > images = imread ( 'temp.tif' , key = range ( 4 , 40 , 2 ))
>> > images . shape
( 18 , 301 , 219 )
TIFF ファイル内のすべてのページを反復処理し、画像を連続的に読み取ります。
>> > with TiffFile ( 'temp.tif' ) as tif :
... for page in tif . pages :
... image = page . asarray ()
...
画像データを一切読み取らずに、TIFF ファイル内の画像スタックに関する情報を取得します。
>> > tif = TiffFile ( 'temp.tif' )
>> > len ( tif . pages ) # number of pages in the file
64
>> > page = tif . pages [ 0 ] # get shape and dtype of image in first page
>> > page . shape
( 301 , 219 )
>> > page . dtype
dtype ( 'uint16' )
>> > page . axes
'YX'
>> > series = tif . series [ 0 ] # get shape and dtype of first image series
>> > series . shape
( 64 , 301 , 219 )
>> > series . dtype
dtype ( 'uint16' )
>> > series . axes
'QYX'
>> > tif . close ()
TIFF ファイルの最初のページにある「XResolution」タグを調べます。
>> > with TiffFile ( 'temp.tif' ) as tif :
... tag = tif . pages [ 0 ]. tags [ 'XResolution' ]
...
>> > tag . value
( 1 , 1 )
>> > tag . name
'XResolution'
>> > tag . code
282
>> > tag . count
1
>> > tag . dtype
< DATATYPE . RATIONAL : 5 >
TIFF ファイル内のすべてのタグを反復処理します。
>> > with TiffFile ( 'temp.tif' ) as tif :
... for page in tif . pages :
... for tag in page . tags :
... tag_name , tag_value = tag . name , tag . value
...
既存のタグの値 (XResolution など) を上書きします。
>> > with TiffFile ( 'temp.tif' , mode = 'r+' ) as tif :
... _ = tif . pages [ 0 ]. tags [ 'XResolution' ]. overwrite (( 96000 , 1000 ))
...
BigTIFF 形式、個別の色コンポーネント、タイリング、Zlib 圧縮レベル 8、水平差分予測子、および追加のメタデータを使用して 5 次元浮動小数点配列を書き込みます。
>> > data = numpy . random . rand ( 2 , 5 , 3 , 301 , 219 ). astype ( 'float32' )
>> > imwrite (
... 'temp.tif' ,
... data ,
... bigtiff = True ,
... photometric = 'rgb' ,
... planarconfig = 'separate' ,
... tile = ( 32 , 32 ),
... compression = 'zlib' ,
... compressionargs = { 'level' : 8 },
... predictor = True ,
... metadata = { 'axes' : 'TZCYX' },
... )
xyz ボクセル サイズ 2.6755x2.6755x3.9474 ミクロン^3 の 10 fps 時系列ボリュームを ImageJ ハイパースタック形式の TIFF ファイルに書き込みます。
>> > volume = numpy . random . randn ( 6 , 57 , 256 , 256 ). astype ( 'float32' )
>> > image_labels = [ f' { i } ' for i in range ( volume . shape [ 0 ] * volume . shape [ 1 ])]
>> > imwrite (
... 'temp.tif' ,
... volume ,
... imagej = True ,
... resolution = ( 1.0 / 2.6755 , 1.0 / 2.6755 ),
... metadata = {
... 'spacing' : 3.947368 ,
... 'unit' : 'um' ,
... 'finterval' : 1 / 10 ,
... 'fps' : 10.0 ,
... 'axes' : 'TZYX' ,
... 'Labels' : image_labels ,
... },
... )
ImageJ ハイパースタック ファイルからボリュームとメタデータを読み取ります。
>> > with TiffFile ( 'temp.tif' ) as tif :
... volume = tif . asarray ()
... axes = tif . series [ 0 ]. axes
... imagej_metadata = tif . imagej_metadata
...
>> > volume . shape
( 6 , 57 , 256 , 256 )
>> > axes
'TZYX'
>> > imagej_metadata [ 'slices' ]
57
>> > imagej_metadata [ 'frames' ]
6
ImageJ ハイパースタック ファイル内の連続した画像データをメモリ マップします。
>> > memmap_volume = memmap ( 'temp.tif' )
>> > memmap_volume . shape
( 6 , 57 , 256 , 256 )
>> > del memmap_volume
空のイメージを含む TIFF ファイルを作成し、メモリ マップされた NumPy 配列に書き込みます (注: これは圧縮やタイリングでは機能しません)。
>> > memmap_image = memmap (
... 'temp.tif' , shape = ( 256 , 256 , 3 ), dtype = 'float32' , photometric = 'rgb'
... )
>> > type ( memmap_image )
< class 'numpy.memmap' >
>> > memmap_image [ 255 , 255 , 1 ] = 1.0
>> > memmap_image . flush ()
>> > del memmap_image
2 つの NumPy 配列をマルチシリーズ TIFF ファイルに書き込みます (注: 他の TIFF リーダーは 2 つのシリーズを認識しません。相互運用性を向上させるには OME-TIFF 形式を使用してください)。
>> > series0 = numpy . random . randint ( 0 , 255 , ( 32 , 32 , 3 ), 'uint8' )
>> > series1 = numpy . random . randint ( 0 , 255 , ( 4 , 256 , 256 ), 'uint16' )
>> > with TiffWriter ( 'temp.tif' ) as tif :
... tif . write ( series0 , photometric = 'rgb' )
... tif . write ( series1 , photometric = 'minisblack' )
...
TIFF ファイルから 2 番目の画像シリーズを読み取ります。
>> > series1 = imread ( 'temp.tif' , series = 1 )
>> > series1 . shape
( 4 , 256 , 256 )
1 つの連続したシリーズのフレームを TIFF ファイルに連続して書き込みます。
>> > data = numpy . random . randint ( 0 , 255 , ( 30 , 301 , 219 ), 'uint8' )
>> > with TiffWriter ( 'temp.tif' ) as tif :
... for frame in data :
... tif . write ( frame , contiguous = True )
...
画像シリーズを既存の TIFF ファイルに追加します (注: これは ImageJ ハイパースタックまたは OME-TIFF ファイルでは機能しません)。
>> > data = numpy . random . randint ( 0 , 255 , ( 301 , 219 , 3 ), 'uint8' )
>> > imwrite ( 'temp.tif' , data , photometric = 'rgb' , append = True )
タイルのジェネレーターから TIFF ファイルを作成します。
>> > data = numpy . random . randint ( 0 , 2 ** 12 , ( 31 , 33 , 3 ), 'uint16' )
>> > def tiles ( data , tileshape ):
... for y in range ( 0 , data . shape [ 0 ], tileshape [ 0 ]):
... for x in range ( 0 , data . shape [ 1 ], tileshape [ 1 ]):
... yield data [ y : y + tileshape [ 0 ], x : x + tileshape [ 1 ]]
...
>> > imwrite (
... 'temp.tif' ,
... tiles ( data , ( 16 , 16 )),
... tile = ( 16 , 16 ),
... shape = data . shape ,
... dtype = data . dtype ,
... photometric = 'rgb' ,
... )
オプションのメタデータを使用して、多次元、マルチ解像度 (ピラミッド)、マルチシリーズの OME-TIFF ファイルを作成します。サブ解像度の画像は SubIFD に書き込まれます。並列エンコードを 2 スレッドに制限します。サムネイル画像を別の画像シリーズとして書き込みます。
>> > data = numpy . random . randint ( 0 , 255 , ( 8 , 2 , 512 , 512 , 3 ), 'uint8' )
>> > subresolutions = 2
>> > pixelsize = 0.29 # micrometer
>> > with TiffWriter ( 'temp.ome.tif' , bigtiff = True ) as tif :
... metadata = {
... 'axes' : 'TCYXS' ,
... 'SignificantBits' : 8 ,
... 'TimeIncrement' : 0.1 ,
... 'TimeIncrementUnit' : 's' ,
... 'PhysicalSizeX' : pixelsize ,
... 'PhysicalSizeXUnit' : 'µm' ,
... 'PhysicalSizeY' : pixelsize ,
... 'PhysicalSizeYUnit' : 'µm' ,
... 'Channel' : { 'Name' : [ 'Channel 1' , 'Channel 2' ]},
... 'Plane' : { 'PositionX' : [ 0.0 ] * 16 , 'PositionXUnit' : [ 'µm' ] * 16 },
... 'Description' : 'A multi-dimensional, multi-resolution image' ,
... 'MapAnnotation' : { # for OMERO
... 'Namespace' : 'openmicroscopy.org/PyramidResolution' ,
... '1' : '256 256' ,
... '2' : '128 128' ,
... },
... }
... options = dict (
... photometric = 'rgb' ,
... tile = ( 128 , 128 ),
... compression = 'jpeg' ,
... resolutionunit = 'CENTIMETER' ,
... maxworkers = 2 ,
... )
... tif . write (
... data ,
... subifds = subresolutions ,
... resolution = ( 1e4 / pixelsize , 1e4 / pixelsize ),
... metadata = metadata ,
... ** options ,
... )
... # write pyramid levels to the two subifds
... # in production use resampling to generate sub-resolution images
... for level in range ( subresolutions ):
... mag = 2 ** ( level + 1 )
... tif . write (
... data [..., :: mag , :: mag , :],
... subfiletype = 1 ,
... resolution = ( 1e4 / mag / pixelsize , 1e4 / mag / pixelsize ),
... ** options ,
... )
... # add a thumbnail image as a separate series
... # it is recognized by QuPath as an associated image
... thumbnail = ( data [ 0 , 0 , :: 8 , :: 8 ] >> 2 ). astype ( 'uint8' )
... tif . write ( thumbnail , metadata = { 'Name' : 'thumbnail' })
...
ピラミッド型 OME-TIFF ファイル内のイメージ レベルにアクセスします。
>> > baseimage = imread ( 'temp.ome.tif' )
>> > second_level = imread ( 'temp.ome.tif' , series = 0 , level = 1 )
>> > with TiffFile ( 'temp.ome.tif' ) as tif :
... baseimage = tif . series [ 0 ]. asarray ()
... second_level = tif . series [ 0 ]. levels [ 1 ]. asarray ()
... number_levels = len ( tif . series [ 0 ]. levels ) # includes base level
...
TIFF ファイル内の単一の JPEG 圧縮タイルを反復してデコードします。