Class AlgorithmEdgeNMSuppression
- java.lang.Object
-
- java.lang.Thread
-
- gov.nih.mipav.model.algorithms.AlgorithmBase
-
- gov.nih.mipav.model.algorithms.AlgorithmEdgeNMSuppression
-
- All Implemented Interfaces:
AlgorithmInterface
,java.awt.event.ActionListener
,java.awt.event.WindowListener
,java.lang.Runnable
,java.util.EventListener
public class AlgorithmEdgeNMSuppression extends AlgorithmBase implements AlgorithmInterface
Calculates the non-maximum suppression of an image at a scale defined by the user. This algorithm produces an edge map of the zero crossings of the non-maximum suppression for 2D images and 2.5D images. Edges are defined as the union of points for which the gradient magnitude assumes a maximum in the gradient direction. Introuduce a local orthonormal coordinate system (u,v) at any point P0, where the v-axis is parallel to the gradient direction at P0, and the u-axis is perpindicular. Iu = sin(a)*Ix - cos(a)*Iy Iv = cos(a)*Ix + sin(a)*Iy cos(a) = Ix/(sqrt(Ix*Ix + Iy*Iy)) evaluated at P0 sin(a) = Iy/(sqrt(Ix*Ix + Iy*Iy)) evaluated at P0 Iu = (Ix*Iy - Ix*Iy)/(sqrt(Ix*Ix + Iy*Iy)) = 0 Iv = (Ix*Ix + Iy*Iy)/(sqrt(Ix*Ix + Iy*Iy)) = sqrt(Ix*Ix + Iy*Iy) Iv*Iv = Ix*Ix + Iy*Iy Ivv = (cos(a)*Ix + sin(a)*Iy)(cos(a)*Ix + sin(a)*Iy) = cos(a)*cos(a)*Ixx + 2*cos(a)*sin(a)*Ixy + sin(a)*sin(a)*Iyy = (Ix*Ix*Ixx + 2*Ix*Iy*Ixy + Iy*Iy*Iyy)/(Ix*Ix + Iy*Iy) Iv*Iv*Ivv = Ix*Ix*Ixx + 2*Ix*Iy*Ixy + Iy*Iy*Iyy Ivvv = (cos(a)*cos(a)*Ixx + 2*cos(a)*sin(a)*Ixy + sin(a)*sin(a)*Iyy)(cos(a)*Ix + sin(a)*Iy) = cos(a)*cos(a)*cos(a)*Ixxx + 3*cos(a)*cos(a)*sin(a)*Ixxy + 3*cos(a)*sin(a)*sin(a)*Ixyy + sin(a)*sin(a)*sin(a)*Iyyy = (Ix*Ix*Ix*Ixxx + 3*Ix*Ix*Iy*Ixxy + 3*Ix*Iy*Iy*Ixyy + Iy*Iy*Iy*Iyyy)/((Ix*Ix + Iy*Iy)**3/2) Iv*Iv*Iv*Ivvv = Ix*Ix*Ix*Ixxx + 3*Ix*Ix*Iy*Ixxy + 3*Ix*Iy*Iy*Ixyy + Iy*Iy*Iy*Iyyy Assuming that the second and third-order directional derivatives of I in the v-direction are not simultaneously zero, a necessary and sufficient condition for P0 to be a gradient maximum in the gradient direction may be stated as: Ivv = 0, Ivvv < 0. Since only the sign information is important, this condition can be restated as: Iv*Iv*Ivv = 0, Iv*Iv*Iv*Ivvv < 0. Reference: Geometry-Driven Diffusion in Computer Vision, Bart M. ter Haar Romeny(Ed.), Chapter2:Linear Scale-Space II: Early Visual Operations by Tony Lindeberg and Bart M. ter Haar Romeny, Kluwer Academic Publishers, 1994, page 45.For 3D a similar derivation: Iv = cos(a)*sin(b)*Ix + sin(a)*sin(b)*Iy + cos(b)*Iz where spherical coordinates are being used cos(a) = Ix/(sqrt(Ix*Ix + Iy*Iy)) evaluated at P0 sin(a) = Iy/(sqrt(Ix*Ix + Iy*Iy)) evaluated at P0 cos(b) = Iz/(sqrt(Ix*Ix + Iy*Iy + Iz*Iz)) evaluated at P0 sin(b) = sqrt(Ix*Ix + Iy*Iy)/(sqrt(Ix*Ix + Iy*Iy + Iz*Iz)) evaluated at P0 Iv = (Ix*Ix + Iy*Iy + Iz*Iz)/(sqrt(Ix*Ix + Iy*Iy + Iz*Iz)) = sqrt(Ix*Ix + Iy*Iy + Iz*Iz) Iv*Iv = Ix*Ix + Iy*Iy + Iz*Iz Ivv = (cos(a)*sin(b)*Ix + sin(a)*sin(b)*Iy + cos(b)*Iz)(cos(a)*sin(b)*Ix + sin(a)*sin(b)*Iy + cos(b)*Iz) = cos(a)*cos(a)*sin(b)*sin(b)*Ixx + 2*cos(a)*sin(a)*sin(b)*sin(b)*Ixy + 2*cos(a)*cos(b)*sin(b)*Ixz + sin(a)*sin(a)*sin(b)*sin(b)*Iyy + 2*sin(a)*cos(b)*sin(b)*Iyz + cos(b)*cos(b)*Izz = (Ix*Ix*Ixx + 2*Ix*Iy*Ixy + 2*Ix*Iz*Ixz + Iy*Iy*Iyy + 2*Iy*Iz*Iyz + Iz*Iz*Izz)/ (Ix*Ix + Iy*Iy + Iz*Iz) Iv*Iv*Ivv = Ix*Ix*Ixx + 2*Ix*Iy*Ixy + 2*Ix*Iz*Ixz + Iy*Iy*Iyy + 2*Iy*Iz*Iyz + Iz*Iz*Izz Ivvv = (cos(a)*cos(a)*sin(b)*sin(b)*Ixx + 2*cos(a)*sin(a)*sin(b)*sin(b)*Ixy + 2*cos(a)*cos(b)*sin(b)*Ixz + sin(a)*sin(a)*sin(b)*sin(b)*Iyy + 2*sin(a)*cos(b)*sin(b)*Iyz + cos(b)*cos(b)*Izz)(cos(a)*sin(b)*Ix + sin(a)*sin(b)*Iy + cos(b)*Iz) = cos(a)*cos(a)*cos(a)*sin(b)*sin(b)*sin(b)*Ixxx + 3*cos(a)*cos(a)*sin(a)*sin(b)*sin(b)*sin(b)*Ixxy + 3*cos(a)*cos(a)*cos(b)*sin(b)*sin(b)*Ixxz + 3*cos(a)*sin(a)*sin(a)*sin(b)*sin(b)*sin(b)*Ixyy + 6*cos(a)*sin(a)*cos(b)*sin(b)*sin(b)*Ixyz + 3*cos(a)*cos(b)*cos(b)*sin(b)*Ixzz + sin(a)*sin(a)*sin(a)*sin(b)*sin(b)*sin(b)*Iyyy + 3*sin(a)*sin(a)*cos(b)*sin(b)*sin(b)*Iyyz + 3*sin(a)*cos(b)*cos(b)*sin(b)*Iyzz + cos(b)*cos(b)*cos(b)*Izzz = (Ix*Ix*Ix*Ixxx + 3*Ix*Ix*Iy*Ixxy + 3*Ix*Ix*Iz*Ixxz + 3*Ix*Iy*Iy*Ixyy + 6*Ix*Iy*Iz*Ixyz + 3*Ix*Iz*Iz*Ixzz + Iy*Iy*Iy*Iyyy + 3*Iy*Iy*Iz*Iyyz + 3*Iy*Iz*Iz*Iyzz + Iz*Iz*Iz*Izzz)/ ((Ix*Ix + Iy*Iy + Iz*Iz)**1.5) Iv*Iv*Iv*Ivvv = Ix*Ix*Ix*Ixxx + 3*Ix*Ix*Iy*Ixxy + 3*Ix*Ix*Iz*Ixxz + 3*Ix*Iy*Iy*Ixyy + 6*Ix*Iy*Iz*Ixyz + 3*Ix*Iz*Iz*Ixzz + Iy*Iy*Iy*Iyyy + 3*Iy*Iy*Iz*Iyyz + 3*Iy*Iz*Iz*Iyzz + Iz*Iz*Iz*Izzz
-
-
Field Summary
Fields Modifier and Type Field Description private boolean
entireImage
DOCUMENT ME!private float[]
GxData
DOCUMENT ME!private float[]
GxxData
DOCUMENT ME!private float[]
GxxxData
DOCUMENT ME!private float[]
GxxyData
DOCUMENT ME!private float[]
GxxzData
DOCUMENT ME!private float[]
GxyData
DOCUMENT ME!private float[]
GxyyData
DOCUMENT ME!private float[]
GxyzData
DOCUMENT ME!private float[]
GxzData
DOCUMENT ME!private float[]
GxzzData
DOCUMENT ME!private float[]
GyData
DOCUMENT ME!private float[]
GyyData
DOCUMENT ME!private float[]
GyyyData
DOCUMENT ME!private float[]
GyyzData
DOCUMENT ME!private float[]
GyzData
DOCUMENT ME!private float[]
GyzzData
DOCUMENT ME!private float[]
GzData
DOCUMENT ME!private float[]
GzzData
DOCUMENT ME!private float[]
GzzzData
DOCUMENT ME!private int[]
kExtents
DOCUMENT ME!static int
MARCHING_SQUARES
Perform zero crossing detection using the marching squares method.static int
OLD_DETECTION
Perform zero crossing detection using Matt's old method.private float[]
outputBuffer
private float[]
sigmas
DOCUMENT ME!private int
zeroDetectionType
The type of zero crossing detection to use.private ModelImage
zXMask
DOCUMENT ME!-
Fields inherited from class gov.nih.mipav.model.algorithms.AlgorithmBase
destFlag, destImage, image25D, mask, maxProgressValue, minProgressValue, multiThreadingEnabled, nthreads, progress, progressModulus, progressStep, runningInSeparateThread, separable, srcImage, threadStopped
-
-
Constructor Summary
Constructors Constructor Description AlgorithmEdgeNMSuppression(ModelImage destImg, ModelImage srcImg, float[] sigmas, boolean maskFlag, boolean img25D)
Creates a new AlgorithmEdgeNMSuppression object.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
algorithmPerformed(AlgorithmBase algorithm)
Called after an algorithm this listener is registered to exits (maybe successfully, maybe not).private void
calcStoreInDest2D(int nImages, int detectionType)
This function produces the EdgeNMSup of input image.private void
calcStoreInDest3D(int detectionType)
This function produces the Non-maximum suppression of input image.void
finalize()
Prepares this class for destruction.static java.util.BitSet
genLevelMask(int xDim, int yDim, float[] buffer, float level, int detectionType)
Generates a zero crossing mask for a 2D function sets a Bitset object to 1 is a zero crossing is detected.void
genZeroXMask(int slice, float[] buffer, float[] buffer2, int detectionType)
Generates a zero crossing mask for a 2D function sets a ModelImage to 255 if a zero crossing is detected.ModelImage
getZeroXMask()
Accessor to return mask indicating zero crossings.private void
makeKernels2D()
Creates Gaussian derivative kernels.private void
makeKernels3D()
Creates Gaussian derivative kernels.void
runAlgorithm()
Starts the program.-
Methods inherited from class gov.nih.mipav.model.algorithms.AlgorithmBase
actionPerformed, addListener, addProgressChangeListener, calculateImageSize, calculatePrincipleAxis, computeElapsedTime, computeElapsedTime, convertIntoFloat, delinkProgressToAlgorithm, delinkProgressToAlgorithmMulti, displayError, errorCleanUp, fireProgressStateChanged, fireProgressStateChanged, fireProgressStateChanged, fireProgressStateChanged, fireProgressStateChanged, generateProgressValues, getDestImage, getElapsedTime, getMask, getMaxProgressValue, getMinProgressValue, getNumberOfThreads, getProgress, getProgressChangeListener, getProgressChangeListeners, getProgressModulus, getProgressStep, getProgressValues, getSrcImage, isCompleted, isImage25D, isMultiThreadingEnabled, isRunningInSeparateThread, isThreadStopped, linkProgressToAlgorithm, linkProgressToAlgorithm, makeProgress, notifyListeners, removeListener, removeProgressChangeListener, run, setCompleted, setImage25D, setMask, setMaxProgressValue, setMinProgressValue, setMultiThreadingEnabled, setNumberOfThreads, setProgress, setProgressModulus, setProgressStep, setProgressValues, setProgressValues, setRunningInSeparateThread, setSrcImage, setStartTime, setThreadStopped, startMethod, windowActivated, windowClosed, windowClosing, windowDeactivated, windowDeiconified, windowIconified, windowOpened
-
Methods inherited from class java.lang.Thread
activeCount, checkAccess, clone, countStackFrames, currentThread, dumpStack, enumerate, getAllStackTraces, getContextClassLoader, getDefaultUncaughtExceptionHandler, getId, getName, getPriority, getStackTrace, getState, getThreadGroup, getUncaughtExceptionHandler, holdsLock, interrupt, interrupted, isAlive, isDaemon, isInterrupted, join, join, join, onSpinWait, resume, setContextClassLoader, setDaemon, setDefaultUncaughtExceptionHandler, setName, setPriority, setUncaughtExceptionHandler, sleep, sleep, start, stop, suspend, toString, yield
-
-
-
-
Field Detail
-
MARCHING_SQUARES
public static final int MARCHING_SQUARES
Perform zero crossing detection using the marching squares method.- See Also:
- Constant Field Values
-
OLD_DETECTION
public static final int OLD_DETECTION
Perform zero crossing detection using Matt's old method.- See Also:
- Constant Field Values
-
entireImage
private boolean entireImage
DOCUMENT ME!
-
GxData
private float[] GxData
DOCUMENT ME!
-
GxxData
private float[] GxxData
DOCUMENT ME!
-
GxxxData
private float[] GxxxData
DOCUMENT ME!
-
GxxyData
private float[] GxxyData
DOCUMENT ME!
-
GxxzData
private float[] GxxzData
DOCUMENT ME!
-
GxyData
private float[] GxyData
DOCUMENT ME!
-
GxyyData
private float[] GxyyData
DOCUMENT ME!
-
GxyzData
private float[] GxyzData
DOCUMENT ME!
-
GxzData
private float[] GxzData
DOCUMENT ME!
-
GxzzData
private float[] GxzzData
DOCUMENT ME!
-
GyData
private float[] GyData
DOCUMENT ME!
-
GyyData
private float[] GyyData
DOCUMENT ME!
-
GyyyData
private float[] GyyyData
DOCUMENT ME!
-
GyyzData
private float[] GyyzData
DOCUMENT ME!
-
GyzData
private float[] GyzData
DOCUMENT ME!
-
GyzzData
private float[] GyzzData
DOCUMENT ME!
-
GzData
private float[] GzData
DOCUMENT ME!
-
GzzData
private float[] GzzData
DOCUMENT ME!
-
GzzzData
private float[] GzzzData
DOCUMENT ME!
-
kExtents
private int[] kExtents
DOCUMENT ME!
-
sigmas
private float[] sigmas
DOCUMENT ME!
-
zeroDetectionType
private int zeroDetectionType
The type of zero crossing detection to use.
-
zXMask
private ModelImage zXMask
DOCUMENT ME!
-
outputBuffer
private float[] outputBuffer
-
-
Constructor Detail
-
AlgorithmEdgeNMSuppression
public AlgorithmEdgeNMSuppression(ModelImage destImg, ModelImage srcImg, float[] sigmas, boolean maskFlag, boolean img25D)
Creates a new AlgorithmEdgeNMSuppression object.- Parameters:
destImg
- image model where result image is to storedsrcImg
- source image modelsigmas
- Gaussian's standard deviations in the each dimensionmaskFlag
- Flag that indicates that the EdgeNMSup will be calculated for the whole image if equal to trueimg25D
- Flag, if true, indicates that each slice of the 3D volume should be processed independently. 2D images disregard this flag.
-
-
Method Detail
-
genLevelMask
public static java.util.BitSet genLevelMask(int xDim, int yDim, float[] buffer, float level, int detectionType)
Generates a zero crossing mask for a 2D function sets a Bitset object to 1 is a zero crossing is detected.- Parameters:
xDim
- the buffer's x dimensionyDim
- the buffer's y dimensionbuffer
- array in which to find zero crossinglevel
- the level to find the crossing of (usually will be 0)detectionType
- the type of zero crossing method to use- Returns:
- DOCUMENT ME!
-
finalize
public void finalize()
Prepares this class for destruction.- Overrides:
finalize
in classAlgorithmBase
-
genZeroXMask
public void genZeroXMask(int slice, float[] buffer, float[] buffer2, int detectionType)
Generates a zero crossing mask for a 2D function sets a ModelImage to 255 if a zero crossing is detected.- Parameters:
slice
- DOCUMENT ME!buffer
- array in which to find zero crossingbuffer2
- array which ensures that zero crossing is only counted if buffer2 value at that position is less than zerodetectionType
- the type of zero crossing detection to perform
-
getZeroXMask
public ModelImage getZeroXMask()
Accessor to return mask indicating zero crossings.- Returns:
- ModelImage of zero crossings (2D function); 255 = indicates zero crossing
-
runAlgorithm
public void runAlgorithm()
Starts the program.- Specified by:
runAlgorithm
in classAlgorithmBase
-
calcStoreInDest2D
private void calcStoreInDest2D(int nImages, int detectionType)
This function produces the EdgeNMSup of input image.- Parameters:
nImages
- number of images to be blurred. If 2D image then nImage = 1, if 3D image where each image is to processed independently then nImages equals the number of images in the volume.detectionType
- the type of zero crossing detection to perform
-
calcStoreInDest3D
private void calcStoreInDest3D(int detectionType)
This function produces the Non-maximum suppression of input image.- Parameters:
detectionType
- the type of zero crossing detection to perform
-
makeKernels2D
private void makeKernels2D()
Creates Gaussian derivative kernels.
-
makeKernels3D
private void makeKernels3D()
Creates Gaussian derivative kernels.
-
algorithmPerformed
public void algorithmPerformed(AlgorithmBase algorithm)
Description copied from interface:AlgorithmInterface
Called after an algorithm this listener is registered to exits (maybe successfully, maybe not). If the algorithm is run in a separate thread, this call will be made within that thread. If not, this call will be made from that same, shared thread.- Specified by:
algorithmPerformed
in interfaceAlgorithmInterface
- Parameters:
algorithm
- the algorithm which has just completed
-
-