/**
   * Specify internal algorithms and behavior.
   *
   * @param blur Initial blur applied to image.
   * @param gradient Computes the image gradient.
   * @param saveTrace Should it save a list of points that compose the objects contour/trace?
   */
  public CannyEdge(BlurFilter<T> blur, ImageGradient<T, D> gradient, boolean saveTrace) {
    this.blur = blur;
    this.gradient = gradient;

    Class<T> imageType = blur.getInputType().getImageClass();

    blurred = GeneralizedImageOps.createSingleBand(imageType, 1, 1);
    derivX = gradient.getDerivativeType().createImage(1, 1);
    derivY = gradient.getDerivativeType().createImage(1, 1);

    if (saveTrace) {
      hysteresisPts = new HysteresisEdgeTracePoints();
    } else {
      hysteresisMark = new HysteresisEdgeTraceMark();
    }
  }