Tifffile هي مكتبة بايثون
يمكن قراءة الصور والبيانات التعريفية من 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 QPTIF (QPI وPKI) وHamamatsu NDPI وArgos AVS وPhilips DP.
يمكن قراءة بيانات الصورة كمصفوفات NumPy أو صفائف/مجموعات Zarr من الشرائط والبلاطات والصفحات (IFDs) وSubIFDs وسلاسل الترتيب الأعلى والمستويات الهرمية.
يمكن كتابة بيانات الصورة إلى ملفات متوافقة مع TIFF، وBigTIFF، وOME-TIFF، وImageJ في شكل متعدد الصفحات، أو حجمي، أو هرمي، أو قابل للتعيين بالذاكرة، أو مبلط، أو متوقع، أو مضغوط.
يتم دعم العديد من أنظمة الضغط والتنبؤ عبر مكتبة imagecodecs، بما في ذلك LZW وPackBits وDeflate وPIXTIFF وLZMA وLERC وZstd وJPEG (8 و12 بت، بدون فقدان)، JPEG 2000، JPEG XR، JPEG XL، WebP، PNG وEER وJetraw والفاصلة العائمة 24 بت والاختلاف الأفقي.
يمكن أيضًا استخدام Tifffile لفحص هياكل TIFF، وقراءة بيانات الصورة من تسلسلات ملفات متعددة الأبعاد، وكتابة fsspec ReferenceFileSystem لملفات TIFF وتسلسلات ملفات الصور، وتصحيح قيم علامات TIFF، وتحليل العديد من تنسيقات البيانات التعريفية الخاصة.
مؤلف: | كريستوف جوهلك |
---|---|
رخصة: | بسد 3-بند |
إصدار: | 2024.9.20 |
معرف الهوية الرقمي: | 10.5281/زينودو.6795860 |
قم بتثبيت حزمة tifffile وجميع التبعيات من مؤشر حزمة Python:
بايثون -m تثبيت النقطة -U tifffile[all]
يتوفر Tifffile أيضًا في مستودعات الحزم الأخرى مثل Anaconda وDebian وMSYS2.
يتم شرح مكتبة tifffile وتوثيقها عبر سلاسل المستندات:
python -c "استيراد tifffile؛ مساعدة (tifffile)"
يمكن استخدام Tifffile كبرنامج نصي لوحدة التحكم لفحص ملفات TIFF ومعاينتها:
بايثون -m tifffile --مساعدة
راجع أمثلة لاستخدام واجهة البرمجة.
كود المصدر والدعم متاحان على GitHub.
يتم توفير الدعم أيضًا على منتدى image.sc.
تم اختبار هذه المراجعة مع المتطلبات والتبعيات التالية (قد تعمل الإصدارات الأخرى):
2024.9.20
30.8.2024
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
30.8.2023
2023.8.25
2023.8.12
2023.7.18
ارجع إلى ملف التغييرات للمراجعات الأقدم.
تم إنشاء 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 جيجابايت لملف TIFF الكلاسيكي:
المكتبات الأخرى لقراءة أو كتابة أو فحص أو معالجة ملفات TIFF العلمية من Python هي aicsimageio، apeer-ometiff-library، bigtiff، fabio.TiffIO، GDAL، imread، Large_image، openlide-python، opentile، pylibtiff، pylsm، pymimage، 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 لكتابة مصفوفة 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 ثلاثية الأبعاد إلى ملف 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 ))
...
اكتب مصفوفة ذات فاصلة عائمة خماسية الأبعاد باستخدام تنسيق 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 إطارات في الثانية من وحدات التخزين بحجم xyz voxel 2.6755x2.6755x3.9474 ميكرون^3 إلى ملف TIFF بتنسيق ImageJ Hyperstack:
>> > 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 Hyperstack:
>> > 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 Hyperstack:
>> > 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 متعدد الأبعاد ومتعدد الدقة (هرمي) ومتعدد السلاسل مع بيانات التعريف الاختيارية. تتم كتابة الصور ذات الدقة الفرعية إلى SubIFDs. تقييد التشفير المتوازي بموضوعين. اكتب صورة مصغرة كسلسلة صور منفصلة:
>> > 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: