Skip to content

Commit

Permalink
Merge pull request #279 from trackmate-sc/v8-bvv-imglib2-mesh
Browse files Browse the repository at this point in the history
Base the 3D mesh on the prototype imglib2-mesh library.
  • Loading branch information
tinevez authored Sep 12, 2023
2 parents 110941e + 25d244e commit 3b57316
Show file tree
Hide file tree
Showing 26 changed files with 115 additions and 508 deletions.
15 changes: 7 additions & 8 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -167,14 +167,9 @@
<artifactId>imagej-common</artifactId>
</dependency>
<dependency>
<groupId>net.imagej</groupId>
<artifactId>imagej-mesh</artifactId>
<version>0.8.2-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>net.imagej</groupId>
<artifactId>imagej-mesh-io</artifactId>
<version>0.1.3-SNAPSHOT</version>
<groupId>net.imglib2</groupId>
<artifactId>imglib2-mesh</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>net.imagej</groupId>
Expand Down Expand Up @@ -237,6 +232,10 @@
</dependency>

<!-- Other dependencies -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>com.github.vlsi.mxgraph</groupId>
<artifactId>jgraphx</artifactId>
Expand Down
21 changes: 10 additions & 11 deletions src/main/java/fiji/plugin/trackmate/SpotMesh.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,18 @@
import java.util.stream.Collectors;

import fiji.plugin.trackmate.util.mesh.SpotMeshIterable;
import net.imagej.mesh.Mesh;
import net.imagej.mesh.Meshes;
import net.imagej.mesh.Triangles;
import net.imagej.mesh.Vertices;
import net.imagej.mesh.alg.zslicer.RamerDouglasPeucker;
import net.imagej.mesh.alg.zslicer.Slice;
import net.imagej.mesh.alg.zslicer.ZSlicer;
import net.imagej.mesh.nio.BufferMesh;
import net.imglib2.IterableInterval;
import net.imglib2.RandomAccessible;
import net.imglib2.RealInterval;
import net.imglib2.RealLocalizable;
import net.imglib2.RealPoint;
import net.imglib2.mesh.Meshes;
import net.imglib2.mesh.alg.zslicer.RamerDouglasPeucker;
import net.imglib2.mesh.alg.zslicer.Slice;
import net.imglib2.mesh.alg.zslicer.ZSlicer;
import net.imglib2.mesh.obj.Mesh;
import net.imglib2.mesh.obj.Vertices;
import net.imglib2.mesh.obj.nio.BufferMesh;
import net.imglib2.type.numeric.RealType;
import net.imglib2.util.Intervals;

Expand Down Expand Up @@ -50,7 +49,7 @@ public SpotMesh(
*
* @param quality
* @param name
* @param mesh
* @param m
*/
public SpotMesh(
final Mesh m,
Expand Down Expand Up @@ -207,7 +206,7 @@ public static double volume( final Mesh mesh )
{

final Vertices vertices = mesh.vertices();
final Triangles triangles = mesh.triangles();
final net.imglib2.mesh.obj.Triangles triangles = mesh.triangles();
final long nTriangles = triangles.size();
double sum = 0.;
for ( long t = 0; t < nTriangles; t++ )
Expand Down Expand Up @@ -311,7 +310,7 @@ public String toString()
str.append( String.format( "\n%5d: %7.2f %7.2f %7.2f",
i, vertices.x( i ), vertices.y( i ), vertices.z( i ) ) );

final Triangles triangles = mesh.triangles();
final net.imglib2.mesh.obj.Triangles triangles = mesh.triangles();
final long nTriangles = triangles.size();
str.append( "\nF (" + nTriangles + "):" );
for ( long i = 0; i < nTriangles; i++ )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,11 @@
import fiji.plugin.trackmate.TrackMate;
import fiji.plugin.trackmate.gui.displaysettings.DisplaySettings;
import fiji.plugin.trackmate.io.IOUtils;
import net.imagej.mesh.Mesh;
import net.imagej.mesh.Meshes;
import net.imagej.mesh.io.ply.PLYMeshIO;
import net.imagej.mesh.nio.BufferMesh;
import net.imagej.mesh.obj.transform.TranslateMesh;
import net.imglib2.mesh.Meshes;
import net.imglib2.mesh.io.ply.PLYMeshIO;
import net.imglib2.mesh.obj.Mesh;
import net.imglib2.mesh.obj.nio.BufferMesh;
import net.imglib2.mesh.obj.transform.TranslateMesh;

public class MeshSeriesExporter extends AbstractTMAction
{
Expand Down Expand Up @@ -106,8 +106,6 @@ public static void exportMeshesToFileSeries( final SpotCollection spots, final F
final File folder = new File( folderName );
folder.mkdirs();

final PLYMeshIO io = new PLYMeshIO();

final NavigableSet< Integer > frames = spots.keySet();
for ( final Integer frame : frames )
{
Expand All @@ -128,7 +126,7 @@ public static void exportMeshesToFileSeries( final SpotCollection spots, final F
Meshes.calculateNormals( merged, mesh );
try
{
io.save( mesh, targetFile.getAbsolutePath() );
PLYMeshIO.save( mesh, targetFile.getAbsolutePath() );
}
catch ( final IOException e )
{
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/fiji/plugin/trackmate/detection/MaskUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -412,11 +412,11 @@ public static < T extends RealType< T >, R extends RealType< R > > List< Spot >
* @return a list of spots, with ROI.
*/
public static < T extends RealType< T >, S extends RealType< S > > List< Spot > fromMaskWithROI(
final RandomAccessible< T > input,
final Interval interval,
final double[] calibration,
final boolean simplify,
final int numThreads,
final RandomAccessible< T > input,
final Interval interval,
final double[] calibration,
final boolean simplify,
final int numThreads,
final RandomAccessibleInterval< S > qualityImage )
{
final ImgLabeling< Integer, IntType > labeling = toLabeling(
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/fiji/plugin/trackmate/detection/Process2DZ.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@
import fiji.plugin.trackmate.util.TMUtils;
import ij.ImagePlus;
import net.imagej.ImgPlus;
import net.imagej.mesh.alg.TaubinSmoothing;
import net.imagej.mesh.nio.BufferMesh;
import net.imagej.mesh.obj.transform.TranslateMesh;
import net.imglib2.Interval;
import net.imglib2.RandomAccess;
import net.imglib2.RandomAccessible;
import net.imglib2.algorithm.MultiThreadedBenchmarkAlgorithm;
import net.imglib2.img.display.imagej.ImageJFunctions;
import net.imglib2.mesh.alg.TaubinSmoothing;
import net.imglib2.mesh.obj.nio.BufferMesh;
import net.imglib2.mesh.obj.transform.TranslateMesh;
import net.imglib2.type.NativeType;
import net.imglib2.type.numeric.RealType;
import net.imglib2.view.IntervalView;
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/fiji/plugin/trackmate/detection/SpotMeshUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,16 @@

import fiji.plugin.trackmate.Spot;
import fiji.plugin.trackmate.SpotMesh;
import net.imagej.mesh.Mesh;
import net.imagej.mesh.MeshConnectedComponents;
import net.imagej.mesh.Meshes;
import net.imagej.mesh.Vertices;
import net.imagej.mesh.nio.BufferMesh;
import net.imglib2.Interval;
import net.imglib2.IterableInterval;
import net.imglib2.RandomAccessible;
import net.imglib2.RandomAccessibleInterval;
import net.imglib2.RealInterval;
import net.imglib2.mesh.Meshes;
import net.imglib2.mesh.alg.MeshConnectedComponents;
import net.imglib2.mesh.obj.Mesh;
import net.imglib2.mesh.obj.Vertices;
import net.imglib2.mesh.obj.nio.BufferMesh;
import net.imglib2.roi.labeling.ImgLabeling;
import net.imglib2.roi.labeling.LabelRegion;
import net.imglib2.roi.labeling.LabelRegions;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@

import fiji.plugin.trackmate.Spot;
import fiji.plugin.trackmate.SpotMesh;
import fiji.plugin.trackmate.util.mesh.EllipsoidFitter;
import fiji.plugin.trackmate.util.mesh.EllipsoidFitter.EllipsoidFit;
import net.imglib2.RealLocalizable;
import net.imglib2.mesh.alg.EllipsoidFitter;
import net.imglib2.mesh.alg.EllipsoidFitter.EllipsoidFit;
import net.imglib2.type.numeric.RealType;

public class Spot3DFitEllipsoidAnalyzer< T extends RealType< T > > extends AbstractSpotFeatureAnalyzer< T >
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,26 +23,19 @@

import fiji.plugin.trackmate.Spot;
import fiji.plugin.trackmate.SpotMesh;
import net.imagej.mesh.Mesh;
import net.imagej.mesh.Meshes;
import net.imagej.ops.geom.geom3d.DefaultConvexHull3D;
import net.imagej.ops.geom.geom3d.DefaultSurfaceArea;
import net.imglib2.mesh.MeshShapeDescriptors;
import net.imglib2.mesh.alg.hull.ConvexHull;
import net.imglib2.mesh.obj.naive.NaiveDoubleMesh;
import net.imglib2.type.numeric.RealType;

public class Spot3DShapeAnalyzer< T extends RealType< T > > extends AbstractSpotFeatureAnalyzer< T >
{

private final boolean is3D;

private final DefaultConvexHull3D convexHull;

private final DefaultSurfaceArea surfaceArea;

public Spot3DShapeAnalyzer( final boolean is3D )
{
this.is3D = is3D;
this.convexHull = new DefaultConvexHull3D();
this.surfaceArea = new DefaultSurfaceArea();
}

@Override
Expand All @@ -58,13 +51,13 @@ public void process( final Spot spot )
if ( spot instanceof SpotMesh )
{
final SpotMesh sm = ( SpotMesh ) spot;
final Mesh ch = convexHull.calculate( sm.getMesh() );
final NaiveDoubleMesh ch = ConvexHull.calculate( sm.getMesh() );
volume = sm.volume();
final double volumeCH = Meshes.volume( ch );
final double volumeCH = MeshShapeDescriptors.volume( ch );
solidity = volume / volumeCH;

sa = surfaceArea.calculate( sm.getMesh() ).get();
final double saCH = surfaceArea.calculate( ch ).get();
sa = MeshShapeDescriptors.surfaceArea( sm.getMesh() );
final double saCH = MeshShapeDescriptors.surfaceArea( ch );
convexity = sa / saCH;

final double sphereArea = Math.pow( Math.PI, 1. / 3. )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -485,6 +485,10 @@ public void run()
GuiUtils.positionWindow( SwingUtilities.getWindowAncestor( bvvHandle.getViewerPanel() ), c );
}
}
catch ( final Exception e )
{
e.printStackTrace();
}
finally
{
enabler.reenable();
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/fiji/plugin/trackmate/io/TmXmlReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,6 @@
import static fiji.plugin.trackmate.io.TmXmlKeys.TRACK_ID_ELEMENT_KEY;
import static fiji.plugin.trackmate.io.TmXmlKeys.TRACK_NAME_ATTRIBUTE_NAME;
import static fiji.plugin.trackmate.io.TmXmlWriter.MESH_FILE_EXTENSION;
import static fiji.plugin.trackmate.io.TmXmlWriter.PLY_MESH_IO;
import static fiji.plugin.trackmate.tracking.TrackerKeys.XML_ATTRIBUTE_TRACKER_NAME;

import java.io.File;
Expand Down Expand Up @@ -156,9 +155,10 @@
import fiji.plugin.trackmate.visualization.trackscheme.TrackScheme;
import ij.IJ;
import ij.ImagePlus;
import net.imagej.mesh.Mesh;
import net.imagej.mesh.Meshes;
import net.imagej.mesh.nio.BufferMesh;
import net.imglib2.mesh.Meshes;
import net.imglib2.mesh.io.ply.PLYMeshIO;
import net.imglib2.mesh.obj.Mesh;
import net.imglib2.mesh.obj.nio.BufferMesh;

public class TmXmlReader
{
Expand Down Expand Up @@ -960,7 +960,7 @@ private SpotCollection getSpots( final Element modelElement )
// Deserialize mesh.
try
{
final Mesh m = PLY_MESH_IO.open( zipFile.getInputStream( entry ) );
final Mesh m = PLYMeshIO.open( zipFile.getInputStream( entry ) );
final BufferMesh mesh = new BufferMesh( ( int ) m.vertices().size(), ( int ) m.triangles().size() );
Meshes.calculateNormals( m, mesh );

Expand Down
10 changes: 4 additions & 6 deletions src/main/java/fiji/plugin/trackmate/io/TmXmlWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -133,15 +133,13 @@
import fiji.plugin.trackmate.gui.displaysettings.DisplaySettingsIO;
import gnu.trove.map.hash.TIntIntHashMap;
import gnu.trove.procedure.TIntIntProcedure;
import net.imagej.mesh.Mesh;
import net.imagej.mesh.io.ply.PLYMeshIO;
import net.imagej.mesh.obj.transform.TranslateMesh;
import net.imglib2.mesh.io.ply.PLYMeshIO;
import net.imglib2.mesh.obj.Mesh;
import net.imglib2.mesh.obj.transform.TranslateMesh;

public class TmXmlWriter
{

static final PLYMeshIO PLY_MESH_IO = new PLYMeshIO();

static final String MESH_FILE_EXTENSION = ".meshes";

/** Zip compression level (0-9) */
Expand Down Expand Up @@ -791,7 +789,7 @@ protected void writeSpotMeshes( final Iterable< Spot > spots )
final SpotMesh sm = ( SpotMesh ) spot;
final Mesh mesh = sm.getMesh();
final Mesh translated = TranslateMesh.translate( mesh, spot );
final byte[] bs = PLY_MESH_IO.writeBinary( translated );
final byte[] bs = PLYMeshIO.writeBinary( translated );

final String entryName = spot.ID() + ".ply";
zos.putNextEntry( new ZipEntry( entryName ) );
Expand Down
Loading

0 comments on commit 3b57316

Please sign in to comment.