Tifffile adalah perpustakaan Python untuk
Gambar dan metadata dapat dibaca dari TIFF, BigTIFF, OME-TIFF, GeoTIFF, Adobe DNG, ZIF (Zoomable Image File Format), MetaMorph STK, Zeiss LSM, ImageJ hyperstack, Micro-Manager MMStack dan NDTiff, SGI, NIHImage, Olympus FluoView dan SIS, ScanImage, GEL Dinamika Molekuler, Aperio SVS, Leica SCN, Roche BIF, File berformat PerkinElmer QPTIFF (QPI, PKI), Hamamatsu NDPI, Argos AVS, dan Philips DP.
Data gambar dapat dibaca sebagai array NumPy atau array/grup Zarr dari strip, ubin, halaman (IFD), SubIFD, rangkaian orde tinggi, dan level piramida.
Data gambar dapat ditulis ke file yang kompatibel dengan TIFF, BigTIFF, OME-TIFF, dan ImageJ hyperstack dalam bentuk multi-halaman, volumetrik, piramidal, dapat dipetakan memori, ubin, diprediksi, atau dikompresi.
Banyak skema kompresi dan prediktor didukung melalui perpustakaan imagecodec, termasuk LZW, PackBits, Deflate, PIXTIFF, LZMA, LERC, Zstd, JPEG (8 dan 12-bit, lossless), JPEG 2000, JPEG XR, JPEG XL, WebP, PNG , EER, Jetraw, floating-point 24-bit, dan diferensiasi horizontal.
Tifffile juga dapat digunakan untuk memeriksa struktur TIFF, membaca data gambar dari urutan file multi-dimensi, menulis fsspec ReferrenceFileSystem untuk file TIFF dan urutan file gambar, menambal nilai tag TIFF, dan mengurai banyak format metadata kepemilikan.
Pengarang: | Christoph Gohlke |
---|---|
Lisensi: | BSD 3-Klausul |
Versi: | 20.9.2024 |
DOI: | 10.5281/zenodo.6795860 |
Instal paket tifffile dan semua dependensi dari Indeks Paket Python:
python -m pip install -U tifffile[semua]
Tifffile juga tersedia di repositori paket lain seperti Anaconda, Debian, dan MSYS2.
Pustaka tifffile diberi anotasi tipe dan didokumentasikan melalui docstrings:
python -c "impor file tiff; bantuan (file tiff)"
Tifffile dapat digunakan sebagai skrip konsol untuk memeriksa dan melihat pratinjau file TIFF:
python -m tifffile --membantu
Lihat Contoh penggunaan antarmuka pemrograman.
Kode sumber dan dukungan tersedia di GitHub.
Dukungan juga diberikan di forum image.sc.
Revisi ini telah diuji dengan persyaratan dan dependensi berikut (versi lain mungkin berfungsi):
20.9.2024
30.8.2024
28.8.2024
24.8.24
2024.8.10
24.7.24
21.7.2024
2024.7.2
2024.6.18
22/05/2024
2024.5.10
2024.5.3
2024.4.24
2024.4.18
2024.2.12
2024.1.30
2023.12.9
26.9.2023
2023.9.18
30.8.2023
25.8.2023
2023.8.12
2023.7.18
Lihat file PERUBAHAN untuk revisi lama.
TIFF, Format File Gambar Bertanda, dibuat oleh Aldus Corporation dan Adobe Systems Incorporated.
Tifffile mendukung subset spesifikasi TIFF6, terutama bilangan bulat 8, 16, 32, dan 64-bit, gambar float, skala abu-abu, dan multi-sampel 16, 32 dan 64-bit. Secara khusus, kompresi CCITT dan OJPEG, subsampling kroma tanpa kompresi JPEG, transformasi ruang warna, sampel dengan tipe berbeda, atau metadata IPTC, ICC, dan XMP tidak diterapkan.
Selain TIFF klasik, tifffile mendukung beberapa format mirip TIFF yang tidak sepenuhnya mengikuti spesifikasi TIFF6. Beberapa format mengizinkan ukuran file dan data melebihi batas 4 GB TIFF klasik:
Perpustakaan lain untuk membaca, menulis, memeriksa, atau memanipulasi file TIFF ilmiah dari Python adalah aicsimageio, apeer-ometiff-library, bigtiff, fabio.TiffIO, GDAL, imread, large_image, openslide-python, opentile, pylibtiff, pylsm, pymimage, python -bioformat, pytiff, scanimagetiffreader-python, SimpleITK, slideio, tiffslide, tifftools, tyf, xtiff, dan ndtiff.
Tulis array NumPy ke file RGB TIFF satu halaman:
>> > data = numpy . random . randint ( 0 , 255 , ( 256 , 256 , 3 ), 'uint8' )
>> > imwrite ( 'temp.tif' , data , photometric = 'rgb' )
Baca gambar dari file TIFF sebagai array NumPy:
>> > image = imread ( 'temp.tif' )
>> > image . shape
( 256 , 256 , 3 )
Gunakan argumen fotometrik dan planarconfig untuk menulis array NumPy 3x3x3 ke RGB yang disisipkan, RGB planar, atau TIFF skala abu-abu 3 halaman:
>> > 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' )
Gunakan argumen extrasamples untuk menentukan bagaimana komponen tambahan diinterpretasikan, misalnya, untuk gambar RGBA dengan saluran alfa yang tidak terkait:
>> > data = numpy . random . randint ( 0 , 255 , ( 256 , 256 , 4 ), 'uint8' )
>> > imwrite ( 'temp.tif' , data , photometric = 'rgb' , extrasamples = [ 'unassalpha' ])
Tulis array NumPy 3 dimensi ke file TIFF skala abu-abu 16-bit multi-halaman:
>> > data = numpy . random . randint ( 0 , 2 ** 12 , ( 64 , 301 , 219 ), 'uint16' )
>> > imwrite ( 'temp.tif' , data , photometric = 'minisblack' )
Baca seluruh tumpukan gambar dari file TIFF multi-halaman sebagai array NumPy:
>> > image_stack = imread ( 'temp.tif' )
>> > image_stack . shape
( 64 , 301 , 219 )
>> > image_stack . dtype
dtype ( 'uint16' )
Baca gambar dari halaman pertama di file TIFF sebagai array NumPy:
>> > image = imread ( 'temp.tif' , key = 0 )
>> > image . shape
( 301 , 219 )
Membaca gambar dari rentang halaman yang dipilih:
>> > images = imread ( 'temp.tif' , key = range ( 4 , 40 , 2 ))
>> > images . shape
( 18 , 301 , 219 )
Ulangi semua halaman dalam file TIFF dan baca gambar secara berurutan:
>> > with TiffFile ( 'temp.tif' ) as tif :
... for page in tif . pages :
... image = page . asarray ()
...
Dapatkan informasi tentang tumpukan gambar di file TIFF tanpa membaca data gambar apa pun:
>> > 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 ()
Periksa tag "XResolution" dari halaman pertama di file TIFF:
>> > 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 >
Ulangi semua tag di file 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
...
Timpa nilai tag yang ada, misalnya XResolution:
>> > with TiffFile ( 'temp.tif' , mode = 'r+' ) as tif :
... _ = tif . pages [ 0 ]. tags [ 'XResolution' ]. overwrite (( 96000 , 1000 ))
...
Tulis array floating-point 5 dimensi menggunakan format BigTIFF, komponen warna terpisah, ubin, kompresi Zlib level 8, prediktor perbedaan horizontal, dan metadata tambahan:
>> > 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' },
... )
Tulis volume deret waktu 10 fps dengan ukuran xyz voxel 2,6755x2,6755x3,9474 mikron^3 ke file TIFF berformat hyperstack ImageJ:
>> > 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 ,
... },
... )
Baca volume dan metadata dari file hyperstack 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
Memetakan memori data gambar yang berdekatan dalam file hyperstack ImageJ:
>> > memmap_volume = memmap ( 'temp.tif' )
>> > memmap_volume . shape
( 6 , 57 , 256 , 256 )
>> > del memmap_volume
Buat file TIFF yang berisi gambar kosong dan tulis ke array NumPy yang dipetakan memori (catatan: ini tidak berfungsi dengan kompresi atau ubin):
>> > 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
Tulis dua array NumPy ke file TIFF multi-seri (catatan: pembaca TIFF lainnya tidak akan mengenali kedua seri tersebut; gunakan format OME-TIFF untuk interoperabilitas yang lebih baik):
>> > 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' )
...
Baca rangkaian gambar kedua dari file TIFF:
>> > series1 = imread ( 'temp.tif' , series = 1 )
>> > series1 . shape
( 4 , 256 , 256 )
Tulis frame dari satu rangkaian yang berdekatan secara berturut-turut ke file 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 )
...
Tambahkan rangkaian gambar ke file TIFF yang ada (catatan: ini tidak berfungsi dengan file ImageJ hyperstack atau OME-TIFF):
>> > data = numpy . random . randint ( 0 , 255 , ( 301 , 219 , 3 ), 'uint8' )
>> > imwrite ( 'temp.tif' , data , photometric = 'rgb' , append = True )
Buat file TIFF dari generator ubin:
>> > 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' ,
... )
Tulis file OME-TIFF multi-dimensi, multi-resolusi (piramida), multi-seri dengan metadata opsional. Gambar sub-resolusi ditulis ke SubIFD. Batasi pengkodean paralel menjadi 2 utas. Tulis gambar mini sebagai rangkaian gambar terpisah:
>> > 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' })
...
Akses level gambar dalam file OME-TIFF piramidal:
>> > 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
...
Ulangi dan dekode ubin terkompresi JPEG tunggal dalam file TIFF: