Skip to content

Instantly share code, notes, and snippets.

@bogovicj
Created April 27, 2021 21:12
Show Gist options
  • Save bogovicj/e397698a896908855a454dcaaf0d12e2 to your computer and use it in GitHub Desktop.
Save bogovicj/e397698a896908855a454dcaaf0d12e2 to your computer and use it in GitHub Desktop.
Resave a subset of a multiscale cosem dataset locally
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