001 package util.wavelet;
002 import java.util.List;
003
004 /** A relationship between two {@link Structure} instances in adjacent scales.
005 * It is a specific procedure and condition which defines a one-way relationship between a
006 * child {@link Structure} at wavelet scale j
007 * and an adjacent parent {@link Structure} at the next higher wavelet scale j+1.
008 * The default relationship is to consider the child to be connected to the parent
009 * if the maximum wavelet coefficient of the child intersects the parent.
010 *
011 * @author John Talbot
012 */
013 public class InterscaleRelationship {
014
015 /** Child structure at scale j */
016 Structure child;
017
018 /** Parent structure at scale j+1 which satisfies the interscale relationship
019 * with child structure at scale j. */
020 Structure parent;
021
022 /** True if child structure is local maximum. */
023 public boolean childLocalMaximum;
024
025 /**
026 * Construct the relationship between a parent structure and a child structure.
027 * Pre-condition: isRelated(child, parent) must be true.
028 *
029 * @param child structure at scale j
030 * @param parent structure at scale j+1
031 */
032 public InterscaleRelationship(Structure child, Structure parent) {
033 this.child = child;
034 this.parent = parent;
035
036 child.setParent(parent);
037 parent.addChild(child);
038
039 Structure overlap = child.getOverlap(parent);
040 this.childLocalMaximum = (overlap != null && child.getMaximumValue() > overlap.getMaximumValue());
041 }
042
043 /**
044 * Is child structure at scale number j related to the parent structure in scale number j+1.
045 * False if parent scale number isn't j+1.
046 *
047 * @param child structure at scale j
048 * @param parent structure at scale j+1
049 * @return true if child structure is related to parent structure
050 */
051 public static boolean isRelated(Structure child, Structure parent) {
052 return parent.contains(child.getPositionOfMaximum()) && (parent.getScaleNumber() - child.getScaleNumber()) == 1;
053 }
054
055 /**
056 * Is maximum wavelet coefficient in child structure greater than the maximum wavelet coefficient in the
057 * overlap with parent structure.
058 *
059 * @return true if child structure at scale j is the local maximum relative to the parent structure at scale j+1.
060 */
061 public boolean isChildLocalMaximum() {
062 return childLocalMaximum;
063 }
064
065 /**
066 * Get child structure at scale j which satisfies the interscale relationship
067 * with parent structure at scale j+1.
068 *
069 * @return the child structure
070 */
071 public Structure getChild() {
072 return child;
073 }
074
075 /**
076 * Get parent structure at scale j+1 which satisfies the interscale relationship
077 * with child structure at scale j.
078 *
079 * @return the parent structure
080 */
081 public Structure getParent() {
082 return parent;
083 }
084
085 }