Extract edges using Deriche, Shen, or Canny filters.
edges__ detects step edges using recursively implemented filters (according to Deriche and Shen) or the conventionally implemented ``derivative of Gaussian'' filter (using filter masks) proposed by Canny. Thus, the following edge operators are available:
'deriche1', 'mderiche1', 'deriche1_int4', 'deriche2', 'mderiche2', 'mderiche2_int4', 'shen', 'mshen', and 'canny'
(parameter Filter).
The edge amplitudes (gradient magnitude) and directions are returned in ImaAmp and ImaDir, respectively. The edge operator 'mderiche2' is also available for int4-images, and returns the signed filter response instead of its absolute value. This behavior can be obtained for byte-images as well by selecting 'mderiche2_int4' as filter. This can be used to calculate the second derivative of an image by applying edges__ (with parameter 'mderiche2') to the signed first derivative. Edge directions are stored in 2-degree steps, i.e., an edge direction of x degrees with respect to the horizontal axis is stored as x / 2 in the edge direction image. Furthermore, the direction of the change of intensity is taken into account. Let [Ex,Ey] denote the image gradient. Then the following edge directions are returned as r/2:
intensity increase Ex / Ey edge direction r from bottom to top 0 / + 0 from lower right to upper left + / - ]0,90[ from right to left + / 0 90 from upper right to lower left + / + ]90,180[ from top to bottom 0 / + 180 from upper left to lower right - / + ]180,270[ from left to right + / 0 270 from lower left to upper right - / - ]270,360[.Points with edge amplitude 0 are assigned the edge direction 255 (undefined direction).
The ``filter width'' (i.e., the amount of smoothing) can be chosen arbitrarily, and can be estimated by calling info_edges for concrete values of the parameter Alpha. It decreases for increasing Alpha for the Deriche and Shen filters and increases for the Canny filter, where it is the standard deviation of the Gaussian on which the Canny operator is based. ``Wide'' filters exhibit a larger invariance to noise, but also a decreased ability to detect small details. Non-recursive filters, such as the Canny filter, are realized using filter masks, and thus the execution time increases for increasing filter width. In contrast, the execution time for recursive filters does not depend on the filter width. Thus, arbitrary filter widths are possible using the Deriche and Shen filters without increasing the run time of the operator. The resulting advantage in speed compared to the Canny operator naturally increases for larger filter widths. As border treatment, the recursive operators assume that the images to be zero outside of the image, while the Canny operator repeats the gray value at the image's border. Comparable filter widths can be obtained by the following choices of Alpha:
Alpha('mderiche1') = Alpha('deriche1') / 2, Alpha('deriche2') = Alpha('deriche1') / 2, Alpha('mderiche2') = Alpha('deriche1') / 2, Alpha('shen') = Alpha('deriche1') / 2, Alpha('mshen') = Alpha('deriche1') / 2, Alpha('gauss') = 1.77 / Alpha('deriche1').The originally proposed recursive filters ('deriche1', 'deriche2', 'shen') return a biased estimate of the amplitude of diagonal edges. This bias is removed in the corresponding modified version of the operators ('mderiche1', 'mderiche2' und 'mshen'), while maintaining the same execution speed.
For relatively small filter widths (11 x 11), i.e., for Alpha('mderiche2'=0.5), all filters yield similar results. Only for ``wider'' filters differences begin to appear: the Shen filters begin to yield qualitatively inferior results. However, they are the fastest of the implemented operators --- closely followed by the Deriche operators.
edges__ optionally offers to apply a non-maximum-suppression (NMS = 'nms'/'inms'/'hvnms'; 'none' if not desired) and hysteresis threshold operation (Low,High; at least one negative if not desired) to the resulting edge image. Conceptually, this corresponds to the following calls:
nonmax_suppression_dir(...,NMS,...) und hysteresis_threshold__(...,Low,High,999,...).However, this calling sequence would return appropriately modified regions, whereas edges__ marks suppressed edge points by 0 in the amplitude and 255 in the direction image, while leaving the region of the image unchanged.
Image (input_object) |
image(-array) -> object : byte / int4 |
Input image. |
ImaAmp (output_object) |
image(-array) -> object : byte / int4 |
Edge amplitude (gradient magnitude) image. |
ImaDir (output_object) |
image(-array) -> object : direction |
Edge direction image. |
Filter (input_control) |
string -> string |
Edge operator to be applied. | |
Default value: 'mderiche2' | |
List of values: 'deriche1', 'mderiche1', 'deriche1_int4', 'deriche2', 'mderiche2', 'mderiche2_int4', 'shen', 'mshen', 'canny' |
Alpha (input_control) |
real -> real |
Filter parameter: small values result in strong smoothing, and thus less detail (opposite for 'canny'). | |
Default value: 0.5 | |
Suggested values: 0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 0.9, 1.1 | |
Range of values: 0.2 <= Alpha <= 50.0 | |
Minimum increment: 0.01 | |
Recommended increment: 0.1 | |
Restriction: Alpha > 0.0 |
NMS (input_control) |
string -> string |
Non-maximum suppression ('none', if not desired). | |
Default value: 'nms' | |
List of values: 'nms', 'inms', 'hvnms', 'none' |
Low (input_control) |
integer -> integer |
Lower threshold for the hysteresis threshold operation (negative, if no thresholding is desired). | |
Default value: 20 | |
Suggested values: 5, 10, 15, 20, 25, 30, 40 | |
Range of values: 1 <= Low <= 255 | |
Minimum increment: 1 | |
Recommended increment: 5 | |
Restriction: (Low > 1) || (Low < 0) |
High (input_control) |
integer -> integer |
Upper threshold for the hysteresis threshold operation (negative, if no thresholding is desired). | |
Default value: 40 | |
Suggested values: 10, 15, 20, 25, 30, 40, 50, 60, 70 | |
Range of values: 1 <= High <= 255 | |
Minimum increment: 1 | |
Recommended increment: 5 | |
Restriction: ((High > 1) || (High < 0)) && (High >= Low) |
read_image(:Image:'fabrik':) > edges__(Image:Amp,Dir:'mderiche2',0.5,'none',-1,-1:) > hysteresis_threshold__(Amp:Margin:20,30,30:).
edges__ returns TRUE if all parameters are correct and no error occurs during execution. If the input is empty the behaviour can be set via set_system(::'no_object_result',<Result>:). If necessary, an exception is raised.
threshold__, hysteresis_threshold__, close_edges2
sobel_dir, frei_dir, kirsch_dir, prewitt_dir, robinson_dir
info_edges, nonmax_suppression_amp, hysteresis_threshold__, bandpass__
S.Lanser, W.Eckstein: ``Eine Modifikation des Deriche-Verfahrens zur Kantendetektion''; 13. DAGM-Symposium, Munchen; Informatik Fachberichte 290; Seite 151 - 158; Springer-Verlag; 1991.
S.Lanser: ``Detektion von Stufenkanten mittels rekursiver Filter nach Deriche''; Diplomarbeit; Technische Universitat Munchen, Institut fur Informatik, Lehrstuhl Prof. Radig; 1991.
J.Canny: ``Finding Edges and Lines in Images''; Report, AI-TR-720; M.I.T. Artificial Intelligence Lab., Cambridge; 1983.
J.Canny: ``A Computational Approach to Edge Detection''; IEEE Transactions on Pattern Analysis and Machine Intelligence; PAMI-8, vol. 6; S. 679-698; 1986.
R.Deriche: ``Using Canny's Criteria to Derive a Recursively Implemented Optimal Edge Detector''; International Journal of Computer Vision; vol. 1, no. 2; S. 167-187; 1987.
R.Deriche: ``Optimal Edge Detection Using Recursive Filtering''; Proc. of the First International Conference on Computer Vision, London; S. 501-505; 1987.
R.Deriche: ``Fast Algorithms for Low-Level Vision''; IEEE Transactions on Pattern Analysis and Machine Intelligence; PAMI-12, no. 1; S. 78-87; 1990.
S.Castan, J.Zhao und J.Shen: ``Optimal Filter for Edge Detection Methods and Results''; Proc. of the First European Conference on Computer Vision, Antibes; Lecture Notes on computer Science; no. 427; S. 12-17; Springer-Verlag; 1990.