Created
April 27, 2021 21:12
-
-
Save bogovicj/e397698a896908855a454dcaaf0d12e2 to your computer and use it in GitHub Desktop.
Resave a subset of a multiscale cosem dataset locally
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package cosem; | |
import java.io.IOException; | |
import java.util.Arrays; | |
import org.janelia.saalfeldlab.n5.DatasetAttributes; | |
import org.janelia.saalfeldlab.n5.N5Reader; | |
import org.janelia.saalfeldlab.n5.N5Writer; | |
import org.janelia.saalfeldlab.n5.ij.N5Factory; | |
import org.janelia.saalfeldlab.n5.imglib2.N5Utils; | |
import org.janelia.saalfeldlab.n5.metadata.N5CosemMetadata; | |
import org.janelia.saalfeldlab.n5.metadata.N5CosemMetadata.CosemTransform; | |
import net.imglib2.cache.img.CachedCellImg; | |
import net.imglib2.realtransform.AffineTransform3D; | |
import net.imglib2.type.NativeType; | |
import net.imglib2.view.IntervalView; | |
import net.imglib2.view.Views; | |
/* | |
* This is very hacky, don't trust this too much. | |
*/ | |
public class ResaveCosemMultiscaleSubset | |
{ | |
public static <T extends NativeType<T>> void main( String[] args ) throws IOException | |
{ | |
final String n5InUrl = "https://janelia-cosem.s3.amazonaws.com/jrc_hela-2/jrc_hela-2.n5"; | |
final String n5OutUrl = "/home/john/projects/cosem/downloadDataSubsets/jrc-hela-2.n5"; | |
final N5Reader n5R = new N5Factory().openReader( n5InUrl ); | |
final N5Writer n5W = new N5Factory().openWriter( n5OutUrl ); | |
// edit if you want | |
String[] levelList = new String[] { "s0", "s1", "s2", "s3" }; | |
double[] minPhysical = new double[] { 24400, 4400, 14342 }; | |
double[] maxPhysical = new double[] { 25599, 5599, 15588 }; | |
// image data | |
String indatasetBase = "/em/fibsem-uint16"; | |
String outdatasetBase = "bTrainingBlock"; | |
saveLevels( n5R, n5W, indatasetBase, outdatasetBase, levelList, minPhysical, maxPhysical ); | |
// labels | |
indatasetBase = "/labels/gt"; | |
outdatasetBase = "bTrainingBlock_labels"; | |
saveLevels( n5R, n5W, indatasetBase, outdatasetBase, levelList, minPhysical, maxPhysical ); | |
} | |
public static <T extends NativeType<T>> void saveLevels( | |
final N5Reader n5R, | |
final N5Writer n5W, | |
final String indatasetBase, | |
final String outdatasetBase, | |
final String[] levelList, | |
final double[] minPhysical, | |
final double[] maxPhysical ) throws IOException | |
{ | |
double[] baseScale = null; | |
for( String level : levelList ) | |
{ | |
System.out.println( "level: " + level ); | |
String indataset = indatasetBase + "/" + level; | |
String outdataset = outdatasetBase + "/" + level; | |
CosemTransform transform = n5R.getAttribute( indataset, "transform", N5CosemMetadata.CosemTransform.class ); | |
AffineTransform3D pixelToPhysical = transform.toAffineTransform3d(); | |
System.out.println( Arrays.toString( transform.getAffine().getRowPackedCopy())); | |
if( baseScale == null ) | |
baseScale = transform.scale; | |
CachedCellImg< T, ? > img = N5Utils.open( n5R, indataset ); | |
DatasetAttributes attrsIn = n5R.getDatasetAttributes( indataset ); | |
double[] tmp = new double[ 3 ]; | |
pixelToPhysical.applyInverse( tmp, minPhysical ); | |
long[] minLevel = Arrays.stream( tmp ).mapToLong( x -> (long)Math.floor( x ) ).toArray(); | |
pixelToPhysical.applyInverse( tmp, maxPhysical ); | |
long[] maxLevel = Arrays.stream( tmp ).mapToLong( x -> (long)Math.floor( x ) ).toArray(); | |
double[] newOffset = new double[ 3 ]; | |
int j = 2; | |
for( int i = 0; i < 3; i++ ) | |
{ | |
newOffset[ j ] = minLevel[ i ] * transform.scale[ j ] + transform.translate[ j ]; | |
j--; | |
} | |
CosemTransform newTransform = new CosemTransform( transform.axes, transform.scale, newOffset, transform.units ); | |
System.out.println( "minLevel: " + Arrays.toString( minLevel )); | |
System.out.println( "maxLevel: " + Arrays.toString( maxLevel )); | |
System.out.println( "newOffset: " + Arrays.toString( newOffset )); | |
IntervalView< T > imgCrop = Views.interval( img, minLevel, maxLevel ); | |
N5Utils.save( imgCrop, n5W, outdataset, attrsIn.getBlockSize(), attrsIn.getCompression() ); | |
n5W.setAttribute( outdataset, "transform", newTransform ); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment