Skip to content

Instantly share code, notes, and snippets.

@imagejan
Created July 4, 2023 09:03
Show Gist options
  • Save imagejan/ceb75ec5f74c298dd9ee7836f2e0ae07 to your computer and use it in GitHub Desktop.
Save imagejan/ceb75ec5f74c298dd9ee7836f2e0ae07 to your computer and use it in GitHub Desktop.

Revisions

  1. imagejan created this gist Jul 4, 2023.
    65 changes: 65 additions & 0 deletions Mesh_Deformation.groovy
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,65 @@
    #@ File (style="extension:bmf") meshFile
    #@ File (style="save") newMeshFile
    #@ ImagePlus intensity_image
    #@ LogService log
    #@ Double (value=200.0) gamma
    #@ Double (value=3.0) alpha
    #@ Double (value=0.0) pressure
    #@ Double (value=0.0) steric_neighbors
    #@ Double (value=0.0002) image_weight
    #@ Integer (value=2) divisions
    #@ Double (value=5.0) beta

    #@ Integer (value=100) steps

    import deformablemesh.SegmentationModel
    import deformablemesh.externalenergies.ImageEnergyType
    import deformablemesh.geometry.ConnectionRemesher
    import deformablemesh.io.MeshReader
    import deformablemesh.io.MeshWriter

    reader = new MeshReader(meshFile)
    tracks = reader.loadMeshes()

    // Map list of tracks to list of meshes on frame 0
    FRAME = 0
    meshes = tracks.collect {
    it.getMesh(FRAME)
    }
    log.info( meshes.size() + " meshes loaded." )


    // Start mesh deformation
    model = new SegmentationModel()
    log.info( "Deforming meshes on image " + intensity_image.getTitle() )

    model.setGamma(gamma)
    model.setAlpha(alpha)
    model.setPressure(pressure)
    model.setOriginalPlus(intensity_image)
    model.setStericNeighborWeight(steric_neighbors)
    model.setWeight(image_weight)
    model.setDivisions(divisions)
    model.setBeta(beta)
    model.setImageEnergyType(ImageEnergyType.PerpendicularIntensity)

    model.deformMeshes(meshes, steps)

    // Remesh
    minConnectionLength = 0.01
    maxConnectionLength = 0.02
    new_meshes = meshes.collect {
    remesher = new ConnectionRemesher()
    remesher.setMinAndMaxLengths(minConnectionLength, maxConnectionLength)
    remesher.remesh(it)
    }

    // Add new meshes to tracks object
    [tracks, new_meshes].transpose().each {
    it[0].addMesh(FRAME, it[1])
    }

    // Write meshes to file
    log.info( "Writing " + tracks.size() + " meshes..." )
    MeshWriter.saveMeshes(newMeshFile, tracks)
    log.info( "Finished writing deformed and remeshed meshes." )