Tifffile เป็นไลบรารี Python สำหรับ
ภาพและข้อมูลเมตาสามารถอ่านได้จาก TIFF, BigTIFF, OME-TIFF, GeoTIFF, Adobe DNG, ZIF (รูปแบบไฟล์ภาพที่ซูมได้), 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
ข้อมูลรูปภาพสามารถอ่านเป็นอาร์เรย์ NumPy หรืออาร์เรย์/กลุ่ม Zarr จากแถบ ไทล์ หน้า (IFD) SubIFD ชุดลำดับที่สูงกว่า และระดับพีระมิด
ข้อมูลรูปภาพสามารถเขียนลงในไฟล์ที่เข้ากันได้กับไฮเปอร์สแต็ก TIFF, BigTIFF, OME-TIFF และ ImageJ ในรูปแบบหลายหน้า ปริมาตร พีระมิด แมปหน่วยความจำได้ เรียงต่อกัน คาดการณ์ หรือบีบอัด
รูปแบบการบีบอัดและตัวทำนายจำนวนมากได้รับการสนับสนุนผ่านไลบรารี imagecodecs รวมถึง LZW, PackBits, Deflate, PIXTIFF, LZMA, LERC, Zstd, JPEG (8 และ 12 บิต, lossless), JPEG 2000, JPEG XR, JPEG XL, WebP, PNG , EER, Jetraw, จุดลอยตัว 24 บิต และผลต่างแนวนอน
Tifffile ยังสามารถใช้เพื่อตรวจสอบโครงสร้าง TIFF อ่านข้อมูลรูปภาพจากลำดับไฟล์หลายมิติ เขียน fsspec ReferenceFileSystem สำหรับไฟล์ TIFF และลำดับไฟล์รูปภาพ แพตช์ค่าแท็ก TIFF และแยกวิเคราะห์รูปแบบข้อมูลเมตาที่เป็นกรรมสิทธิ์จำนวนมาก
ผู้เขียน: | คริสตอฟ โกลเก้ |
---|---|
ใบอนุญาต: | BSD 3-ข้อ |
เวอร์ชัน: | 2024.9.20 |
ดอย: | 10.5281/zenodo.6795860 |
ติดตั้งแพ็คเกจ tifffile และการขึ้นต่อกันทั้งหมดจาก Python Package Index:
python -m pip ติดตั้ง -U tifffile [ทั้งหมด]
Tifffile ยังมีอยู่ในที่เก็บแพ็คเกจอื่น ๆ เช่น Anaconda, Debian และ MSYS2
ไลบรารี tifffile เป็นประเภทคำอธิบายประกอบและจัดทำเอกสารผ่าน docstrings:
python -c "นำเข้า tifffile; ช่วย (tifffile)"
Tifffile สามารถใช้เป็นสคริปต์คอนโซลเพื่อตรวจสอบและดูตัวอย่างไฟล์ TIFF:
หลาม -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
8.25.2023
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 จะไม่ถูกนำมาใช้
นอกจาก TIFF แบบคลาสสิกแล้ว tifffile ยังรองรับรูปแบบที่คล้ายกับ TIFF หลายรูปแบบที่ไม่เป็นไปตามข้อกำหนด TIFF6 อย่างเคร่งครัด บางรูปแบบอนุญาตให้ขนาดไฟล์และข้อมูลเกินขีดจำกัด 4 GB ของ TIFF แบบคลาสสิก:
ไลบรารีอื่นๆ สำหรับการอ่าน เขียน การตรวจสอบ หรือจัดการไฟล์ TIFF ทางวิทยาศาสตร์จาก Python ได้แก่ 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 )
ใช้อาร์กิวเมนต์ photometric และ planarconfig เพื่อเขียนอาร์เรย์ NumPy 3x3x3 ไปยัง RGB แบบแทรก, RGB ระนาบ หรือ TIFF ระดับสีเทา 3 หน้า:
>> > 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' ])
เขียนอาร์เรย์ NumPy 3 มิติลงในไฟล์ TIFF ระดับสีเทา 16 บิตหลายหน้า:
>> > 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 ()
ตรวจสอบแท็ก "XResolution" จากหน้าแรกในไฟล์ 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 >
วนซ้ำแท็กทั้งหมดในไฟล์ 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 ))
...
เขียนอาร์เรย์จุดลอยตัว 5 มิติโดยใช้รูปแบบ BigTIFF แยกส่วนประกอบสี การเรียงต่อกัน การบีบอัด Zlib ระดับ 8 ตัวทำนายผลต่างแนวนอน และข้อมูลเมตาเพิ่มเติม:
>> > 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' },
... )
เขียนอนุกรมเวลา 10 fps ของไดรฟ์ข้อมูลที่มี xyz voxel ขนาด 2.6755x2.6755x3.9474 micron^3 ลงในไฟล์ TIFF ที่จัดรูปแบบไฮเปอร์สแต็กของ 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 ,
... },
... )
อ่านโวลุ่มและข้อมูลเมตาจากไฟล์ไฮเปอร์สแต็ก 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
เขียนอาร์เรย์ NumPy สองตัวลงในไฟล์ TIFF หลายซีรีส์ (หมายเหตุ: โปรแกรมอ่าน TIFF อื่นๆ จะไม่รู้จักทั้งสองซีรีส์ ใช้รูปแบบ 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:
>> > series1 = imread ( 'temp.tif' , series = 1 )
>> > series1 . shape
( 4 , 256 , 256 )
เขียนเฟรมของซีรีย์หนึ่งต่อเนื่องกันลงในไฟล์ 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 Hyperstack หรือ 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
...
ทำซ้ำและถอดรหัสไทล์บีบอัด JPEG เดี่ยวในไฟล์ TIFF: