use of org.janelia.saalfeldlab.n5.ij.N5Factory in project bigwarp by saalfeldlab.
the class BigWarpInit method loadN5Source.
public static Source<?> loadN5Source(final String n5Root, final String n5Dataset) {
final N5Reader n5;
try {
n5 = new N5Factory().openReader(n5Root);
} catch (IOException e) {
e.printStackTrace();
return null;
}
final N5MetadataParser<?>[] PARSERS = new N5MetadataParser[] { new ImagePlusLegacyMetadataParser(), new N5CosemMetadataParser(), new N5SingleScaleMetadataParser(), new CanonicalMetadataParser(), new N5GenericSingleScaleMetadataParser() };
final N5MetadataParser<?>[] GROUP_PARSERS = new N5MetadataParser[] { new N5CosemMultiScaleMetadata.CosemMultiScaleParser(), new N5ViewerMultiscaleMetadataParser(), new CanonicalMetadataParser() };
N5Metadata meta = null;
try {
final N5DatasetDiscoverer discoverer = new N5DatasetDiscoverer(n5, N5DatasetDiscoverer.fromParsers(PARSERS), N5DatasetDiscoverer.fromParsers(GROUP_PARSERS));
final N5TreeNode node = discoverer.discoverAndParseRecursive(n5Dataset);
meta = node.getMetadata();
} catch (IOException e) {
}
if (meta instanceof MultiscaleMetadata) {
return openAsSourceMulti(n5, (MultiscaleMetadata<?>) meta, true);
} else {
return openAsSource(n5, meta, true);
}
}
use of org.janelia.saalfeldlab.n5.ij.N5Factory in project bigwarp by saalfeldlab.
the class ApplyBigwarpPlugin method runN5Export.
public static <S, T extends NativeType<T> & NumericType<T>> void runN5Export(final BigWarpData<S> data, final List<SourceAndConverter<S>> sources, final String fieldOfViewOption, final Interval outputInterval, final Interpolation interp, final double[] offset, final double[] resolution, final String unit, final ProgressWriter progressWriter, final WriteDestinationOptions writeOpts, final ExecutorService exec) {
final int nd = BigWarp.detectNumDims(data.sources);
// setup n5 parameters
final String dataset = writeOpts.n5Dataset;
final int[] blockSize = writeOpts.blockSize;
final Compression compression = writeOpts.compression;
if (dataset == null || dataset.isEmpty()) {
return;
}
N5Writer n5;
try {
n5 = new N5Factory().openWriter(writeOpts.pathOrN5Root);
} catch (IOException e1) {
e1.printStackTrace();
return;
}
// build metadata
final String[] axes = nd == 2 ? new String[] { "y", "x" } : new String[] { "z", "y", "x" };
final String[] units = nd == 2 ? new String[] { unit, unit } : new String[] { unit, unit, unit };
final N5CosemMetadata metadata = new N5CosemMetadata("", new N5CosemMetadata.CosemTransform(axes, resolution, offset, units), null);
N5CosemMetadataParser parser = new N5CosemMetadataParser();
// setup physical to pixel transform
final AffineTransform3D resolutionTransform = new AffineTransform3D();
resolutionTransform.set(resolution[0], 0, 0);
resolutionTransform.set(resolution[1], 1, 1);
if (resolution.length > 2)
resolutionTransform.set(resolution[2], 2, 2);
final AffineTransform3D offsetTransform = new AffineTransform3D();
offsetTransform.set(offset[0], 0, 3);
offsetTransform.set(offset[1], 1, 3);
if (resolution.length > 2)
offsetTransform.set(offset[2], 2, 3);
final AffineTransform3D pixelRenderToPhysical = new AffineTransform3D();
pixelRenderToPhysical.concatenate(resolutionTransform);
pixelRenderToPhysical.concatenate(offsetTransform);
// render and write
final int N = data.movingSourceIndices.length;
for (int i = 0; i < N; i++) {
final int movingSourceIndex = data.movingSourceIndices[i];
@SuppressWarnings("unchecked") final RealRandomAccessible<T> raiRaw = (RealRandomAccessible<T>) sources.get(movingSourceIndex).getSpimSource().getInterpolatedSource(0, 0, interp);
// to pixel space
final AffineRandomAccessible<T, AffineGet> rai = RealViews.affine(raiRaw, pixelRenderToPhysical.inverse());
final IntervalView<T> img = Views.interval(Views.raster(rai), Intervals.zeroMin(outputInterval));
final String srcName = data.sources.get(data.movingSourceIndices[i]).getSpimSource().getName();
String destDataset = dataset;
if (N > 1)
destDataset = dataset + String.format("/%s", srcName.replace(" ", "_"));
RandomAccessibleInterval<T> imgToWrite;
if (nd == 2)
imgToWrite = Views.hyperSlice(img, 2, 0);
else
imgToWrite = img;
try {
N5Utils.save(imgToWrite, n5, destDataset, blockSize, compression, exec);
if (parser != null && metadata != null)
parser.writeMetadata(metadata, n5, destDataset);
} catch (Exception e) {
e.printStackTrace();
}
progressWriter.setProgress((i + 1) / ((double) N));
}
progressWriter.setProgress(1.0);
}
use of org.janelia.saalfeldlab.n5.ij.N5Factory in project bigwarp by saalfeldlab.
the class BigWarpToDeformationFieldPlugIn method writeN5.
public static void writeN5(final String n5BasePath, final String n5Dataset, final LandmarkTableModel ltm, final long[] dims, final double[] spacing, final int[] spatialBlockSize, final Compression compression, final int nThreads) throws IOException {
final ThinPlateR2LogRSplineKernelTransform tpsRaw = ltm.getTransform();
final AffineGet affine = toAffine(tpsRaw);
/*
* "remove the affine" from the total transform
* by concatenating the inverse of the affine to be removed
*/
final ThinplateSplineTransform tpsTotal = new ThinplateSplineTransform(tpsRaw);
final RealTransformSequence seq = new RealTransformSequence();
seq.add(tpsTotal);
seq.add(affine.inverse());
AffineGet pixelToPhysical = null;
if (spacing.length == 2)
pixelToPhysical = new Scale2D(spacing);
else if (spacing.length == 3)
pixelToPhysical = new Scale3D(spacing);
FloatImagePlus<FloatType> dfieldRaw = convertToDeformationField(dims, seq, pixelToPhysical, nThreads);
// this works for both 2d and 3d, it turn out
RandomAccessibleInterval<FloatType> dfield = Views.permute(Views.permute(dfieldRaw, 0, 2), 1, 2);
int[] blockSize = new int[spatialBlockSize.length + 1];
blockSize[0] = spatialBlockSize.length;
for (int i = 0; i < spatialBlockSize.length; i++) {
blockSize[i + 1] = spatialBlockSize[i];
}
final N5Writer n5 = new N5Factory().openWriter(n5BasePath);
N5DisplacementField.save(n5, n5Dataset, affine, dfield, spacing, blockSize, compression);
N5DisplacementField.saveAffine(affine, n5, n5Dataset);
}
Aggregations