# Morphological filtering

Morphological operators are non-linear filters used in image processing.

[Greyscale morphological dilation] (https://en.wikipedia.org/wiki/Dilation_(morphology)) is the max-sum counterpart of standard sum-product convolution:

output[b, y, x, c] =
max_{dy, dx} input[b,
strides[1] * y + rates[1] * dy,
strides[2] * x + rates[2] * dx,
c] +
filter[dy, dx, c]


The filter is usually called structuring function. Max-pooling is a special case of greyscale morphological dilation when the filter assumes all-zero values (a.k.a. flat structuring function).

[Greyscale morphological erosion] (https://en.wikipedia.org/wiki/Erosion_(morphology)) is the min-sum counterpart of standard sum-product convolution:

output[b, y, x, c] =
min_{dy, dx} input[b,
strides[1] * y - rates[1] * dy,
strides[2] * x - rates[2] * dx,
c] -
filter[dy, dx, c]


Dilation and erosion are dual to each other. The dilation of the input signal f by the structuring signal g is equal to the negation of the erosion of -f by the reflected g, and vice versa.

Striding and padding is carried out in exactly the same way as in standard convolution. Please refer to the Convolution section for details.

### tf.nn.dilation2d(input, filter, strides, rates, padding, name=None)

Computes the grayscale dilation of 4-D input and 3-D filter tensors.

The input tensor has shape [batch, in_height, in_width, depth] and the filter tensor has shape [filter_height, filter_width, depth], i.e., each input channel is processed independently of the others with its own structuring function. The output tensor has shape [batch, out_height, out_width, depth]. The spatial dimensions of the output tensor depend on the padding algorithm. We currently only support the default "NHWC" data_format.

In detail, the grayscale morphological 2-D dilation is the max-sum correlation (for consistency with conv2d, we use unmirrored filters):

output[b, y, x, c] =
max_{dy, dx} input[b,
strides[1] * y + rates[1] * dy,
strides[2] * x + rates[2] * dx,
c] +
filter[dy, dx, c]


Max-pooling is a special case when the filter has size equal to the pooling kernel size and contains all zeros.

Note on duality: The dilation of input by the filter is equal to the negation of the erosion of -input by the reflected filter.

##### Args:
• input: A Tensor. Must be one of the following types: float32, float64, int32, int64, uint8, int16, int8, uint16, half. 4-D with shape [batch, in_height, in_width, depth].
• filter: A Tensor. Must have the same type as input. 3-D with shape [filter_height, filter_width, depth].
• strides: A list of ints that has length >= 4. The stride of the sliding window for each dimension of the input tensor. Must be: [1, stride_height, stride_width, 1].
• rates: A list of ints that has length >= 4. The input stride for atrous morphological dilation. Must be: [1, rate_height, rate_width, 1].
• padding: A string from: "SAME", "VALID". The type of padding algorithm to use.
• name: A name for the operation (optional).
##### Returns:

A Tensor. Has the same type as input. 4-D with shape [batch, out_height, out_width, depth].

### tf.nn.erosion2d(value, kernel, strides, rates, padding, name=None)

Computes the grayscale erosion of 4-D value and 3-D kernel tensors.

The value tensor has shape [batch, in_height, in_width, depth] and the kernel tensor has shape [kernel_height, kernel_width, depth], i.e., each input channel is processed independently of the others with its own structuring function. The output tensor has shape [batch, out_height, out_width, depth]. The spatial dimensions of the output tensor depend on the padding algorithm. We currently only support the default "NHWC" data_format.

In detail, the grayscale morphological 2-D erosion is given by:

output[b, y, x, c] =
min_{dy, dx} value[b,
strides[1] * y - rates[1] * dy,
strides[2] * x - rates[2] * dx,
c] -
kernel[dy, dx, c]


Duality: The erosion of value by the kernel is equal to the negation of the dilation of -value by the reflected kernel.

##### Args:
• value: A Tensor. 4-D with shape [batch, in_height, in_width, depth].
• kernel: A Tensor. Must have the same type as value. 3-D with shape [kernel_height, kernel_width, depth].
• strides: A list of ints that has length >= 4. 1-D of length 4. The stride of the sliding window for each dimension of the input tensor. Must be: [1, stride_height, stride_width, 1].
• rates: A list of ints that has length >= 4. 1-D of length 4. The input stride for atrous morphological dilation. Must be: [1, rate_height, rate_width, 1].
• padding: A string from: "SAME", "VALID". The type of padding algorithm to use.
• name: A name for the operation (optional). If not specified "erosion2d" is used.
##### Returns:

A Tensor. Has the same type as value. 4-D with shape [batch, out_height, out_width, depth].

##### Raises:
• ValueError: If the value depth does not match kernel' shape, or if padding is other than 'VALID' or 'SAME'.