Seg2Dgel
Class Sg2notch

java.lang.Object
  extended by Seg2Dgel.Sg2glb
      extended by Seg2Dgel.Sg2notch

public class Sg2notch
extends Sg2glb

Class Sg2notch performs a spot boundary notch analysis for the 2D gel segmenter.

This algorithm is based on an algorithm for region splitting based on chain codes used in bone marrow smear image analysis described in: Lemkin, P.: An approach to region splitting. Computer Graphics and Image Processing, 10: 281-288 (1979).

This code was derived and refactored from GELLAB-II sg2gii and libr C language files.

This work was produced by Peter Lemkin of the National Cancer Institute, an agency of the United States Government. As a work of the United States Government there is no associated copyright. It is offered as open source software under the Mozilla Public License (version 1.1) subject to the limitations noted in the accompanying LEGAL file. This notice must be included with the code. The Open2Dprot Mozilla and Legal files are available on http://Open2Dprot.sourceforge.net/.

Version:
$Date: 2005/10/23 12:44:55 $ $Revision: 1.6 $
Author:
P. Lemkin, NCI-Frederick, Frederick, MD, 21702
See Also:
Open2Dprot Home

Field Summary
static int BND_MIN_NOTCH_ALIGN_ANGLE_THR
          align.
static int BND_MIN_NOTCH_ALIGN_RATIO_THR
          align.
static int BND_MIN_NOTCH_ANGLE_DIFF_THR
          Diff angle < value to be notch point.
static int BND_MIN_NOTCH_PEAK_DIST_THR
          min pixel dist between MaxMin peaks
static int BND_MIN_NOTCH_STRENGTH_THR
          min # adj points w/decreasing angle
static int BND_NOTCH_DIST_OFFSET
          Pixels for 180 micron/pixel.
static boolean dbugFlag
          Debugging flag
static int INITIAL_MAXNOTCHES
          Max # of notches
static int maxNotchesAlloc
          initial # of notches size allocation
private static int[] maxPeakXbot
          Peak tables [1:n]
private static int[] maxPeakXleft
          Peak tables [1:n]
private static int[] maxPeakXright
          Peak tables [1:n]
private static int[] maxPeakXtop
          Peak tables [1:n]
private static int[] maxPeakYbot
          Peak tables [1:n]
private static int[] maxPeakYleft
          Peak tables [1:n]
private static int[] maxPeakYright
          Peak tables [1:n]
private static int[] maxPeakYtop
          Peak tables [1:n]
static int minNotchAlignAngleThr
          align.
static int minNotchAlignRatioThr
          align.
static int minNotchAngleDiffThr
          diff angle < value to be notch point.
static int minNotchPeakDistThr
          Notch distance between peaks threshold
static int minNotchStrengthThr
          # points w/adjacent min angle
private static int[] minPeakXbot
          Peak tables [1:n]
private static int[] minPeakXleft
          Peak tables [1:n]
private static int[] minPeakXright
          Peak tables [1:n]
private static int[] minPeakXtop
          Peak tables [1:n]
private static int[] minPeakYbot
          Peak tables [1:n]
private static int[] minPeakYleft
          Peak tables [1:n]
private static int[] minPeakYright
          Peak tables [1:n]
private static int[] minPeakYtop
          Peak tables [1:n]
 int nNotches
          # of notches found
 int nNotchPairs
          # of notch pairs
static int notchDistOffset
          dist.
 int[] notchIndices
          Notch sub-objects - [0:nNotches-1] List of chain code indices for notches detected
 int[] notchPair1X
          Notch 1 X sub-objects - [0:nNotches-1] 1st notch pair member
 int[] notchPair1Y
          Notch 1 Y sub-objects - [0:nNotches-1] 1st notch pair member
 int[] notchPair2X
          Notch 1 X sub-objects - [0:nNotches-1] 2nd notch pair member
 int[] notchPair2Y
          Notch 2 Y sub-objects - [0:nNotches-1] 2nd notch pair member
 
Fields inherited from class Seg2Dgel.Sg2glb
acc, accDatabaseFile, accDatabaseSwitch, accFile, accFormatMode, allowTouchingEdgesSwitch, applicationName, argsV, averageODSwitch, avg, avgPixFile, banner, bannerTitle, baseImageFileName, baseStatusTime, batchDir, bfav, bfavm, bfavm1, bfavp, bfavp1, bfog, bfogm, bfogm1, bfogm2, bfogm3, bfogm4, bfogm5, bfogp, bfogp1, bfogp2, bfogp3, bfogp4, bfogp5, bkg, BKGRD_CODE, bkgrdCorrectionSwitch, bkgrdPixFile, bkgrdSizeFlag, BLACK, boundaryInSSFSwitch, bufbkg, bufcc, bufmag, bufrest, c11, c12, c13, c14, c15, c16, c17, c18, c19, c1a, c1b, c1c, c1d, c1e, c1f, c1g, c1h, c21, c22, c23, c24, c25, c26, c27, c28, c29, c2a, c2b, c2c, c2d, c2e, c2f, c2g, c2h, c31, c32, c33, c34, c35, c36, c37, c38, c39, c3a, c3b, c3c, c3d, c3e, c3f, c3g, c3h, c41, c42, c43, c44, c45, c46, c47, c48, c49, c4a, c4b, c4c, c4d, c4e, c4f, c4g, c4h, c51, c52, c53, c54, c55, c56, c57, c58, c59, c5a, c5b, c5c, c5d, c5e, c5f, c5g, c5h, c61, c62, c63, c64, c65, c66, c67, c68, c69, c6a, c6b, c6c, c6d, c6e, c6f, c6g, c6h, c71, c72, c73, c74, c75, c76, c77, c78, c79, c7a, c7b, c7c, c7d, c7e, c7f, c7g, c7h, c81, c82, c83, c84, c85, c86, c87, c88, c89, c8a, c8b, c8c, c8d, c8e, c8f, c8g, c8h, c91, c92, c93, c94, c95, c96, c97, c98, c99, c9a, c9b, c9c, c9d, c9e, c9f, c9g, c9h, ca1, ca2, ca3, ca4, ca5, ca6, ca7, ca8, ca9, caa, cab, cac, cacheDir, cad, cae, caf, cag, cah, cal, cal2gray, calFile, cb1, cb2, cb3, cb4, cb5, cb6, cb7, cb8, cb9, cba, cbb, cbc, cbd, cbe, cbf, cbg, cbh, cc, cc1, cc2, cc3, cc4, cc5, cc6, cc7, cc8, cc9, cca, ccb, ccc, ccd, cce, ccf, ccg, cch, ccMinSize, ccMinSizeSwitch, ccNum, ccPixFile, cd1, cd2, cd3, cd4, cd5, cd6, cd7, cd8, cd9, cda, cdb, cdc, cdd, cde, cdf, cdg, cdh, computingWindowSwitch, coneOfSilenceMode, CONSOLE_FLAG, ctlCorePixSwitch, cwx1, cwx2, cwy1, cwy2, data, DATE, dbSample, dbSpot, dbug, DBUG_ADD_INTERIOR_CC_PIXELS, DBUG_BND_ANALYSIS, DBUG_CALC_FEATURES, DBUG_CHAIN_CODE_RLM_ANALYSIS, DBUG_CONSOLE, DBUG_CVT_BND_TO_CHAINCODE, DBUG_DRAW_NOTCH_PAIR_LINE, DBUG_DRAW_SAT_SPOT_BND, DBUG_DUMP_CC_PPX, DBUG_FILL_CORNERS, DBUG_FILL_HOLES_IN_PCC_CONCAVITIES, DBUG_FIND_BND_NOTCHES_IN_CHAIN_CODE, DBUG_FIND_SPOT_LIST, DBUG_INNER_LOOP_FIND_SPOT, DBUG_MAX_PROPAGATE, DBUG_NBR_COMPONENTS, DBUG_PIX_DBCODE, DBUG_PRINT_GRAY2CAL_MAP, DBUG_PROP_SAT_SPOTS, DBUG_PROP_SPOT_TO_2ND_MAXIMA, DBUG_PUSH_XY_INTO_FBL, DBUG_RMV_CONCAVITIES, DBUG_RMV_INTERIOR_CC_PIXELS, DBUG_ROUND_CORNERS, DBUG_SPLIT_CHECK_SPOT, DBUG_SPLIT_PIX_BY_FBL_BND_ANALSIS, DBUG_SWITCHES, dbugBits, dbugBitsHelpStr, dbugBitsPixFlag, dbx1, dbx2, dby1, dby2, debugSwitch, defaultSwitch, defaultTypeCode, deleteIsolatedPixelsSwitch, demoFileList, demoSwitch, DFT_2D_GEL, DFT_2D_LC_MS, DFT_NO_DB, didPropSaturatedSpots, didSplitSpotFlag, diffODSwitch, docFileList, dotsSwitch, dpx1, dpx2, dpy1, dpy2, draw, drawBoundaryOverlayType, drawBoundarySwitch, drawDotOverlayType, drawMEROverlayType, drawMERSwitch, drawPlusOverlayType, drawPlusSwitch, drawSxSyEllipseSwitch, drawSxSyOverlayType, drawTitleSwitch, dtdSwitch, ENABLE_DEVELOPER_DEBUGGING, ENABLE_SATURATED_SPOTS, ENABLE_SPOT_SPLITTING, fbl, fileSeparator, fio, fnd, fourSqrtPi, gHist, glbPercentThr, gray2cal, gridSize, hashFBL, HASHFBLPRIME, hashWS, histThreshold, i0R, i10, i11, i12, i13, i14, i15, i16, i17, i18, i2U, i4L, i6D, ini, inPixFile, ISOLATED_PIXEL_CODE, j11, j12, j13, j14, j15, j16, j17, j18, j19, j1a, j1b, j1c, j1d, j1e, j1f, j1g, j1h, j21, j22, j23, j24, j25, j26, j27, j28, j29, j2a, j2b, j2c, j2d, j2e, j2f, j2g, j2h, j31, j32, j33, j34, j35, j36, j37, j38, j39, j3a, j3b, j3c, j3d, j3e, j3f, j3g, j3h, j41, j42, j43, j44, j45, j46, j47, j48, j49, j4a, j4b, j4c, j4d, j4e, j4f, j4g, j4h, j51, j52, j53, j54, j55, j56, j57, j58, j59, j5a, j5b, j5c, j5d, j5e, j5f, j5g, j5h, j61, j62, j63, j64, j65, j66, j67, j68, j69, j6a, j6b, j6c, j6d, j6e, j6f, j6g, j6h, j71, j72, j73, j74, j75, j76, j77, j78, j79, j7a, j7b, j7c, j7d, j7e, j7f, j7g, j7h, j81, j82, j83, j84, j85, j86, j87, j88, j89, j8a, j8b, j8c, j8d, j8e, j8f, j8g, j8h, j91, j92, j93, j94, j95, j96, j97, j98, j99, j9a, j9b, j9c, j9d, j9e, j9f, j9g, j9h, ja1, ja2, ja3, ja4, ja5, ja6, ja7, ja8, ja9, jaa, jab, jac, jad, jae, jaf, jag, jah, jarFileList, jarLibrFileList, jb1, jb2, jb3, jb4, jb5, jb6, jb7, jb8, jb9, jba, jbb, jbc, jbd, jbe, jbf, jbg, jbh, jc1, jc2, jc3, jc4, jc5, jc6, jc7, jc8, jc9, jca, jcb, jcc, jcd, jce, jcf, jcg, jch, jd1, jd2, jd3, jd4, jd5, jd6, jd7, jd8, jd9, jda, jdb, jdc, jdd, jde, jdf, jdg, jdh, keepInputImageSwitch, KILL_SPOT_CODE, killSpotColor, laplacianSwitch, legalImageFileExtens, lineLaplacianHeight, lineLaplacianWidth, lowPassSize, lowpassSwitch, lp13xZZSwitch, lp3x3Switch, lp5x5Switch, lp7x7Switch, mag2ndPixFile, MAX_BUFFERED_SPOTS, MAX_CC_CODE, MAX_INTERIOR_FBL_SIZE, MAX_PCC_CODE, maxColsToPrint, maxGhist, maxGrayPixel, MAXSUBSPOTS, meanGhist, merx1, merx2, merxp1, merxp2, mery1, mery2, meryp1, meryp2, MHISTSIZE, MIN_CC_CODE, MIN_PCC_CODE, MINBLOBAREA, minGhist, MINSPLITSPOTSIZE, nBitsPerPixel, nBkgrdSize, nBytesPerPixel, NEVER, ngh, notch, nPixels, nStatusName, nSwitches, optimizeInteriorFBLSwitch, osName, paramH, PCC_BASE_CODE, pix, pix1, pix2, pix3, pix4, pix5, pix6, pix7, pixDir, pixDumpSwitch, pixelSizeMicrons, pixFileExtn, pixHeight, pixWidth, ppxDir, pra, projDir, projDirSwitch, propertiesFile, propertiesFileSwitch, pTileGhist, PUBLISH, quickEstimateSwitch, rdbmsDir, rest, restOfPixFile, restOfPixSwitch, REVISION, rlmCWfile, rmvDprimeSizingSwitch, sampleSwitch, sat, saturatedSpotSwitch, scaledMaxOD, seg2dgelURL, segPixFile, segPixSwitch, sg2, simpleFileName, sizeFractionGaussianWidth, sort, split, splitLargeCCfblByBndAnalSwitch, splitLargeCCfblByRLManalSwitch, splitLargeCCfblByThreshAnalSwitch, splitMinCCsize, splitSpotSwitch, spotNumber, ssfFormatMode, ssfFormatSwitch, ssfOutputEpilogueFile, ssfOutputFile, ssfOutputPrefaceFile, startTime, statusMemoryFree, statusMemoryTot, statusName, statusStartTime, sw, switchOptCBvalue, switchOptData, switchOptValue, t1Area, t1Density, t1Range, t1SxSyRatio, t2Area, t2Density, t2Range, t2SxSyRatio, TEST_LARGE_IMAGE, thrAreaSwitch, thrDensitySwitch, thrRangeSwitch, thrSxSyRatioSwitch, timerSwitch, tmpDir, UNLABELED_CC_CODE, updateSwitch, usageSwitch, USE_13X13, USE_BKGD_AND_ISOLATED_PIXEL_BACKGROUND, USE_DEMO_DATA, USE_DOM_XML_SSF, use3x3laplacianSwitch, use5x5laplacianSwitch, useBkgdAndIsolatedPixelFlag, useBusseLaplacianSwitch, useCopyOfPix1ForPix5Switch, useHistGUISwitch, useHorizLineLaplacianSwitch, usePopupGUISwitch, userDir, useVertLineLaplacianSwitch, util, VERSION, WHITE, widthWindmp, windmpStepSize, wrk, wXsize, wYsize, xDbug, xmlDir, xPentrance, xPexit, yDbug, yPentrance, yPexit, yTitle
 
Constructor Summary
Sg2notch()
          Sg2notch() - Constructor
 
Method Summary
 void deleteBndAndNotch(DbBoundary bnd)
          deleteBndAndNotch() - delete the boundary data structure data and the notch data, but keep the empty object.
private  void drawLineBetweenNotchPair(int idxNotchPair, DbBoundary drawListBnd)
          drawLineBetweenNotchPair() - split PPX image by drawing a line of 'color' of 1 pixel width between the two points of the notch-pair idxNotchPair.
 int[] findMinMaxPeaksInRLM(int minI, int maxI, int[] rlm, int[] minPeakI, int[] minPeakR, int[] maxPeakI, int[] maxPeakR)
          findMinMaxPeaksInRLM() - find minPeak{IR}[1:nMin] and maxPeak{IR}[1:nMax] in rlm[minI:maxI] data such that peaks are at least tminDist apart.
private  int findNotchesInChainCode(DbBoundary bnd)
          findNotchesInChainCode()- find notches in smoothed chain code.
private  int findPairedNotchesInRLM(DbBoundary bnd)
          findPairedNotchesInRLM() - find notches in RLMs generated by findBoundary().
 void init(int minNotchPeakDistThr, int minNotchAngleDiffThr, int minNotchAlignAngleThr, int minNotchAlignRatioThr, int minNotchStrengthThr, int notchDistOffset, int maxNotchesAlloc)
          init() - init any globals required i.e.
private  int pairChainCodeNotches(DbBoundary bnd)
          pairChainCodeNotches() - return a list of paired notches.
private  int pushXYintoFBLandInterpolateLine(DbBoundary drawBnd, int x1, int y1, int x2, int y2)
          pushXYintoFBLandInterpolateLine() - interpolate two points (x1,y1) to point (x2,y2) into a list of x,y coordinates which are pushed into the boundary.
 void resetNotchDB()
          resetNotchDB() - reset the notch database
static void setDbugFlag(boolean debugFlag)
          setDbugFlag() - set the debug flag
 DbBoundary splitPixByFBLboundaryAnal(boolean useFindRLMnotchPointsFlag)
          splitPixByFBLboundaryAnal() - analyze boundary derived from FBL and split image by drawing lines between well-formed notch pairs.
 
Methods inherited from class Seg2Dgel.Sg2glb
get2D, get2D, getPixLineBuf, getPixLineBuf, initGlb, isDBwindow, isDBwindow, put2Dbuf, resetGlb, set2D, set2D, setPixLineBuf, setPixLineBuf, showReportStatus
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

INITIAL_MAXNOTCHES

public static final int INITIAL_MAXNOTCHES
Max # of notches

See Also:
Constant Field Values

BND_MIN_NOTCH_PEAK_DIST_THR

public static final int BND_MIN_NOTCH_PEAK_DIST_THR
min pixel dist between MaxMin peaks

See Also:
Constant Field Values

BND_MIN_NOTCH_ALIGN_ANGLE_THR

public static final int BND_MIN_NOTCH_ALIGN_ANGLE_THR
align. angle > value to be pair.

See Also:
Constant Field Values

BND_MIN_NOTCH_ALIGN_RATIO_THR

public static final int BND_MIN_NOTCH_ALIGN_RATIO_THR
align. dPerp/dNotch > val to be pair

See Also:
Constant Field Values

BND_MIN_NOTCH_ANGLE_DIFF_THR

public static final int BND_MIN_NOTCH_ANGLE_DIFF_THR
Diff angle < value to be notch point.

See Also:
Constant Field Values

BND_MIN_NOTCH_STRENGTH_THR

public static final int BND_MIN_NOTCH_STRENGTH_THR
min # adj points w/decreasing angle

See Also:
Constant Field Values

BND_NOTCH_DIST_OFFSET

public static final int BND_NOTCH_DIST_OFFSET
Pixels for 180 micron/pixel. Dist. betwn. smoothed cCodes==>notch

See Also:
Constant Field Values

minNotchPeakDistThr

public static int minNotchPeakDistThr
Notch distance between peaks threshold


minNotchAngleDiffThr

public static int minNotchAngleDiffThr
diff angle < value to be notch point.


minNotchAlignAngleThr

public static int minNotchAlignAngleThr
align. angle > value to be pair.


minNotchAlignRatioThr

public static int minNotchAlignRatioThr
align. dPerp/dNotch > val to be pair


notchDistOffset

public static int notchDistOffset
dist. betwn. smoothed cCodes==>notch


minNotchStrengthThr

public static int minNotchStrengthThr
# points w/adjacent min angle


maxNotchesAlloc

public static int maxNotchesAlloc
initial # of notches size allocation


dbugFlag

public static boolean dbugFlag
Debugging flag


minPeakXtop

private static int[] minPeakXtop
Peak tables [1:n]


maxPeakXtop

private static int[] maxPeakXtop
Peak tables [1:n]


minPeakYtop

private static int[] minPeakYtop
Peak tables [1:n]


maxPeakYtop

private static int[] maxPeakYtop
Peak tables [1:n]


minPeakXbot

private static int[] minPeakXbot
Peak tables [1:n]


maxPeakXbot

private static int[] maxPeakXbot
Peak tables [1:n]


minPeakYbot

private static int[] minPeakYbot
Peak tables [1:n]


maxPeakYbot

private static int[] maxPeakYbot
Peak tables [1:n]


minPeakXleft

private static int[] minPeakXleft
Peak tables [1:n]


maxPeakXleft

private static int[] maxPeakXleft
Peak tables [1:n]


minPeakYleft

private static int[] minPeakYleft
Peak tables [1:n]


maxPeakYleft

private static int[] maxPeakYleft
Peak tables [1:n]


minPeakXright

private static int[] minPeakXright
Peak tables [1:n]


maxPeakXright

private static int[] maxPeakXright
Peak tables [1:n]


minPeakYright

private static int[] minPeakYright
Peak tables [1:n]


maxPeakYright

private static int[] maxPeakYright
Peak tables [1:n]


notchIndices

public int[] notchIndices
Notch sub-objects - [0:nNotches-1] List of chain code indices for notches detected


notchPair1X

public int[] notchPair1X
Notch 1 X sub-objects - [0:nNotches-1] 1st notch pair member


notchPair2X

public int[] notchPair2X
Notch 1 X sub-objects - [0:nNotches-1] 2nd notch pair member


notchPair1Y

public int[] notchPair1Y
Notch 1 Y sub-objects - [0:nNotches-1] 1st notch pair member


notchPair2Y

public int[] notchPair2Y
Notch 2 Y sub-objects - [0:nNotches-1] 2nd notch pair member


nNotches

public int nNotches
# of notches found


nNotchPairs

public int nNotchPairs
# of notch pairs

Constructor Detail

Sg2notch

public Sg2notch()
Sg2notch() - Constructor

Method Detail

setDbugFlag

public static void setDbugFlag(boolean debugFlag)
setDbugFlag() - set the debug flag

Parameters:
debugFlag - to set

resetNotchDB

public void resetNotchDB()
resetNotchDB() - reset the notch database


init

public void init(int minNotchPeakDistThr,
                 int minNotchAngleDiffThr,
                 int minNotchAlignAngleThr,
                 int minNotchAlignRatioThr,
                 int minNotchStrengthThr,
                 int notchDistOffset,
                 int maxNotchesAlloc)
init() - init any globals required i.e. Do what you have to do...

Parameters:
minNotchPeakDistThr - - default values if not zero.
minNotchAngleDiffThr -
minNotchAlignAngleThr -
minNotchAlignRatioThr -
minNotchStrengthThr -
notchDistOffset -
maxNotchesAlloc -

findMinMaxPeaksInRLM

public int[] findMinMaxPeaksInRLM(int minI,
                                  int maxI,
                                  int[] rlm,
                                  int[] minPeakI,
                                  int[] minPeakR,
                                  int[] maxPeakI,
                                  int[] maxPeakR)
findMinMaxPeaksInRLM() - find minPeak{IR}[1:nMin] and maxPeak{IR}[1:nMax] in rlm[minI:maxI] data such that peaks are at least tminDist apart.
            TOP boundary

     min1               min2               min3
   /-----\           /--------\          /-------\
  /       \  max1   /          \ max2   /         \
 /         \-------/            \------/          |
 \                                                |
  \        /-------\            /------\         /
   \------/  min1   \----------/ min2   \-------/
     max1              max2                max3

            BOTTOM boundary
NOTE: the current peak finder grabs the LAST one of a run. If there are several with the same value, we should really backup the saved 'I' to 1/2 the run length!
[TODO] May want to do disaster analysis smoothing of the RLM[] data BEFORE finding the peaks.

Parameters:
minI - is start of data
maxI - is end of data
rlm - is rlm[minI:maxI] data to analyze for peaks
minPeakI - is [0:nMin-1] Peaks at minimum values
minPeakR - is [0:nMin-1] Peaks at minimum values
maxPeakI - is [0:nMax-1] Peaks at minimum values
maxPeakR - is [0:nMax-1] Peaks at maximum values
Returns:
int[]= {nMin,nMax) the number of minima and maxima peaks found

findPairedNotchesInRLM

private int findPairedNotchesInRLM(DbBoundary bnd)
findPairedNotchesInRLM() - find notches in RLMs generated by findBoundary(). Put the Notches in static global peak tables. Then find notches by pairing TOP-Max[i] with BOTTOM-Min[j] and LEFT-Max[i] with RIGHT-Min[j].
            TOP boundary

     min1               min2               min3
   /-----\           /--------\          /-------\
  /       \  max1   /          \ max2   /         \
 /         \-------/            \------/          |
 \                                                |
  \        /-------\            /------\         /
   \------/  min1   \----------/ min2   \-------/
     max1              max2                max3

            BOTTOM boundary

Parameters:
bnd - is the boundary to convert
Returns:
nNotches found in the boundary

findNotchesInChainCode

private int findNotchesInChainCode(DbBoundary bnd)
findNotchesInChainCode()- find notches in smoothed chain code. Algorithm: as we traverse the (assumed) smoothed boundary, we compare angle i-1 and angle i+1. [Samples i-1 and i+1 are a distance notchDistOffset back from and ahead of point i.]
        a1 (i-1)   (i+1) a2  a1
              \  A /        ------>  A > 180deg
               \  /                \
  A < 180deg    \/                  \ a2
                (i)
Normally as we go around a boundary the angle is < 45 degrees for a smoothed boundary since the object is CONVEX. However, if it drops below minNotchAngleDiffThr, then call it a notch point and push it.

Parameters:
bnd - is the boundary to analyze
Returns:
the # of notches.

pairChainCodeNotches

private int pairChainCodeNotches(DbBoundary bnd)
pairChainCodeNotches() - return a list of paired notches. For each notch compute its least square distance with the other notches and pick the closest if the
     dPerp/dNotch > minNotchAlignRatioThr
 [TODO] Could add test to check if corresponding notch angles
 align as well.

ARGS IN: bnd(notchIndices[], nNotches) ARGS OUT: bnd(notchPair1XY[], notchPair2XY[], nNotchPairs)

Parameters:
bnd - is the boundary to analyze

drawLineBetweenNotchPair

private void drawLineBetweenNotchPair(int idxNotchPair,
                                      DbBoundary drawListBnd)
drawLineBetweenNotchPair() - split PPX image by drawing a line of 'color' of 1 pixel width between the two points of the notch-pair idxNotchPair. NOTE: if color= 0, and the PPX is the Central Core, it will split the spot if it is resegmented (i.e. if find FBL again).
 ARGS IN:  bnd(notchIndices[],idxNotchPair,notchPair1[],notchPair2[])
           ppx[]
 ARGS OUT: ppx[]

Parameters:
bnd - is the boundary to analyze
idxNotchPair - is the notch pair to split PPX
drawListBnd - is the drawing list boundary of pixels to zap

pushXYintoFBLandInterpolateLine

private int pushXYintoFBLandInterpolateLine(DbBoundary drawBnd,
                                            int x1,
                                            int y1,
                                            int x2,
                                            int y2)
pushXYintoFBLandInterpolateLine() - interpolate two points (x1,y1) to point (x2,y2) into a list of x,y coordinates which are pushed into the boundary. The # points interpolated is returned.
Algorithm taken from Lemkin etal, Comput. in Biomed. Res., 12, 517-544 (1979).

Parameters:
drawBnd - is boundary to draw the line into
x1 - starting X coordinate
y1 - starting Y coordinate
x2 - ending X coordinate
y2 - ending Y coordinate
Returns:
# of points interpoated

splitPixByFBLboundaryAnal

public DbBoundary splitPixByFBLboundaryAnal(boolean useFindRLMnotchPointsFlag)
splitPixByFBLboundaryAnal() - analyze boundary derived from FBL and split image by drawing lines between well-formed notch pairs. We do not actually draw the lines here - merely prepare a DbBoundary which contains the points.

Parameters:
useFindRLMnotchPointsFlag - if true analyze by RLM not boundary this is !justXYCflag ==> all structs
Returns:
the DbBoundary drawListBnd Also, the # of notch-pairs created and used to split the image is in notch.nNotchPairs.

deleteBndAndNotch

public void deleteBndAndNotch(DbBoundary bnd)
deleteBndAndNotch() - delete the boundary data structure data and the notch data, but keep the empty object.