The MORPH_DISTANCE function estimates N-dimensional distance maps, which contain for each foreground pixel the distance to the nearest background pixel, using a given norm. Available norms include non-diagonal neighbors, chessboard, city block, and approximate Euclidean distance.
The distance map is useful for a variety of morphological operations: thinning, erosion and dilation by discs of radius r, and granulometry.
The following code reads a data file in the IDL Demo data directory containing a magnified image of grains of pollen. It then applies a threshold and the morphological distance operator. Thresholding the resulting distance operator with a value of “n” produces the equivalent of eroding the thresholded image with a disc of radius “n”.
;Handle TrueColor displays:
;Read the image
READ_JPEG, path, img
; Create window:
WINDOW, 0, XSIZE=700, YSIZE=540
; Display the original image
XYOUTS, 180, 525, 'Original Image', ALIGNMENT=.5, /DEVICE
TV, img, 20, 280
; Apply the threshold:
thresh = img GE 140B
; Display the thresholded image
XYOUTS, 520, 525, 'Thresholded Image', ALIGNMENT=.5, /DEVICE
TVSCL, thresh, 360, 280
;Create Euclidean distance function
edist = MORPH_DISTANCE(thresh, NEIGHBOR_SAMPLING = 3)
; Display the distance function
XYOUTS, 180, 265, 'Distance Function', ALIGNMENT=.5, /DEVICE
TVSCL, edist, 20, 20
; Display image after erosion with a disc of radius 5:
XYOUTS, 520, 265, 'After erosion with disc of radius 5', $
TVSCL, edist GT 5, 360, 20
The returned variable is an array of the same dimension as the input array.
An input binary array. Zero-valued pixels are considered to be part of the background.
By default, the distance is computed for the foreground (non-zero) features in the Data argument. Set this keyword to compute the distance of the background features instead of the foreground features. If the keyword is set, elements of Result that are on an edge are set to 0.
Set this keyword to indicate how the distance of each neighbor from a given pixel is determined. Valid values include:
- 0 = default. No diagonal neighbors. Each neighbor is assigned a distance of 1.
- 1 = chessboard. Each neighbor is assigned a distance of 1.
- 2 = city block. Each neighbor is assigned a distance corresponding to the number of pixels to be visited when traveling from the current pixel to the neighbor. (The path can only take 90 degree turns; no diagonal paths are allowed.)
- 3 = approximate Euclidean distance. Each neighbor is assigned an approximate Euclidean distance, where the distances along the diagonals and the center row and column are correct, but for speed the off-diagonal elements are approximated by adding together the distances after the square root.
Default Two Dimensional Example
1 X 1
Chessboard Two-Dimensional Example
1 1 1
1 X 1
1 1 1
City Block Two-Dimensional Example:
2 1 2
1 X 1
2 1 2
Approximate Euclidean Distance Two-Dimensional Example
1 X 1
Set this keyword to request that the input array be reused, if possible. If this keyword is set, the input argument is undefined upon return.