tifffile icon indicating copy to clipboard operation
tifffile copied to clipboard

Set spatial offset of OME-Tiff dataset

Open chourroutm opened this issue 8 months ago • 1 comments

Following up on https://github.com/cgohlke/tifffile/issues/245, I have another question regarding OME-Tiff.

I would like to specify a spatial offset as I am saving a list of chunks relative to a spatial coordinate system.

This is the code I came with:

import tifffile as tiff
import dask.array
from pathlib import Path
rng = dask.array.random.default_rng()

chunk_ids = [[0,0,0]]
x = rng.random((512,)*3, chunks=(256,)*3)

resolution_full_um = 10

def save_chunks_per_id(dataset: dask.array.Array,  chunk_id_list: list[list[int]], chunk_size: list[int], filename_prefix: str | Path):
    if isinstance(filename_prefix, str):
        filename_prefix = Path(filename_prefix)
    for chunk_id in chunk_id_list:
        p = Path(filename_prefix.parent / (filename_prefix.name.replace(".ome.tif","") + "_chunk_{0}_{1}_{2}.ome.tif".format(*chunk_id)))
        d = dataset.rechunk(chunk_size).blocks[*chunk_id].compute()

        metadata = {
            'axes': 'ZYX',  # Define the axes
            'SignificantBits': 16,  # Define the number of significant bits
            'PhysicalSizeX': resolution_full_um, 
            'PhysicalSizeXUnit': 'µm',
            'PhysicalSizeY': resolution_full_um,
            'PhysicalSizeYUnit': 'µm',
            'PhysicalSizeZ': resolution_full_um,
            'PhysicalSizeZUnit': 'µm',
            # 'Plane': { # returns a `TypeError: 'int' is not a list or tuple` if used instead
            #     'PositionX': chunk_id[2] * chunk_size[2],
            #     'PositionXUnit': 'µm',
            #     'PositionY': chunk_id[1] * chunk_size[1],
            #     'PositionYUnit': 'µm',
            #     'PositionZ': chunk_id[0] * chunk_size[0],
            #     'PositionZUnit': 'µm',
            # },
            'PositionX': chunk_id[2] * chunk_size[2],
            'PositionXUnit': 'µm',
            'PositionY': chunk_id[1] * chunk_size[1],
            'PositionYUnit': 'µm',
            'PositionZ': chunk_id[0] * chunk_size[0],
            'PositionZUnit': 'µm',
        }

        tiff.imwrite(p,d,photometric='minisblack',metadata=metadata)

save_chunks_per_id(x, chunk_ids, (256,)*3, "./test.ome.tif")

but the PositionX, PositionY and PositionZ are not saved. I tried by having a 'Plane' child node but it didn't work either.

<OME Creator="tifffile.py 2024.5.22" UUID="urn:uuid:ee3ad635-37ca-11ef-a4cc-50849246a087" xmlns="http://www.openmicroscopy.org/Schemas/OME/2016-06" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openmicroscopy.org/Schemas/OME/2016-06 http://www.openmicroscopy.org/Schemas/OME/2016-06/ome.xsd">
<Image ID="Image:0" Name="Image0">
<Pixels BigEndian="false" DimensionOrder="XYCZT" ID="Pixels:0" Interleaved="false" PhysicalSizeX="10.0" PhysicalSizeXUnit="µm" PhysicalSizeY="10.0" PhysicalSizeYUnit="µm" PhysicalSizeZ="10.0" PhysicalSizeZUnit="µm" SignificantBits="16" SizeC="1" SizeT="1" SizeX="256" SizeY="256" SizeZ="256" Type="double">
<Channel ID="Channel:0:0" SamplesPerPixel="1">
<LightPath/>
<TiffData IFD="0" PlaneCount="256"/>

chourroutm avatar Jul 01 '24 16:07 chourroutm