-
Notifications
You must be signed in to change notification settings - Fork 4
Description
Hello,
Thanks for your work on BatchConvert, which is very useful and practical!
For my work in France-BioImaging, I need to convert several multichannel images into single-channel ome.tiff images - for each channel of the original images.
So I created this python code using your documentation; to convert here only the first channel of an example image).
img_omx = AICSImage( input_path/image_name.dv)
print(img_omx.dims)<Dimensions [T: 1, C: 3, Z: 21, Y: 512, X: 512]>
command = ['batchconvert',
'ometiff', '-pf', 'conda',
'-chn', str(0),
input_path,
output_path,
]
try:
subprocess.run(command, check=True)
except Exception as e:
print(f"Error converting {input_folder_path}: {e}") But after running this code and converting my 3-channel images I got a Value error about channel sizes (idem with some imread)
img = AICSImage(ometiff_converted_demo)
print(img.dims)ValueError: conflicting sizes for dimension 'C': length 1 on the data but length 3 on coordinate 'C' The full error message below:
Details
ValueError Traceback (most recent call last)
/home/mypath Cell 6 line 6
<a href='vscode-notebook-cell://home/mypath#X15sZmlsZQ%3D%3D?line=3'>4</a> img = AICSImage(ometiff_converted_demo)
<a href='vscode-notebook-cell://home/mypath#X15sZmlsZQ%3D%3D?line=4'>5</a> # print(img.metadata)
----> <a href='vscode-notebook-cell://home/mypath#X15sZmlsZQ%3D%3D?line=5'>6</a> print(img.dims)
File ~/mambaforge/envs/environment/lib/python3.10/site-packages/aicsimageio/aics_image.py:574, in AICSImage.dims(self)
566 \"\"\"
567 Returns
568 -------
569 dims: dimensions.Dimensions
570 Object with the paired dimension names and their sizes.
571 \"\"\"
572 if self._dims is None:
573 self._dims = dimensions.Dimensions(
--> 574 dims=self.xarray_dask_data.dims, shape=self.shape
575 )
577 return self._dims
File ~/mambaforge/envs/environment/lib/python3.10/site-packages/aicsimageio/aics_image.py:438, in AICSImage.xarray_dask_data(self)
423 \"\"\"
424 Returns
425 -------
(...)
431 If the image contains mosaic tiles, data is returned already stitched together.
432 \"\"\"
433 if self._xarray_dask_data is None:
434 if (
435 # Does the user want to get stitched mosaic
436 self._reconstruct_mosaic
437 # Does the data have a tile dim
--> 438 and dimensions.DimensionNames.MosaicTile in self.reader.dims.order
439 ):
440 try:
441 self._xarray_dask_data = (
442 self._transform_data_array_to_aics_image_standard(
443 self.reader.mosaic_xarray_dask_data
444 )
445 )
File ~/mambaforge/envs/environment/lib/python3.10/site-packages/aicsimageio/readers/reader.py:532, in Reader.dims(self)
525 \"\"\"
526 Returns
527 -------
528 dims: Dimensions
529 Object with the paired dimension names and their sizes.
530 \"\"\"
531 if self._dims is None:
--> 532 self._dims = Dimensions(dims=self.xarray_dask_data.dims, shape=self.shape)
534 return self._dims
File ~/mambaforge/envs/environment/lib/python3.10/site-packages/aicsimageio/readers/reader.py:359, in Reader.xarray_dask_data(self)
352 \"\"\"
353 Returns
354 -------
355 xarray_dask_data: xr.DataArray
356 The delayed image and metadata as an annotated data array.
357 \"\"\"
358 if self._xarray_dask_data is None:
--> 359 self._xarray_dask_data = self._read_delayed()
361 return self._xarray_dask_data
File ~/mambaforge/envs/environment/lib/python3.10/site-packages/aicsimageio/readers/ome_tiff_reader.py:334, in OmeTiffReader._read_delayed(self)
331 # Create the delayed dask array
332 image_data = self._create_dask_array(tiff, strictly_read_dims)
--> 334 return self._general_data_array_constructor(
335 image_data,
336 dims,
337 coords,
338 tiff_tags,
339 )
File ~/mambaforge/envs/environment/lib/python3.10/site-packages/aicsimageio/readers/ome_tiff_reader.py:286, in OmeTiffReader._general_data_array_constructor(self, image_data, dims, coords, tiff_tags)
283 # Reset dims after transform
284 dims = [d for d in out_order]
--> 286 return xr.DataArray(
287 image_data,
288 dims=dims,
289 coords=coords,
290 attrs={
291 constants.METADATA_UNPROCESSED: tiff_tags,
292 constants.METADATA_PROCESSED: self._ome,
293 },
294 )
File ~/mambaforge/envs/environment/lib/python3.10/site-packages/xarray/core/dataarray.py:418, in DataArray.__init__(self, data, coords, dims, name, attrs, indexes, fastpath)
416 data = _check_data_shape(data, coords, dims)
417 data = as_compatible_data(data)
--> 418 coords, dims = _infer_coords_and_dims(data.shape, coords, dims)
419 variable = Variable(dims, data, attrs, fastpath=True)
420 indexes, coords = _create_indexes_from_coords(coords)
File ~/mambaforge/envs/environment/lib/python3.10/site-packages/xarray/core/dataarray.py:163, in _infer_coords_and_dims(shape, coords, dims)
161 for d, s in zip(v.dims, v.shape):
162 if s != sizes[d]:
--> 163 raise ValueError(
164 f\"conflicting sizes for dimension {d!r}: \"
165 f\"length {sizes[d]} on the data but length {s} on \"
166 f\"coordinate {k!r}\"
167 )
169 if k in sizes and v.shape != (sizes[k],):
170 raise ValueError(
171 f\"coordinate {k!r} is a DataArray dimension, but \"
172 f\"it has shape {v.shape!r} rather than expected shape {sizes[k]!r} \"
173 \"matching the dimension size\"
174 )
ValueError: conflicting sizes for dimension 'C': length 1 on the data but length 3 on coordinate 'C'"
Suprisingly, when using the BioformatReader, I can have access to the new monocanal image (but it takes much more time to open it).
img = AICSImage(ometiff_converted_demo, reader=BioformatsReader)
print(img.dims)<Dimensions [T: 1, C: 1, Z: 21, Y: 512, X: 512]>
Then I checked the ome-type xml metadata file and saw that the sizeC is indeed 1 but, in Pixels, the information for the 3 channels remains instead of just the first.
It therefore seems that there was an error at this level during the conversion.
<?xml version="1.0" encoding="UTF-8"?> ...
<OME ...
<Instrument ID="Instrument:0"> ...
</Instrument>
<Image
...
<Pixels BigEndian="false" DimensionOrder="XYCZT" ID="Pixels:0" Interleaved="false" PhysicalSizeX="0.07999999821186066" PhysicalSizeXUnit="µm" PhysicalSizeY="0.07999999821186066" PhysicalSizeYUnit="µm" PhysicalSizeZ="1.0" PhysicalSizeZUnit="µm" SignificantBits="16"
SizeC="1" SizeT="1" SizeX="512" SizeY="512" SizeZ="21"Type="uint16">
<Channel EmissionWavelength="683.0" EmissionWavelengthUnit="nm" ExcitationWavelength="642.0" ExcitationWavelengthUnit="nm" ID="Channel:0:0" NDFilter="0.10000000149011612" SamplesPerPixel="1">
<LightPath/>
</Channel>
<Channel EmissionWavelength="528.0" EmissionWavelengthUnit="nm" ID="Channel:0:1" NDFilter="0.25" SamplesPerPixel="1">
<LightPath/>
</Channel>
<Channel EmissionWavelength="435.0" EmissionWavelengthUnit="nm" ExcitationWavelength="405.0" ExcitationWavelengthUnit="nm" ID="Channel:0:2" NDFilter="0.10000000149011612" SamplesPerPixel="1">
<LightPath/>
</Channel>
...
</Pixels>
</Image>
...It therefore seems that there was an error at this level during the conversion.
The full xml file (as .txt) here : Info_HeLa_Mitotrack-647_BrField_Hoechst_sample-1_001_visit_1.txt
As I can't upload .dv and ome.tiff images on GIthub, don't hesitate to contact me if you want the input and output image.
Thank you for all,
Dorian