de.unihalle.informatik.MiToBo.segmentation.levelset.nonPDE
Class LevelsetSolveNonPDE

java.lang.Object
  extended by de.unihalle.informatik.Alida.operator.ALDOperator
      extended by de.unihalle.informatik.MiToBo.core.operator.MTBOperator
          extended by de.unihalle.informatik.MiToBo.segmentation.levelset.nonPDE.LevelsetSolveNonPDE
All Implemented Interfaces:
de.unihalle.informatik.Alida.datatypes.ALDConfigurationValidator

@ALDAOperator(genericExecutionMode=ALL)
public class LevelsetSolveNonPDE
extends MTBOperator

Implements a level set solver which may optionally perserve the topology using non PDE optimization. See: Song, B. and Chan, T.: A fast algorithm for level set based optimization, UCLA Cam Report, 2002

Optionally a invalid image may be supplied which defines pixels with nonzero value as invalid and not considered for segmentation.

The resulting image is a byte image, where background and invalid pixels have zeros and the obejct compontens/phases values starting from one.

NOTE: if verbose is turned on runtime will typically be increase considerably due to outputting (and consequently computing) the complete energy.

Currently only 2D images are supported.

Author:
Stefan Posch, partially bases on code by Markus Glass

Nested Class Summary
private  class LevelsetSolveNonPDE.CoordInt3D
          Just to hold 3D coordinate and nothing else
private  class LevelsetSolveNonPDE.LevelsetIterator
          Abstract class for iterators of pixels/voxels of the level set function.
private  class LevelsetSolveNonPDE.LevelsetIteratorContourPoints
          Iterator for all contour pixels/voxels of the level set function excluding invalid pixels/voxels.
private  class LevelsetSolveNonPDE.LevelsetIteratorScan
          Iterator for all pixels/voxels of the level set function in scanline fashion excluding invalid pixels/voxels.
 
Nested classes/interfaces inherited from class de.unihalle.informatik.Alida.operator.ALDOperator
de.unihalle.informatik.Alida.operator.ALDOperator.HidingMode
 
Field Summary
private  java.lang.Integer debug
           
private  MTBGenericEnergyNonPDE energy
           
private static int FLAG_SOLVER
           
private static int FLAG_SOLVER2
           
private  java.util.Vector<MTBImageByte> intermediateLS
           
private  MTBImage invalidImage
           
private  java.lang.Integer maxIterations
           
private  byte[] nbPhases
          Phases of the 8-neighbors of the current pixel.
private  java.util.Vector<java.lang.Byte> nbPhasesNonredundant
          Non redudant phases in the neighborhood of the current pixel.
private  java.lang.Integer numIterations
           
private  MTBLevelsetMembership phi
           
private  java.util.Vector<java.lang.Byte> potentialNewPhases
          Phases the current pixel is (topologically) allowed to change to.
private  java.lang.Boolean preserveTopology
           
private  MTBImageByte resultImage
           
private  java.lang.Integer spacingIntermediate
           
private  boolean verbose
           
 
Fields inherited from class de.unihalle.informatik.Alida.operator.ALDOperator
completeDAG, name, portHashAccess, versionProvider
 
Constructor Summary
LevelsetSolveNonPDE()
          Constructor
LevelsetSolveNonPDE(MTBGenericEnergyNonPDE energy, MTBLevelsetMembership phi, int maxIter, int spacingIntermediate, MTBImage invalidImg, boolean preserveTopology)
          Constructor.
 
Method Summary
private  void get8NeighborsPhase(int x, int y, byte[] nb)
          Compute phases of 8 neighbors of (x,y) and store these in the array nb.
 java.lang.Integer getDebug()
          Get value of debug.
 MTBGenericEnergyNonPDE getEnergy()
          Get value of energy.
 java.util.Vector<MTBImageByte> getIntermediateLS()
          Get value of intermediateLS.
 MTBImage getInvalidImage()
          Get value of invalidImage.
 java.lang.Integer getMaxIterations()
          Get value of maxIterations.
 java.lang.Integer getNumIterations()
          Get value of numIterations Explanation: Number of iterations performed
 MTBLevelsetMembership getPhi()
          Get value of phi.
private  java.util.Vector<java.lang.Byte> getPotentialNewPhases2D(boolean preserveTopology, int x, int y)
           
 java.lang.Boolean getPreserveTopology()
          Get value of preserveTopology.
 MTBImageByte getResultImage()
          Get value of resultImage.
 java.lang.Integer getSpacingIntermediate()
          Get value of spacingIntermediate.
private  boolean hasForeign4Neighbor(byte phase, byte[] nbPhases)
          Check whether there is a different/foreign phase (then phase) in the 4-neighborhood as represented in the 8 neighborhood nbPhases.
private  int numBlockChange(byte[] nbPhases, int r)
          Return number of connected components of different/foreign phase then r in the 8 neighborhood nbPhases, which are 4 connected to the current pixel.
protected  void operate()
          This function does the actual work, i.e. optimization of the energy.
private  void printNbPhases(byte[] nbPhases)
           
 void setDebug(java.lang.Integer value)
          Set value of debug.
 void setMaxIterations(java.lang.Integer value)
          Set value of maxIterations.
 void setPreserveTopology(java.lang.Boolean value)
          Set value of preserveTopology.
 void setSpacingIntermediate(java.lang.Integer value)
          Set value of spacingIntermediate.
private  boolean solve()
           
 
Methods inherited from class de.unihalle.informatik.MiToBo.core.operator.MTBOperator
readResolve
 
Methods inherited from class de.unihalle.informatik.Alida.operator.ALDOperator
deserializeFromXmlFile, fieldContained, getALDPortHashAccessKey, getConstructionMode, getInInoutNames, getInInoutNames, getInNames, getInOutNames, getMissingRequiredInputs, getName, getNumParameters, getOutInoutNames, getOutNames, getParameter, getParameterDescriptor, getParameterNames, getSupplementalNames, getVerbose, getVersion, isConfigured, parametersToXmlObject, print, print, print, printInterface, printInterface, readHistory, reinitializeParameterDescriptors, runOp, runOp, runOp, serializeToXmlFile, setConstructionMode, setName, setParameter, setParametersFromXml, setParametersFromXml, setVerbose, toStringVerbose, unconfiguredItems, validate, validateCustom, validateGeneric, writeHistory, writeHistory, writeHistory, writeParametersToXml
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

debug

@Parameter(label="debug",
           direction=IN,
           supplemental=true,
           description="Additional dubugging informaton")
private java.lang.Integer debug

energy

@Parameter(label="energy",
           required=true,
           direction=IN,
           description="Energy to use for optimization")
private MTBGenericEnergyNonPDE energy

FLAG_SOLVER

private static final int FLAG_SOLVER
See Also:
Constant Field Values

FLAG_SOLVER2

private static final int FLAG_SOLVER2
See Also:
Constant Field Values

intermediateLS

@Parameter(label="intermediateLS",
           direction=IN,
           supplemental=true,
           description="intermediate of levelset functions")
private java.util.Vector<MTBImageByte> intermediateLS

invalidImage

@Parameter(label="invalidImage",
           required=false,
           direction=IN,
           description="optional image of invalid pixels (pixels <> 0 are invalid)")
private MTBImage invalidImage

maxIterations

@Parameter(label="maxIterations",
           required=false,
           direction=IN,
           description="Maximal number of iterations")
private java.lang.Integer maxIterations

nbPhases

private byte[] nbPhases
Phases of the 8-neighbors of the current pixel. This array is recycled for efficiency.


nbPhasesNonredundant

private java.util.Vector<java.lang.Byte> nbPhasesNonredundant
Non redudant phases in the neighborhood of the current pixel. This vector is recycled for efficiency.


numIterations

@Parameter(label="numIterations",
           direction=IN,
           supplemental=true,
           description="Number of iterations performed")
private java.lang.Integer numIterations

phi

@Parameter(label="phi",
           required=true,
           direction=IN,
           description="Initial levelset function")
private MTBLevelsetMembership phi

potentialNewPhases

private java.util.Vector<java.lang.Byte> potentialNewPhases
Phases the current pixel is (topologically) allowed to change to. This vector is recycled for efficiency.


preserveTopology

@Parameter(label="preserveTopology",
           required=true,
           direction=IN,
           description="Topology preserving mode?")
private java.lang.Boolean preserveTopology

resultImage

@Parameter(label="resultImage",
           direction=OUT,
           description="Result image")
private MTBImageByte resultImage

spacingIntermediate

@Parameter(label="spacingIntermediate",
           direction=IN,
           supplemental=true,
           description="spacing of intermediate of levelset function returned; 0 = none?")
private java.lang.Integer spacingIntermediate

verbose

private boolean verbose
Constructor Detail

LevelsetSolveNonPDE

public LevelsetSolveNonPDE()
                    throws de.unihalle.informatik.Alida.exceptions.ALDOperatorException
Constructor

Throws:
de.unihalle.informatik.Alida.exceptions.ALDOperatorException

LevelsetSolveNonPDE

public LevelsetSolveNonPDE(MTBGenericEnergyNonPDE energy,
                           MTBLevelsetMembership phi,
                           int maxIter,
                           int spacingIntermediate,
                           MTBImage invalidImg,
                           boolean preserveTopology)
                    throws de.unihalle.informatik.Alida.exceptions.ALDOperatorException
Constructor.

Parameters:
enery - Energy
ls - initialed level set function of type membership, i.e. LevelsetMembership
maxIter - maximal number of iterations
spacingIntermediate - spacing of intermediate of level set function returned; 0 = none
invalidImg - optional image of invalid pixels (pixels <> 0 are invalid)
preserveTopology -
verbose - output if requested
debug - bit mask for debugging output
Throws:
de.unihalle.informatik.Alida.exceptions.ALDOperatorException
Method Detail

get8NeighborsPhase

private void get8NeighborsPhase(int x,
                                int y,
                                byte[] nb)
Compute phases of 8 neighbors of (x,y) and store these in the array nb. This array is reused for efficiency.

Parameters:
x - x coordinate
y - y coordinate
nb - array in which to store the phases.

getDebug

public java.lang.Integer getDebug()
Get value of debug. Explanation: Additional dubugging informaton.

Returns:
value of debug

getEnergy

public MTBGenericEnergyNonPDE getEnergy()
Get value of energy. Explanation: Energy to use for optimization.

Returns:
value of energy

getIntermediateLS

public java.util.Vector<MTBImageByte> getIntermediateLS()
Get value of intermediateLS. Explanation: Additional dubugging informaton.

Returns:
value of intermediateLS

getInvalidImage

public MTBImage getInvalidImage()
Get value of invalidImage. Explanation: optional image of invalid pixels (pixels <> 0 are invalid).

Returns:
value of invalidImage

getMaxIterations

public java.lang.Integer getMaxIterations()
Get value of maxIterations. Explanation: Maximal number of iterations.

Returns:
value of maxIterations

getNumIterations

public java.lang.Integer getNumIterations()
Get value of numIterations Explanation: Number of iterations performed

Returns:
value of numIterations

getPhi

public MTBLevelsetMembership getPhi()
Get value of phi. Explanation: Initial levelset function.

Returns:
value of phi

getPotentialNewPhases2D

private java.util.Vector<java.lang.Byte> getPotentialNewPhases2D(boolean preserveTopology,
                                                                 int x,
                                                                 int y)

getPreserveTopology

public java.lang.Boolean getPreserveTopology()
Get value of preserveTopology. Explanation: Topology preserving mode?.

Returns:
value of preserveTopology

getResultImage

public MTBImageByte getResultImage()
Get value of resultImage. Explanation: Result image.

Returns:
value of resultImage

getSpacingIntermediate

public java.lang.Integer getSpacingIntermediate()
Get value of spacingIntermediate. Explanation: spacing of intermediate of levelset function returned; 0 = none?.

Returns:
value of spacingIntermediate

hasForeign4Neighbor

private boolean hasForeign4Neighbor(byte phase,
                                    byte[] nbPhases)
Check whether there is a different/foreign phase (then phase) in the 4-neighborhood as represented in the 8 neighborhood nbPhases.

Parameters:
nbPhases -
Returns:

numBlockChange

private int numBlockChange(byte[] nbPhases,
                           int r)
Return number of connected components of different/foreign phase then r in the 8 neighborhood nbPhases, which are 4 connected to the current pixel. Invalid pixels are not considered as another phase This is identical to the topological number T_4(\vec x,fg) n in

Han, X. and Xu, C. and Prince, J.L., A topology preserving level set method for geometric deformable models}, PAMI, pages 755-768, 2003

Parameters:
nbPhases - Phases in the 8 neighborhood of current pixel with pahse r
r - Phase of current pixel
Returns:
Number of components

operate

protected void operate()
                throws de.unihalle.informatik.Alida.exceptions.ALDOperatorException
This function does the actual work, i.e. optimization of the energy. NOTE: Currently only 2D level set functions are supported NOTE: if debug & FLAG_SOLVER, then for debugging purposes the complete energy is computed in each iteration, which is expensive

Specified by:
operate in class de.unihalle.informatik.Alida.operator.ALDOperator
Throws:
de.unihalle.informatik.Alida.exceptions.ALDOperatorException

printNbPhases

private void printNbPhases(byte[] nbPhases)

setDebug

public void setDebug(java.lang.Integer value)
Set value of debug. Explanation: Additional dubugging informaton.

Parameters:
value - New value of debug

setMaxIterations

public void setMaxIterations(java.lang.Integer value)
Set value of maxIterations. Explanation: Maximal number of iterations.

Parameters:
value - New value of maxIterations

setPreserveTopology

public void setPreserveTopology(java.lang.Boolean value)
Set value of preserveTopology. Explanation: Topology preserving mode?.

Parameters:
value - New value of preserveTopology

setSpacingIntermediate

public void setSpacingIntermediate(java.lang.Integer value)
Set value of spacingIntermediate. Explanation: spacing of intermediate of levelset function returned; 0 = none?.

Parameters:
value - New value of spacingIntermediate

solve

private boolean solve()
               throws de.unihalle.informatik.Alida.exceptions.ALDOperatorException
Throws:
de.unihalle.informatik.Alida.exceptions.ALDOperatorException