zeiss-microscopy / libczi Goto Github PK
View Code? Open in Web Editor NEWOpen Source Cross-Platform C++ library to read CZI image files
License: GNU General Public License v3.0
Open Source Cross-Platform C++ library to read CZI image files
License: GNU General Public License v3.0
alligned_alloc is not well supported in all versions of libstdc++, for example this bug report, so some g++ versions complain that it is missing even with #include <cstdlib>
and using the namespace std::aligned_alloc
.
Src/libCZI/stdAllocator.cpp already contains platform specific code, so would it be possible to change the aligned_alloc call to use posix_memalign instead? Specifically, change in Src/libCZI/stdAllocator.cpp:
#if defined(__GNUC__)
//return aligned_alloc(32, size);
void *pv;
int res = posix_memalign(&pv, 32, size);
return pv;
#else
I've verified this change works with g++ 6.4 and 7.3.
I can provide a pull request if desired.
Is anyone else seeing errors like this?
This just started happening a couple of weeks ago in our automated aicspylibczi builds. I assume Eigen updated something and the version being pulled by libCZI is not pinned. Or else github-actions changed some compiler configuration.
/home/runner/work/aicspylibczi/aicspylibczi/cmake-build-debug/libCZI/Src/vendor/eigen3/src/eigen_ext/Eigen/src/Core/util/Macros.h:624:2: error: This compiler appears to be too old to be supported by Eigen
#error This compiler appears to be too old to be supported by Eigen
^
Hello,
I have been developing reader using libCZI. When I used this function. I was wondering if it the CBitmapOperations::Copy
function should be copying from PixelType::Bgr48
to PixelType::Bgr48
using Copy<PixelType::Bgr48, PixelType::Bgr48>
instead of Copy<PixelType::Bgr24, PixelType::Bgr24>
.
The current implementation only copies half of the buffer.
in libCZI/BitmapOperations.cpp at line 131
/*static*/void CBitmapOperations::Copy(libCZI::PixelType srcPixelType, const void* srcPtr, int srcStride, libCZI::PixelType dstPixelType, void* dstPtr, int dstStride, int width, int height, bool drawTileBorder)
{
/*
...
*/
case PixelType::Bgr48:
switch (dstPixelType)
{
case PixelType::Gray8:break;
case PixelType::Gray16:break;
case PixelType::Gray32Float:break;
case PixelType::Bgr24:break;
case PixelType::Bgr48:
// should be Bgr48
Copy<PixelType::Bgr48, PixelType::Bgr48>(srcPtr, srcStride, dstPtr, dstStride, width, height, drawTileBorder);
return;
default:break;
}
break;
default:break;
}
/*
...
*/
}
I tried to extract Label and SlidePreview attachment, its color data is in bgr48 format.
its contrast is very much low, its hardly visible .
currently i am converting bgr48 to rgb24 as follows
thumbnail[3 * i] = ((std::uint8_t)( data[3 * i + 2] >> 8 ));
thumbnail[3 * i + 1] = ((std::uint8_t)(data[3 * i + 1] >> 8));
thumbnail[3 * i + 2] = ((std::uint8_t)(data[3 * i + 0] >> 8));
is there any proper way to convert from bgr48 to rgb24?
CHeapAllocator::Allocate seems no to initialise the allocated memory.
this is visible if more than one pixmap is created from the image data and the second extends beyond the area of a czi file.
this can be fixes by calling 'memset( pv, 0, size );' bevor the memory is returned from CHeapAllocator::Allocate.
this is not ideal as it incurs overhead for every pixmap. but fixing this only for pixmaps that extend beyond the visible area looks more complicated.
I'm having an issue with inconsistent logical sub-block sizes being reported by libCZI. I was originally having this problem on a tiled, pyramided microscope image that I am unable to share. However, I have been able to reproduce the problem by loading a non-tiled jpg image into Zen, generating a pyramid, and saving it as czi.
Here is the output I am getting from CZICmd:
#0: T0 M=-2147483648 logical=(0,0,7695,2160) phys.=(285,80) pixeltype=bgr24
#1: T0 M=-2147483648 logical=(0,0,6561,2160) phys.=(729,240) pixeltype=bgr24
#2: T0 M=-2147483648 logical=(6561,0,1125,2160) phys.=(125,240) pixeltype=bgr24
#3: T0 M=-2147483648 logical=(0,0,2187,2160) phys.=(729,720) pixeltype=bgr24
#4: T0 M=-2147483648 logical=(2187,0,2187,2160) phys.=(729,720) pixeltype=bgr24
#5: T0 M=-2147483648 logical=(4374,0,2187,2160) phys.=(729,720) pixeltype=bgr24
#6: T0 M=-2147483648 logical=(6561,0,1119,2160) phys.=(373,720) pixeltype=bgr24
#7: T0 M=-2147483648 logical=(0,0,7680,2160) phys.=(7680,2160) pixeltype=bgr24
number of subblocks with scale 1/1: 1
number of subblocks with scale 1/3: 4
number of subblocks with scale 1/9: 2
number of subblocks with scale 1/27: 1
Notice that the non-tiled, scale 1/1 sub-block (#7) has physical and logical size 7680, 2160. These are the correct dimensions of the image. However, the scale 1/27 sub-block (#0) has logical size 7695, 2160. I believe that this should be equal to the actual image size, but it is a little bigger. The other pyramid levels have the same problem; for example, if you add up the logical widths from the scale 1/9 sub-blocks (#1 and #2), you get 6561+1125=7686, which is also too big.
I'm not sure if this a problem with libCZI or with Zen itself, but perhaps a developer could advise?
I am attaching the example image.
example.zip
Reading image size using libCZI::SubBlockStatistics boundingBox returns a different number than is stored in the image XML or is computed enumerating tiles.
In my example on an Axio Scan.Z1 image produced by:
ZEN 2 (blue edition)
2.0.0.0
In boundingBox I observe:
w=84096
h=28032
In the XML under ///:
84007
28030
Enumerating tiles at scale==1.0 and using logicalRect I obtain:
w=84007
h=28030
What is the reason for this disparity and is this somehow an artifact of how TileAccessors work?
I am getting different output in debug and release build ,can you please guide me what i am doing wrong?
`wstring filePath = L"D:\dev\images\zeis\SWTS_N_056_Liver_iADSS.czi";
auto stream = libCZI::CreateStreamFromFile(filePath.c_str());
auto cziReader = libCZI::CreateCZIReader();
cziReader->Open(stream);
auto subBlockStatistics = cziReader->GetStatistics();
libCZI::CDimCoordinate coordinate{ { DimensionIndex::C,0} };
libCZI::ISingleChannelPyramidLayerTileAccessor::Options scptaOptions; scptaOptions.Clear();
libCZI::ISingleChannelPyramidLayerTileAccessor::PyramidLayerInfo pyrLyrInfo;
pyrLyrInfo.minificationFactor = 2;
pyrLyrInfo.pyramidLayerNo = 6;
auto accessorp = cziReader->CreateSingleChannelPyramidLayerTileAccessor();
libCZI::ISingleChannelTileAccessor::Options sctaOptions; sctaOptions.Clear();
auto bb = subBlockStatistics.boundingBox;
int tilwidth = 512 * pow(2, pyrLyrInfo.pyramidLayerNo);
int numX = ceil((float)bb.w / tilwidth);
int numY = ceil((float)bb.h / tilwidth);
for (int i = 0; i < numY; i++)
{
for (int j = 0; j < numX; j++)
{
int startx = bb.x + j * tilwidth;
int starty = bb.y + i * tilwidth;
IntRect roi{ startx,starty,tilwidth,tilwidth };
auto re = accessorp->Get(roi, &coordinate, pyrLyrInfo, &scptaOptions);
std::wstring outputfilename = L"D:\cziOut\";
outputfilename += std::to_wstring(pyrLyrInfo.pyramidLayerNo);
outputfilename += L"\";
outputfilename += std::to_wstring(i);
outputfilename += L"_";
outputfilename += std::to_wstring(j);
outputfilename += L".png";
CSaveData save(outputfilename, SaveDataFormat::PNG);
save.Save(re.get());
}
}`
Currently libCZI can not directly be used by downstream cmake projects. This is due to two reasons: The library and headers are not installed, and there is no cmake package configuration file.
Nowadays (with modern cmake) it is quite easy to generate cmake package configuration files that allow downstream projects to call find_package(libCZI <SOME VERSION>)
to set all the include and link paths to use libCZI.
Could you kindly add cmake package configuration support and an install target?
I've been using CZIcmd lately and I've found it to be a really nice tool for automatically retrieving image data as it appears in Zen. Though I've found something strange happening when I give it images that were scanned with 10 bit or 12 bit colour. The H&E came out looking reddish, like this:
I compared this with what I saw in Zen and it was clearly different:
Anyway, long story short, I realised that the colour channels were in reverse order for some reason. So if I swapped the red and blue colour channels over then that fixed everything.
I've not used libCZI directly, so I don't know if this is an issue with just CZIcmd or the underlying library.
Hello,
currently I am using openslide's python bindings to read and analyse parts of whole slide images from different vendors. Now we have got a larger number of .czi files. Do you have plans to add python bindings to libCZI?
Best regards,
Kai
When I try to build the static version of libCZI with Visual Studio on Windows, it seems to get built with __declspec(dllimport), which should only be used with the non-static dll version. This behavior is being controlled in ImportExport.h. I have found that if I manually define _STATICLIBBUILD as required by ImportExport.h, then the static version the lib is built correctly. I think there is a problem with the Visual Studio project files being generated by CMake not defining this constant when they should be.
I'm trying to extract the label-image into a more generic image format using the code below. An image
with correct dimensions is subtracted successfully, however half the image (the right-most part) is missing, or specifically, all pixels after pixel column #365 counting from the left is black (except for the blue channel which, curiously, continues for another column).
Am I doing something wrong here or may there be a bug?
$ CZIcmd -s CZIFILE.czi -c extractattachment -o tmp_czi_label_extract -e '{"name":"Label"}'
$ CZIcmd -s tmp_czi_label_extract_Label* -c printinformation
SubBlock-Statistics
-------------------
SubBlock-Count: 1
Bounding-Box:
All: X=0 Y=0 W=733 H=552
Layer0: X=0 Y=0 W=733 H=552
M-Index: not valid
Bounds:
C -> Start=0 Size=1
$ CZIcmd -c ChannelComposite -r 'abs(0,0,733,552)' -s tmp_czi_label_extract_Label* -o $1.label
Hi there,
I am following 'creating multi-channel composite' example in docs to convert czi image file to png format (in mac os). In the end, I am getting an image with a lower resolution (compared to converted image from zen lite software for windows).
Is there a way to increase image resolution here? Your suggestions would be helpful.
Thanks.
Hi,
Does this library support the CZI-files produced from the Axio Scan Z1?
Thanks,
Jonas Øgaard
Hello,
I have a question regarding tile accessor to read multiple scene image. I have an image, sorry that I cannot share it. The tiles and scene is arranged as below figure. The red boundary is scene boundary, the blue area are the tiles and the green are tiles within overlapped area of 2 scene.
The issue I have is that CSingleChannelTileAccessor
can render the green areas with tissue. However; when I use CSingleChannelPyramidLevelTileAccessor
to render subsampled images. The green areas become background black pixels, which are copied from background of lower right scene.
I read the source code and, in the end, both classes call Compositors::ComposeSingleChannelTiles
. I am wondering how it actually works here. How does the 2 methods determine which tile to render and why I got different results using these two classes.
Thank you.
Request:
Add function(s) to efficiently load a row, column tile/block at a specified zoom/pyramid level. In addition, code to get the tile/block size at a specified zoom/pyramid level, and the number of tiles/blocks along the row/column dimensions.
I am working on a project that will be traversing the entire image applying various filters and machine learning models on each block of data. After peaking through the code and documentation, I noticed two primary methods for getting at the data.
(1)
reader->ReadSubBlock(int blockIndex)
(2) Using regions of interest.
Both of these methods makes a call to reader->EnumerateSubBlocks
to traverse the sub-blocks (including all pyramid levels) of the image. The region of interest function makes a call to reader->EnumerateSubBlocks for each ROI that is requested(!).
Ideally, I would like the have the following functions:
reader->getNumSubBlocksRow(int pyramidLevel)
reader->getNumSubBlocksCol(int pyramidLevel)
reader->getSubBlockDim(int pyramidLevel)
reader->getSubBlock(int row, int col, int pyramidLevel)
getNumSubBlocksRow and getNumSubBlocksCol would return the number of sub-blocks along the row or column dimension for a specified pyramid level, respectively.
getSubBlockDim would return the sub-block's dimensions at the specified pyramid level
getSubBlock would return a std::shared_ptr at the specified row, column, and pyramid level, within bounds of getNumSubBlocksRow and getNumSubBlocksCol.
To traverse the entire image I would then do the following:
for (int row = 0; row < reader->getNumBlocksRow(PYRAMID_LEVEL); row++)
{
for (int col = 0; col < reader->getNumBlocksCol(PYRAMID_LEVEL; col++)
{
auto subBlock = reader->getSubBlock(row, col, pyramidLevel);
... do processing
}
}
I tried to dump czi image on zoom level 0.00390625000 with CZIcmd.exe
on lower resolution(below 10x ) tiles around scene-1 appearing as white tile. after 10x they are working fine
CZIcmd.exe --command SingleChannelScalingTileAccessor --plane-coordinate C0 --rect rel(0,0,90000,70000) --source "D:\images\czi\1-1-7A.czi" --output d:\out\czizmd --zoom 0.00390625000
the docs states that the lib aims to be thread-safe.
does this extend to reading the data from disk? i.e. is it supposed to be possible to use the same cziReader with an opened stream from multiple threads?
doing so gives Illegal data detected at offset 528800 -> Invalid SubBlockk-magic
errors.
creating new cziReader objects with new streams in each thread avoids these errors, but incurs a considerable overhead.
Hi,
I'm super glad to see this library in the wild, thank you! I'm a developer of libbioimage and BisQue and we would like to get a much better support for your format. We do have commercial clients interested in using our code in the commercial setting and I wanted to know who should I talk to about commercial license for using libCZI.
Thank you very much,
Dmitry
my function :
`extern "C" _declspec(dllexport) void* GetRegionTile(const wchar_t* fileName, int64_t x, int64_t y, float _zoom, int64_t w, int64_t h, uint32_t* sourceRoiWidth, uint32_t* sourceRoiHeight, uint32_t* sourceRoiStride, uint64_t* sourceRoiSize, BYTE* ptrDataRoi)
{
auto stream = CreateStreamFromFile(fileName);
auto cziReader = CreateCZIReader();
cziReader->Open(stream);
auto statistics = cziReader->GetStatistics();
// get the display-setting from the document's metadata
auto mds = cziReader->ReadMetadataSegment();
auto md = mds->CreateMetaFromMetadataSegment();
auto docInfo = md->GetDocumentInfo();
auto dsplSettings = docInfo->GetDisplaySettings();
IntRect roi{ x,y,w,h };
// get the tile-composite for all channels (which are marked 'active' in the display-settings)
std::vector<shared_ptr> actvChBms;
int index = 0; // index counting only the active channels
std::map<int, int> activeChNoToChIdx; // we need to keep track which 'active channels" corresponds to which channel index
auto accessor = cziReader->CreateSingleChannelScalingTileAccessor();
CDisplaySettingsHelper::EnumEnabledChannels(dsplSettings.get(),
[&](int chIdx)->bool
{
CDimCoordinate planeCoord{ { DimensionIndex::C, chIdx } };
actvChBms.emplace_back(accessor->Get(roi, &planeCoord, _zoom, nullptr));
activeChNoToChIdx[chIdx] = index++;
return true;
});
// initialize the helper with the display-settings and provide the pixeltypes
// (for each active channel)
CDisplaySettingsHelper dsplHlp;
dsplHlp.Initialize(dsplSettings.get(),
[&](int chIdx)->PixelType { return actvChBms[activeChNoToChIdx[chIdx]]->GetPixelType(); });
// pass the tile-composites we just created (and the display-settings for the those active
// channels) into the multi-channel-composor-function
auto mcComposite = Compositors::ComposeMultiChannel_Bgr24(
dsplHlp.GetActiveChannelsCount(),
std::begin(actvChBms),
dsplHlp.GetChannelInfosArray());
auto bm = mcComposite.get();
auto bitmapData = bm->Lock();
*sourceRoiWidth = bm->GetWidth();
*sourceRoiHeight = bm->GetHeight();
*sourceRoiStride = bitmapData.stride;
*sourceRoiSize = bitmapData.size;
memcpy(ptrDataRoi, (BYTE*)bitmapData.ptrDataRoi, bitmapData.size);
bm->Unlock();
return bitmapData.ptrDataRoi;
}`
I need to call it every time I take a 256*256 picture, call it many times, and use this method to consume my computer.
how to free them?
When SingleChannelPyramidLevelTileAccessor
does not find any tiles that intersect the planeCoordinate
, it simply does not populate the Bitmap; however, when it does not find any tiles at the correct pyramid level, it throws. Conceptually, these two cases seem the same, so I think the error should be handled the same way. I do not think the method should throw.
We have encountered a file with compression mode 1001 which is considered invalid by libCZI:
AllenCellModeling/aicspylibczi#81
Can you help figure out if this should be supported or is indeed some kind of error with the file?
libCZI 46cf2da reports the wrong time dimension size for a CZI file acquired on an LSM880 with AiryScan detector in time series mode using ZEN 2.3 software. The file contains 2 channels, 32 phases, and 10000000 time points (stored logically as 20000 x 500x1 images). The time dimension size is 20000 but is reported as 1 by libCZI:
CZIcmd.exe -s "Image 9.czi" -c PrintInformation -i All
SubBlock-Statistics
-------------------
SubBlock-Count: 198
Bounding-Box:
All: X=0 Y=0 W=500 H=1
Layer0: X=0 Y=0 W=500 H=1
M-Index: not valid
Bounds:
Z -> Start=0 Size=1
C -> Start=0 Size=2
T -> Start=0 Size=1
H -> Start=0 Size=32
V -> Start=0 Size=1
B -> Start=0 Size=1
<?xml version="1.0"?>
<ImageDocument>
<Metadata>
<Version>1.0</Version>
<Experiment>
<ExperimentBlockIndex>0</ExperimentBlockIndex>
<ExperimentBlocks>
<AcquisitionBlock>
<AcquisitionModeSetup>
<BiDirectional>false</BiDirectional>
<BiDirectionalZ>false</BiDirectionalZ>
<BitsPerSample>16</BitsPerSample>
<CameraBinning>1</CameraBinning>
<CameraFrameHeight>1030</CameraFrameHeight>
<CameraFrameOffsetX>0</CameraFrameOffsetX>
<CameraFrameOffsetY>0</CameraFrameOffsetY>
<CameraFrameWidth>1300</CameraFrameWidth>
<CameraSuperSampling>0</CameraSuperSampling>
<DimensionT>10000</DimensionT>
<DimensionX>256</DimensionX>
<DimensionY>256</DimensionY>
<DimensionZ>1</DimensionZ>
<FilterMethod>Average</FilterMethod>
<FilterMode>Line</FilterMode>
<FilterSamplingNumber>1</FilterSamplingNumber>
<FitFramesizeToRoi>false</FitFramesizeToRoi>
<HdrEnabled>false</HdrEnabled>
<HdrImagingMode>0</HdrImagingMode>
<HdrIntensity>1</HdrIntensity>
<HdrNumFrames>1</HdrNumFrames>
<InterpolationY>1</InterpolationY>
<Objective>C-Apochromat 40x/1.2 W Korr FCS M27</Objective>
<OffsetX>0</OffsetX>
<OffsetY>0</OffsetY>
<OffsetZ>0.013038284999999991</OffsetZ>
<ReferenceZ>0.0046742540000000009</ReferenceZ>
<PixelPeriod>2.4559999999999999e-006</PixelPeriod>
<Rotation>0</Rotation>
<AcquisitionMode>Point</AcquisitionMode>
<RtBinning>1</RtBinning>
<RtFrameHeight>512</RtFrameHeight>
<RtFrameWidth>512</RtFrameWidth>
<RtLinePeriod>3.0000000000000001e-005</RtLinePeriod>
<RtOffsetX>0</RtOffsetX>
<RtOffsetY>0</RtOffsetY>
<RtRegionHeight>512</RtRegionHeight>
<RtRegionWidth>512</RtRegionWidth>
<RtSuperSampling>1</RtSuperSampling>
<RtZoom>1</RtZoom>
<ScalingX>0</ScalingX>
<ScalingY>0</ScalingY>
<ScalingZ>1e-008</ScalingZ>
<SimRotations>3</SimRotations>
<TimeSeries>true</TimeSeries>
<TrackMultiplexType>Frame</TrackMultiplexType>
<UseRois>false</UseRois>
<ZoomX>40</ZoomX>
<ZoomY>40</ZoomY>
<PreScan>false</PreScan>
<FocusStabilizer>false</FocusStabilizer>
<ScannerOnlineCorrection>true</ScannerOnlineCorrection>
<WaitState>false</WaitState>
<FocalDistanceLsmTubeLense>138.40000000000001</FocalDistanceLsmTubeLense>
<FocalDistanceStandardTubeLense>164.5</FocalDistanceStandardTubeLense>
<FocalDistanceScanLense>52.5</FocalDistanceScanLense>
<ApertureDiameter>4.4099999999999993</ApertureDiameter>
<SamplingStart>0.5</SamplingStart>
<SamplingEnd>0.5</SamplingEnd>
<RequestedScanSpeed>1</RequestedScanSpeed>
</AcquisitionModeSetup>
<TimeSeriesSetup>
<StartMode>
<DigitalOut>-1</DigitalOut>
<Manual />
</StartMode>
<StopMode>
<DigitalOut />
<Manual />
</StopMode>
<Switches>
<Switch>
<DigitalIn />
<DigitalOut />
<SwitchAction>
<SetIntervalAction>
<Interval>
<TimeSpan>
<Value>0</Value>
<DefaultUnitFormat>ms</DefaultUnitFormat>
</TimeSpan>
</Interval>
</SetIntervalAction>
</SwitchAction>
</Switch>
</Switches>
</TimeSeriesSetup>
<ZStackSetup>
<StackBrightnessCorrection>false</StackBrightnessCorrection>
<StackBrightnessCorrections>
<Positions />
<Extrapolate>false</Extrapolate>
<Interpolation>Cubic</Interpolation>
</StackBrightnessCorrections>
</ZStackSetup>
<MultiTrackSetup>
<TrackSetup Name="Track1">
<Attenuators>
<Attenuator>
<Wavelength>4.8800000000000003e-007</Wavelength>
<Transmission>0.0050000000000000001</Transmission>
<LaserSuppression>false</LaserSuppression>
<ExcitationIntensity>0</ExcitationIntensity>
<Laser>ArgonRemote</Laser>
<Polarization_Stokes0>1</Polarization_Stokes0>
<Polarization_Stokes1>-1</Polarization_Stokes1>
<Polarization_Stokes2>0</Polarization_Stokes2>
<Polarization_Stokes3>0</Polarization_Stokes3>
</Attenuator>
</Attenuators>
<BeamSplitters>
<BeamSplitter>
<Identifier>MainBeamSplitterDescanned1</Identifier>
<Filter>MBS 488/561</Filter>
<BeamSplitterServoPosition>0</BeamSplitterServoPosition>
</BeamSplitter>
<BeamSplitter>
<Identifier>MainBeamSplitterDescanned2</Identifier>
<Filter>MBS -405/760+</Filter>
<BeamSplitterServoPosition>0</BeamSplitterServoPosition>
</BeamSplitter>
<BeamSplitter>
<Identifier>DichroicBeamSplitterDescanned1</Identifier>
<Filter>Plate</Filter>
<BeamSplitterServoPosition>0</BeamSplitterServoPosition>
</BeamSplitter>
<BeamSplitter>
<Identifier>MainBeamSplitterNonDescanned</Identifier>
<Filter>Rear</Filter>
<BeamSplitterServoPosition>0</BeamSplitterServoPosition>
</BeamSplitter>
</BeamSplitters>
<BleachSetup>
<BleachParameterSets>
<BleachParameterSet>
<StartEvent>None</StartEvent>
<EndEvent>Number</EndEvent>
<StartTime>0</StartTime>
<StartNumber>1</StartNumber>
<Duration>0</Duration>
<Cycles>1</Cycles>
<TriggerIn>0</TriggerIn>
<TriggerOut>0</TriggerOut>
<Repeat>0</Repeat>
<DifferentSpotPosition>false</DifferentSpotPosition>
<SimultanGrabAndBleach>false</SimultanGrabAndBleach>
<SpotPositionX>0</SpotPositionX>
<SpotPositionY>8.7825189999999929e-008</SpotPositionY>
<PositionZ>0</PositionZ>
<PixelPeriod>-1</PixelPeriod>
<StopAtIntensityDrop>false</StopAtIntensityDrop>
<IntensityDrop>0.5</IntensityDrop>
</BleachParameterSet>
</BleachParameterSets>
</BleachSetup>
<Collimators>
<Collimator>
<Name>LSMCOLLI_NLO</Name>
<Position>2942</Position>
</Collimator>
<Collimator>
<Name>LSMCOLLI_V</Name>
<Position>693</Position>
</Collimator>
</Collimators>
<Detectors>
<Detector Name="Airyscan" Id="831012323125198510614351197952380055650">
<DetectorIdentifier>AiryScan1</DetectorIdentifier>
<PureRatioSource>false</PureRatioSource>
<ImageChannelName>ChA</ImageChannelName>
<Voltage>750</Voltage>
<AmplifierGain>1</AmplifierGain>
<AmplifierOffset>0</AmplifierOffset>
<PinholeDiameter>7.9911200000000002e-005</PinholeDiameter>
<SpectralScanChannels>32</SpectralScanChannels>
<Dye />
<Folder />
<Palette>LsmDetectorPalette_0_0</Palette>
<Color>#00FF00</Color>
<DetectorMode>Integration</DetectorMode>
<DigitalGain>1</DigitalGain>
<DigitalOffset>0</DigitalOffset>
<LaserSuppression>true</LaserSuppression>
<Filtersets>
<Filterset>Plate</Filterset>
</Filtersets>
<AiryScanMode>SuperResolution</AiryScanMode>
<AiryScanVirtualPinholeSize>3.9955600000000001e-005</AiryScanVirtualPinholeSize>
<AiryScanMagnification>1050.834975092725</AiryScanMagnification>
<AiryScanTransformationXX>0.8719337478123339</AiryScanTransformationXX>
<AiryScanTransformationXY>0.48962387546558356</AiryScanTransformationXY>
<AiryScanTransformationYX>-0.48962387546558356</AiryScanTransformationYX>
<AiryScanTransformationYY>0.8719337478123339</AiryScanTransformationYY>
</Detector>
</Detectors>
<CenterWavelength>5.5259966400000006e-007</CenterWavelength>
<CondensorFrontlensPosition>-1</CondensorFrontlensPosition>
<CondensorRevolverFilter>HF</CondensorRevolverFilter>
<TubeLensPosition>Lens LSM</TubeLensPosition>
<FieldStopPosition>-1</FieldStopPosition>
<CondensorAperture>0.55000000000000004</CondensorAperture>
<FilterTransmission>-1</FilterTransmission>
<CameraIntegrationTime>2.4559999999999999e-006</CameraIntegrationTime>
<DeviceMode>LSM_ChannelMode</DeviceMode>
<TransmittedLightLampIntensity>0</TransmittedLightLampIntensity>
<ReflectedLightLampIntensity>-1</ReflectedLightLampIntensity>
<LaserSuppressionMode>None</LaserSuppressionMode>
<TirfAngle>0</TirfAngle>
<PalmSlider>true</PalmSlider>
<SimGratingPeriod>0</SimGratingPeriod>
<FWLive405Position />
<FWFOVPosition />
</TrackSetup>
</MultiTrackSetup>
<TilesSetup>
<PositionGroups>
<PositionGroup>
<AutoFocusMode>Off</AutoFocusMode>
<AutoFocusOffset>0</AutoFocusOffset>
</PositionGroup>
</PositionGroups>
</TilesSetup>
<Lasers>
<Laser>
<LaserPower>0.050000000000000003</LaserPower>
<LaserName>Titanium:Sapphire</LaserName>
</Laser>
<Laser>
<LaserPower>0.023000000000000003</LaserPower>
<LaserName>ArgonRemote</LaserName>
</Laser>
</Lasers>
</AcquisitionBlock>
</ExperimentBlocks>
</Experiment>
<CustomAttributes>
<LsmTag><LsmTag Name="CarlZeissAim.IncubatorState.Switch_TempChannel4" Type="boolean">false</LsmTag></LsmTag>
</CustomAttributes>
<Information>
<Measurement>
<BaseValues>
<ImageBaseTime0>0001-01-01T00:00:00-08:00</ImageBaseTime0>
<ImageBaseTime1>0001-01-01T00:00:00-08:00</ImageBaseTime1>
<ImageBaseTime2>0001-01-01T00:00:00-08:00</ImageBaseTime2>
<ImageBaseTime3>0001-01-01T00:00:00-08:00</ImageBaseTime3>
<ImageBaseTime4>0001-01-01T00:00:00-08:00</ImageBaseTime4>
</BaseValues>
</Measurement>
<User Id="0">
<DisplayName>xxxxxxx</DisplayName>
</User>
<Application>
<Name>AIMApplication</Name>
<Version>14.0.0.201</Version>
</Application>
<Document>
<Name>Image 9</Name>
<Description />
<Comment />
<UserName>xxxxx</UserName>
<CreationDate>2017-09-05T20:13:15.3680854-07:00</CreationDate>
<SubType>Point</SubType>
<Rating>0</Rating>
<Title>Image 9</Title>
</Document>
<Image>
<OriginalScanData>true</OriginalScanData>
<PixelType>Gray16</PixelType>
<ComponentBitCount>16</ComponentBitCount>
<SizeX>500</SizeX>
<SizeT>20000</SizeT>
<SizeC>2</SizeC>
<SizeH>32</SizeH>
<SizeY>1</SizeY>
<SizeZ>1</SizeZ>
<SizeB>1</SizeB>
<SizeV>1</SizeV>
<OriginalCompressionMethod>Uncompressed</OriginalCompressionMethod>
<OriginalEncodingQuality>100</OriginalEncodingQuality>
<Dimensions>
<Channels>
<Channel Id="831012323125198510614351197952380055650" Name="ChA">
<IlluminationType>Epifluorescence</IlluminationType>
<ContrastMethod>Fluorescence</ContrastMethod>
<PinholeSizeAiry>2.1475732330018813</PinholeSizeAiry>
<ExcitationWavelength>488.00000000000006</ExcitationWavelength>
<EmissionWavelength>488.00000000000006</EmissionWavelength>
<ChannelType>AiryScanRawSr</ChannelType>
<FilterSet Id="FilterSet:0:0:0" />
<PixelType>Gray8</PixelType>
<AcquisitionMode>LaserScanningConfocalMicroscopy</AcquisitionMode>
<DetectionWavelength />
<DetectorSettings>
<Binning>1x1</Binning>
<PhotonConversionFactor>0</PhotonConversionFactor>
<Gain>750</Gain>
<DigitalGain>1</DigitalGain>
<Offset>0</Offset>
<Detector Id="Detector:0:0" />
</DetectorSettings>
<LightSourcesSettings>
<LightSourceSettings>
<Attenuation>0.995</Attenuation>
<Wavelength>488.00000000000006</Wavelength>
<Polarization>
<StokesParameter1>1</StokesParameter1>
<StokesParameter2>-1</StokesParameter2>
<StokesParameter3>0</StokesParameter3>
<StokesParameter4>0</StokesParameter4>
</Polarization>
<LightSource Id="LightSource:1" />
</LightSourceSettings>
</LightSourcesSettings>
<LaserScanInfo>
<PixelTime>2.4559999999999999e-006</PixelTime>
<ZoomX>40</ZoomX>
<ZoomY>40</ZoomY>
<SampleRotation>0</SampleRotation>
<SampleOffsetX>0</SampleOffsetX>
<SampleOffsetY>0</SampleOffsetY>
<LineTime>3.0000000000000001e-005</LineTime>
<FrameTime>2.4559999999999999e-006</FrameTime>
<ScanningMode>Frame</ScanningMode>
<Averaging>1</Averaging>
</LaserScanInfo>
<AiryscanSettings>
<Mode>SuperResolution</Mode>
<VirtualPinholeSize>3.99556E-05</VirtualPinholeSize>
<Magnification>1050.834975092725</Magnification>
<TransformationXX>0.8719337478123339</TransformationXX>
<TransformationXY>0.48962387546558356</TransformationXY>
<TransformationYX>-0.48962387546558356</TransformationYX>
<TransformationYY>0.8719337478123339</TransformationYY>
</AiryscanSettings>
</Channel>
<Channel Id="Channel:1">
<PixelType>Gray8</PixelType>
</Channel>
</Channels>
<Tracks>
<Track Id="Track:0">
<ChannelRefs>
<ChannelRef Id="831012323125198510614351197952380055650" />
</ChannelRefs>
</Track>
</Tracks>
<T>
<StartTime>0001-01-01T00:00:00</StartTime>
<Positions>
<BinaryList>
<AttachmentName>TimeStamps</AttachmentName>
</BinaryList>
</Positions>
</T>
<S>
<Scenes>
<Scene Index="0">
<ScanMode>Meander</ScanMode>
<Positions>
<Position X="7832.06" Y="-14930.3" Z="4674.26" />
</Positions>
</Scene>
</Scenes>
</S>
</Dimensions>
<ObjectiveSettings>
<Medium>Water</Medium>
<RefractiveIndex>1.333</RefractiveIndex>
<ObjectiveRef Id="Objective:0" />
</ObjectiveSettings>
<MicroscopeRef Id="Microscope:0" />
</Image>
<Instrument Id="Instrument:0">
<Microscopes>
<Microscope Id="Microscope:0">
<System>LSM 880, AxioObserver</System>
</Microscope>
</Microscopes>
<LightSources>
<LightSource Id="LightSource:0">
<Power>50</Power>
<Manufacturer>
<Model>Titanium:Sapphire</Model>
</Manufacturer>
<LightSourceType>
<Laser>
<Wavelength>740.000000</Wavelength>
</Laser>
</LightSourceType>
</LightSource>
<LightSource Id="LightSource:1">
<Power>23.000000000000004</Power>
<Manufacturer>
<Model>ArgonRemote</Model>
</Manufacturer>
<LightSourceType>
<Laser>
<Wavelength>458.000000</Wavelength>
</Laser>
</LightSourceType>
</LightSource>
</LightSources>
<Detectors>
<Detector Id="Detector:0:0">
<Gain>1</Gain>
<Zoom>1</Zoom>
<AmplificationGain>1</AmplificationGain>
<Type>Airyscan</Type>
<Manufacturer>
<Model />
</Manufacturer>
</Detector>
</Detectors>
<Objectives>
<Objective Id="Objective:0">
<Immersion>Water</Immersion>
<LensNA>1.2000000000000002</LensNA>
<NominalMagnification>40</NominalMagnification>
<Manufacturer>
<Model>C-Apochromat 40x/1.2 W Korr FCS M27</Model>
</Manufacturer>
</Objective>
</Objectives>
<FilterSets>
<FilterSet Id="FilterSet:0:0:0">
<EmissionFilters>
<EmissionFilterRef Id="Filter:0:0:0" />
</EmissionFilters>
</FilterSet>
</FilterSets>
<Filters>
<Filter Id="Filter:0:0:0" Name="Plate" />
</Filters>
</Instrument>
<Processing>
<Airyscan>
<Channels>
<Channel>
<SuperResolutionParameter>0</SuperResolutionParameter>
<ParameterEstimationType>Manual</ParameterEstimationType>
<DeconvolutionType>2D</DeconvolutionType>
<IsTileBased>false</IsTileBased>
<VirtualPinholeParameter>0</VirtualPinholeParameter>
<BaselineShift>false</BaselineShift>
<BaselineShiftParameter>0</BaselineShiftParameter>
</Channel>
<Channel>
<SuperResolutionParameter>0</SuperResolutionParameter>
<ParameterEstimationType>Manual</ParameterEstimationType>
<DeconvolutionType>2D</DeconvolutionType>
<IsTileBased>false</IsTileBased>
<VirtualPinholeParameter>0</VirtualPinholeParameter>
<BaselineShift>false</BaselineShift>
<BaselineShiftParameter>0</BaselineShiftParameter>
</Channel>
</Channels>
</Airyscan>
</Processing>
</Information>
<Scaling>
<AutoScaling>
<Type>Measured</Type>
<CreationDateTime>09/06/2017 04:00:32</CreationDateTime>
</AutoScaling>
<Items>
<Distance Id="X">
<Value>0</Value>
</Distance>
<Distance Id="Y">
<Value>0</Value>
</Distance>
<Distance Id="Z">
<Value>0</Value>
</Distance>
<Pixel Id="T">
<Value>1</Value>
</Pixel>
</Items>
</Scaling>
<DisplaySetting>
<Channels>
<Channel Id="831012323125198510614351197952380055650" Name="ChA">
<Low>0.0030060273136491961</Low>
<High>0.15414663920042718</High>
<BitCountRange>16</BitCountRange>
<PixelType>Gray16</PixelType>
<DyeName>Dye1</DyeName>
<DyeMaxEmission>488.00000000000006</DyeMaxEmission>
<DyeMaxExcitation>488.00000000000006</DyeMaxExcitation>
<Color>#FF00FF00</Color>
<OriginalColor>#FF00FF00</OriginalColor>
<ChannelUnit>
<FactorI>1</FactorI>
<OffsetI>0</OffsetI>
<UnitI>Unknown</UnitI>
<ChannelType>AiryScanRawSr</ChannelType>
</ChannelUnit>
</Channel>
<Channel Id="3357350662128558537140425115101775084003" Name="ChA#">
<Low>0.0030060273136491961</Low>
<High>0.0854319939869825</High>
<Gamma>0.0099999999999997868</Gamma>
<BitCountRange>16</BitCountRange>
<PixelType>Gray16</PixelType>
<DyeName>Dye2</DyeName>
<Color>#FF00FF00</Color>
<OriginalColor>#FF00FF00</OriginalColor>
<IsSelected>false</IsSelected>
<ChannelUnit>
<FactorI>1</FactorI>
<OffsetI>0</OffsetI>
<UnitI>Unknown</UnitI>
<ChannelType>AiryScanSum</ChannelType>
</ChannelUnit>
</Channel>
</Channels>
</DisplaySetting>
<Layers />
<Appliances>
<Appliance Id="ShuttleAndFind:1">
<Data>
<ShuttleAndFindData>
<Calibration>
<MicroscopeType>LM</MicroscopeType>
<Markers>
<Marker Id="Marker:1" StageXPosition="0" StageYPosition="0" FocusPosition="0" />
<Marker Id="Marker:2" StageXPosition="0" StageYPosition="0" FocusPosition="0" />
<Marker Id="Marker:3" StageXPosition="0" StageYPosition="0" FocusPosition="0" />
</Markers>
<StageOrientation X="1" Y="1" />
</Calibration>
</ShuttleAndFindData>
</Data>
</Appliance>
</Appliances>
</Metadata>
</ImageDocument>
Scaling-Information
-------------------
(the numbers give the length of one pixel (in the respective direction) in the unit 'meter')
ScaleX=0
ScaleY=0
ScaleZ=0
General Information
-------------------
Name=Image 9
Title=Image 9
UserName=xxxxxx
Description=
Comment=
Keywords=
Rating=0
CreationDate=2017-09-05T20:13:15.3680854-07:00
Display-Settings
----------------
Channel #0
==========
Enabled: yes
Tinting: yes (R=0, G=255, B=0)
Black-point: 0.00300603 White-point: 0.154147
Gradation-curve-mode: linear
Channel #1
==========
Enabled: no
Tinting: yes (R=0, G=255, B=0)
Black-point: 0.00300603 White-point: 0.085432
Gradation-curve-mode: gamma (0.01)
Display-Settings in CZIcmd-JSON-Format
--------------------------------------
Pretty-Print:
{
"channels": [
{
"ch": 0,
"black-point": 0.0030060273129493,
"white-point": 0.15414664149284364,
"tinting": "#00ff00"
}
]
}
Compact:
{"channels":[{"ch":0,"black-point":0.0030060273129493,"white-point":0.15414664149284364,"tinting":"#00ff00"}]}
Complete list of sub-blocks
---------------------------
#0: Z0C0T0H0V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#1: Z0C0T0H1V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#2: Z0C0T0H2V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#3: Z0C0T0H3V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#4: Z0C0T0H4V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#5: Z0C0T0H5V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#6: Z0C0T0H6V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#7: Z0C0T0H7V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#8: Z0C0T0H8V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#9: Z0C0T0H9V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#10: Z0C0T0H10V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#11: Z0C0T0H11V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#12: Z0C0T0H12V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#13: Z0C0T0H13V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#14: Z0C0T0H14V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#15: Z0C0T0H15V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#16: Z0C0T0H16V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#17: Z0C0T0H17V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#18: Z0C0T0H18V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#19: Z0C0T0H19V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#20: Z0C0T0H20V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#21: Z0C0T0H21V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#22: Z0C0T0H22V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#23: Z0C0T0H23V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#24: Z0C0T0H24V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#25: Z0C0T0H25V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#26: Z0C0T0H26V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#27: Z0C0T0H27V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#28: Z0C0T0H28V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#29: Z0C0T0H29V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#30: Z0C0T0H30V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#31: Z0C0T0H31V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#32: Z0C1T0H0V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
Attachment Info
---------------
count | name
------+----------------------------
1 | EventList
1 | FiberMatrix
1 | LookupTables
1 | Thumbnail
1 | TimeStamps
Complete list of Attachments
----------------------------
index | filetype | GUID | name
------+----------+----------------------------------------+-------------
0 | JPG | {A64C56B1-44E1-464C-8E6A-D11021362769} | Thumbnail
1 | CZLUT | {8DE7B4A7-A314-4C5F-8413-23B4A8851B4C} | LookupTables
2 | CZTIMS | {78D90040-ABEA-4574-99FB-4E65CED742F2} | TimeStamps
3 | CZEVL | {3A768E05-B3A3-4860-A438-FC8C3400C18F} | EventList
4 | CZFBMX | {4A518ED9-B773-4E85-A829-128AFA4228C2} | FiberMatrix
Pyramid-Subblock-Statistics
---------------------------
number of subblocks with scale 1/1: 33
Hello,
I see that this project is licensed under GPL. Is there an alternate commercial license available for distribution with proprietary software?
Cheers,
Thomas
Newer versions of ZEN embed the scan profile name as an attachment
<AttachmentInfos>
<AttachmentInfo Id="Label:1">
<Label>
<Barcodes>
<Barcode Id="Barcode:1">
<Type>Type: DataMatrix
lue: 071140J
ientation: Top To Bottom
gle: 94.080002
ror Correction Level: 0
m Errors Corrected: 0
mension: 12x12
Type>
<Content>071140J</Content>
</Barcode>
</Barcodes>
<OCRs>
<OCR Id="OCR:1">
<Content />
</OCR>
</OCRs>
</Label>
<Profile>
<ProfileName>Matsunami_10X_ER_CLC_v1.0.0.czspf</ProfileName>
<IsProfileModified>False</IsProfileModified>
</Profile>
</AttachmentInfo>
</AttachmentInfos>
I'm not sure how I'm expected to read the value Matsunami_10X_ER_CLC_v1.0.0.czspf
. I can find the attachment itself no problem, but ReadAttachment returns a ~37KB blob (!). It says the file type is "Zip-Comp", but it sure doesn't appear to be a zip archive, and why would it be?
reader->EnumerateSubset(nullptr, "Profile", [&](int index, const libCZI::AttachmentInfo& info)->bool {
auto attachment = reader->ReadAttachment(index);
size_t sz = 0;
auto data = attachment->GetRawData(&sz);
// do stuff
return false;
});
The docs aren't clear here (just auto generated stuff). All I want is the ProfileName value. It appears as though these chunks of XML are just pointers to an actual file in the CZI, but really... I just want that metadata.
I realize that I can parse the XML myself, but is there a nicer/more robust way to extract the data here? You'd think it would come with the attachment info object, but I don't see it.
Just out of curiosity... If I use cziCMD to extract the attachment it adds a Zip-Comp extension. What is a Zip-Comp file?!
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.