1. Introduction
Ever since the emergence of 2D filters within the broader field of digital signal and image processing, the analytic design techniques for these filters have become a valuable alternative approach as compared to the more traditional numerical optimization algorithms, which usually lead to optimal filters for a set of imposed specifications. The analytical methods rely on various specific frequency transformations that are applied to a convenient 1D prototype filter with imposed parameters, thus directly obtaining the frequency response of the desired 2D filter [
1,
2,
3,
4].
Depending on their application, 2D filters (both the FIR and IIR type) may have frequency characteristics of various shapes, for instance, circular, elliptically shaped, square, fan, etc. A particular class is the orientation-selective or directional 2D filters used in fundamental image processing tasks such as edge detection, texture analysis, segmentation, optical flow estimation, etc.
Gaussian-shaped filters form a special class of 2D filters, currently employed in important tasks such as image smoothing through the blurring effect, achieved by a local averaging of pixels within a specified radius. Such Gaussian 2D filters most often have circular support but may also have an anisotropic shape in the frequency plane, thus achieving directional filtering. Several design procedures and efficient implementations of directional Gaussian filters, some of them including decomposition of the frequency response along two or three axes, are proposed in early or more recent papers such as [
5,
6,
7,
8]. Such anisotropic Gaussian filters find applications like directional smoothing, in particular for enhancing or restoring remote sensing images [
9,
10], and they are also useful in edge detection [
11]—especially in noisy images [
12]—or in optical flow estimation [
13]. Multiresolution directional filter banks, their design methods, and their applications are treated in this comprehensive work [
14].
Some very recent papers have approached various advanced design techniques for 2D FIR and IIR filters [
15,
16,
17,
18,
19,
20]. A low-complexity 2D FIR filter implementation based on a Farrow structure is proposed in [
21]. Various soft computing design algorithms have also been developed, like the Lévy flight firefly algorithm [
22] or the Vortex Search algorithm [
23]. New implementations and applications of 2D Gabor filters are given in [
24,
25], while a low-cost 2D median filter is approached in [
26]. Advanced applications are proposed for SAR imaging [
27], the denoising of satellite images [
28], and SAR interferograms [
29], while directional filters are used in sonar image fusion [
30]. Other recent developments include a neural Fourier filter bank [
31], continuous upsampling filters [
32], 2D matched filtering with time-stretching [
33], 2D/3D convolution techniques for hyperspectral image super-resolution [
34], and two-dimensional polynomial predictors [
35]. Hardware-efficient multiplier-less structures are proposed in [
36,
37]. Minimal state-space realizations, including lattice structures, are proposed in [
38,
39], while high-performance architectures on FPGA are developed in [
40,
41]. Area-efficient 2D structures for 2D filtering are also approached in [
42,
43]. A computational complexity evaluation of 2D filtering by the Winograd method is performed in [
44]. Novel stability tests for 2D continuous-time systems are established in [
45].
A rather difficult issue in fields such as computer vision and object and scene recognition is the problem of straight-line detection. A widely used method for detecting lines is based on the Hough transform (HT), a computationally intensive algorithm using edge detection and then the mapping of edge points onto the so-called Hough space. A regularized HT capable of detecting straight lines in grayscale images is developed in [
46]. An improved version of the HT algorithm relies on the Freeman chain code [
47], significantly diminishing computation time as compared to the standard HT. A high-performance 2D parallel block-filtering system developed for real-time applications is described in [
48].
Various analytic techniques for the design of 2D filters, in particular with directional characteristics, have been proposed by the first author in previous papers, such as parametric IIR filters for directional Gaussian smoothing [
49]; directional and square-shaped 2D IIR filters based on digital prototypes [
50,
51]; directional Gaussian 2D FIR filters, separable along three axes [
52]; and adjustable 2D filters with elliptical and circular symmetry [
53]. A computationally efficient implementation for a 2D circular FIR filter bank, based on a polyphase decomposition approach, has been proposed in [
54].
This work proposes an analytical procedure for the design of a particular class of 2D filters, namely directional Gaussian FIR filters with specified selectivity and orientation of the frequency response. Two such filter types are presented, one with a straight shape and the other with an elliptical shape of the frequency response support in the frequency plane. For each type, a specific 1D to 2D frequency transformation is derived and then applied to the suitable prototype. The filters are parametric, and their kernels result as being directly decomposed as a convolution of smaller-size matrices. To demonstrate their capabilities in image processing applications, several directional filtering simulations are provided on various test images. A parallel implementation technique for these filters is also shown, using polyphase decomposition and block filtering; this method is computationally efficient, requiring a relatively small number of arithmetic operations.
This paper has the following structure:
Section 2 presents the 1D Gaussian filter used as a prototype in design, derived through an efficient Chebyshev series approximation. The proposed analytical design method for 2D directional filters is detailed in the main section,
Section 3, for the design of two distinct directional filters, namely with a straight shape or elliptical shape characteristic in the frequency plane, and several design examples are presented for the given specifications. Next, in
Section 4, several simulation results of directional filtering with imposed orientation are given on various test images, highlighting their applications in image processing. A novel implementation structure relying on a polyphase approach and block-filtering technique is described in
Section 5. A comparative discussion regarding the main design issues and the arithmetic complexity of the proposed implementation is made in
Section 6. The conclusion paragraph summarizes the main aspects of the paper and sets objectives for further work.
3. Analytical Design Procedure for Anisotropic 2D FIR Filters
This main section presents in detail the proposed analytical design technique for two types of anisotropic FIR filters, namely with straight-shaped and elliptically shaped frequency responses, respectively.
3.1. Frequency Transformations for Anisotropic 2D FIR Filters
In this work, two different types of directional filters are approached. Both versions are derived analytically by applying two different 1D to 2D frequency mappings to the factored transfer function of a 1D low-pass prototype with a specified selectivity. The two types of anisotropic filters designed here have a Gaussian shape in a vertical section along their longitudinal symmetry axes. However, their shapes differ in a horizontal section, as the corresponding contour plots will show. For the first filter type, the frequency response has a straight shape, while for the second filter, it has an elliptical shape. The design steps for the two filter types will be presented in the following sections.
3.1.1. Frequency Transformation for Straight Anisotropic Filters
Starting from a specified 1D prototype
, a 2D directional filter results by rotating the axes of the frequency plane
with a given angle
about
axis. This rotation is described by the 1D to 2D frequency transformation [
50,
51]:
Applying this frequency mapping by simple substitution into the Gaussian prototype
, the following 2D frequency response
results, where the subscript
D means
directional:
3.1.2. Frequency Transformation for Elliptically Shaped Anisotropic Filters
The second type of directional filters presented here are filters with elliptically shaped support in the frequency plane. These filters are specified by the major and minor semi-axes of the ellipse (E, F), while the orientation is given by the angle
of the major axis with respect to the
axis. Starting from the same Gaussian prototype
, a directional filter with elliptically shaped support results by applying the following frequency transformation
, with the following expression [
53]:
where the coefficients
,
, and
are found by direct identification. In the mapping (8),
E and
F are the values of the major and minor semi-axes of the ellipse. Through this analytical approach, based on the Gaussian prototype (4), we derived a 2D filter with elliptical support, described by parameters
E,
F, and
, which define the shape and orientation through mapping (8).
3.2. Examples of Ideal Gaussian Anisotropic Filters
Prior to introducing the analytical design method, two ideal anisotropic filters are discussed, with straight and elliptical-shaped frequency responses, respectively.
Example 1. Let us consider a straight anisotropic filter with orientation angle , derived from the Gaussian prototype . Using the mapping (6), the following ideal 2D frequency response is obtained: This ideal straight frequency response
is displayed in
Figure 2a, and its contour plot is in
Figure 2b. The ideal directional filter
has a transversal section along the line
identical to the prototype
, and is constant (equal to 1) along the line
(the filter longitudinal axis).
Example 2. Let us consider an elliptical directional filter with an orientation angle of and the ellipse semi-axes and . Then, mapping (8) yields the elliptical directional frequency response: The ideal elliptically shaped oriented filter frequency response
is shown in
Figure 2c, and its contour plot is in
Figure 2d.
3.3. Design of Anisotropic 2D FIR Filters with Straight Longitudinal Shape
Taking into account the 1D to 2D frequency mapping (6), the following design step is to make a simple substitution in each factor of the prototype function, as below:
The function will be referred to as the ideal oriented cosine function in the frequency variables , . Further, we need to find an approximation of the ideal function , expressed in and , which can be directly implemented as a 2D discrete filter.
Next, a low-order efficient 1D to 2D frequency mapping will be obtained. Applying this mapping to the Gaussian prototype will lead directly to the desired 2D directional filter. In this paper, we use two approximations, namely the Taylor and the Chebyshev series approximations. Even if the Taylor approximation only holds within a limited vicinity of the current point—while the Chebyshev series gives a uniform approximation with a constant error on a given range—for the first type of very selective directional filter, with a straight longitudinal shape of the frequency response, the Taylor approximation is more suitable, yielding directional filters with less shape distortions, as the following design examples will show.
Thus, we use the Taylor approximation of minimum order for
:
Next, we look for a low-order approximation of
as a trigonometric polynomial in
. Since we do not need a precise, uniform approximation on the entire range
, but mainly around zero, we will again use the Taylor series, as above. However, the variable change
is first applied. In this way, we derive the Taylor series of
around the point
, truncated to the second-order term:
Now, replacing
back in (13) and applying the usual trigonometric identities, we reach the second-order approximation:
As can be remarked, this approximation (which is plotted as curve 2 in
Figure 3a) is accurate around zero, diverging significantly from the approximated function
(curve 1) towards the margins of the interval
. Applying the mapping (6), we just have to substitute
with the expression:
Using the identity
and expressing the coefficients resulting from (15) leads to the following mapping:
where the coefficients
a,
b, and
c are identified as the following:
The trigonometric approximation (14) can be written separately for the frequency variables
,
and their sum
, obtaining the following set of approximations:
Replacing the expressions (18) into (16) and then into (12), the
is mapped into a trigonometric polynomial
expressed in the variables
and
, which may be regarded as a discrete space Fourier transform; through a direct identification of coefficients, it is easy to show that the function
corresponds to the
centrally symmetric matrix
whose elements have the following expressions depending on the orientation angle
, as follows:
As an example, for
, we obtain from (19) the following matrix:
This corresponds to the oriented cosine function
shown in
Figure 3b.
Thus, through these successive approximations and substitutions, we have derived an approximation of the ideal mapping (11), namely:
where
is the 2D DFT (discrete Fourier transform) of the matrix
, determined as shown before.
In
Figure 3b–e, the function
and its corresponding contours are shown for two orientation angles, namely
and
. It is visible, mainly from the contours, that the characteristics have a straight linear shape in their central longitudinal portion, which is essential for designing very selective directional filters.
According to the approximations (4) and (5), the prototype frequency response can be factored into first- and second-order polynomials in the variable
:
where
k is a constant and
is the filter order. Making the substitution (22) directly in all factors of
from (23), the following factored 2D directional frequency response
results as follows:
where
C is a short notation for
. Because the specified prototype filter is already factored, the directional filter obtained by frequency mapping will also result in a factored transfer function. Corresponding to the factored transfer function
in (24), the kernel
of the FIR filter, although being of large size, already results as directly decomposed into smaller-size matrices (size
or
), and the symbol
represents the operation of the matrix convolution:
The FIR filter kernel
corresponds to the transfer Function (24). Taking into account (24), each matrix
(of size
) from (25) is derived from
by adding the value
from each factor in (24) to the central element of matrix
. The larger matrices
(of size
) correspond to the second-order factors
from (23), and thus we have the following expression:
In the expression (26), is a null matrix, with the central element being one; the matrix results by padding () with zeros up to the size .
Following the procedure described before, three very selective directional filters with straight frequency responses derived from the narrow prototype (5) are given as the design examples in
Figure 4 for the specified orientation angle
. It can be noticed they have accurate characteristics with negligible distortions (a small ripple in the stopband region). The contours also indicate a good longitudinal linearity, a perfectly straight shape, and no other visible distortions.
3.4. Design of Anisotropic 2D FIR Filters with Elliptical Longitudinal Shape
According to
Section 3.1.2, starting from the chosen Gaussian prototype, a 2D elliptically shaped filter is derived, with the parameters
E,
F, and
. Using the simple identity
, the mapping (8) takes the following form:
Using the notations
,
, the coefficients
a,
b, and
c will have the following expressions:
Applying the mapping (27) to the Gaussian prototype
, the 2D frequency response results (where the subscript
E denotes
elliptical) as follows:
Since the Gaussian 1D prototype with a specified selectivity is expressed as a factored trigonometric polynomial in the variable
, we will need the following frequency mapping derived from (27):
In order to find a convenient expression for this frequency mapping, we will use the efficient Chebyshev series approximation, which is known to yield an accurate and uniform approximation of a given function on a specified interval. Thus, we obtain the following very accurate approximation (for
, specifically
):
Taking into account Equation (30), we immediately obtain:
On the other hand, again using the Chebyshev series method and variable change (2), we obtain the following trigonometric approximation for the function
:
This can be written separately for the frequency variables
,
and their sum
, obtaining the set of approximations:
Substituting relations (34) into (27) and then the obtained expression of
into (32), we obtain a trigonometric expression of
in the variables
and
. Regarding this expression as a 2D discrete Fourier transform, by a simple identification of the coefficients, we finally obtain a
matrix of the general centrally symmetric form, similar to
from (19):
where this time, the matrix elements have the following expressions depending on the ellipse aspect parameters
p,
q, and on the orientation angle
:
Since the derived matrix
corresponds to the expression
, then according to Equation (32), the function
will correspond to a
matrix given by the following expression:
where the symbol
represents the operation of matrix convolution.
In the expression above, is a null matrix, with the central element being one; the matrix results by bordering () with zeros up to a size of .
In
Figure 5, the function
and its contours are shown for several values of semi-axes and orientation angles, as specified. It is visible, mainly from the contours, that the characteristics have a correct elliptical shape, at least in their central portion, which will lead to elliptical directional filters with negligible distortions, as shown further.
Following the above procedure, several directional filters with elliptically shaped characteristics are designed as examples; their frequency responses
(for
) and the corresponding contour plots are displayed in
Figure 6 for the specified parameters (semi-axes
E and
F and the orientation angle
).
As can be noticed, the characteristics have accurate shapes with negligible distortions. The contour plots also show almost perfect elliptical shapes, with minimal distortions near the margins of the frequency plane, for filters with a large aspect ratio (E/F = 8, etc.). As a remark, elliptically shaped filters with a large aspect ratio (a ratio between semi-axes values, E/F), for instance, the filter with E = 8 and F = 1 in
Figure 6f, have a shape almost similar to a straight filter (the ellipse being very elongated).
As a remark, the mappings (6) and (8) can be generally applied to any prototype of a specified shape (for instance, wider and maximally flat), not necessarily Gaussian.
As another important observation, the proposed 2D anisotropic filters have to be designed only for angles between values 0 and pi/4 (within half a quadrant); for any other angle, the filter is simply obtained, taking into account the symmetry. Thus, for the specified angles outside the mentioned quadrant, the filter kernel is simply obtained by simple symmetry operations, like a rotation by 90 degrees or flipping the matrix upside-down or from left to right. A more detailed explanation of this issue is provided in [
52] for another type of directional filter.
5. Efficient Implementation of the 2D Anisotropic FIR Filters Using Polyphase and Block-Filtering Approach
Next, an efficient implementation with a low arithmetic complexity and a high degree of parallelism is developed at a system level for the designed 2D directional FIR filters, employing a polyphase structure that achieves a 2D filtering task with a relatively large convolution kernel (of size
). In order to implement the convolution operation with a kernel of this size, a block-filtering technique [
48], combined with a polyphase decomposition, will be used.
As a preliminary step, employing sub-expression sharing methods, an algorithm that performs 2D filtering with a kernel of size 5 × 5 was developed, as presented below. To achieve this task, the kernel of the 2D filter obtained from the design and the input image to be filtered are decimated by factors 5 and 9, respectively; after this, a polyphase filtering technique is used. Through this approach, four partial output component images are calculated in parallel, namely
,
,
, and
, given by Equations (40)–(43) as follows:
in which the block matrices have the following form:
and
,
, and
are the zero matrices of the sizes 5 × 15, 15 × 5, and 15 × 9, respectively. Summing up the partial results
,
,
, and
, resulting from (40)–(43), the following output vector
containing 25 samples of the filtered image is obtained:
The vector
appearing in Equations (40)–(43) is given below:
while the input vector
is displayed as follows:
The main objective of the proposed 2D FIR polyphase filtering algorithm was to reduce the computational complexity and simultaneously speed up the calculation using a parallel filtering structure. It is widely acknowledged that applying a direct 2D convolution involves a high level of redundancy in computation due to overlapping blocks of input data; eliminating a large amount of such unnecessary, redundant calculations will result in a significant decrease in the arithmetic complexity of the system.
From this point on, the 2D filtering algorithm discussed above, for a simpler case, will be extended from an elementary kernel of size 5 × 5 to a larger kernel (31 × 31). In order to reach this aim and to obtain an efficient parallel computational structure, block processing combined with a polyphase technique will be further used.
Within the framework of this 2D polyphase structure, a decimation with a factor of 5 of the filter kernel will be performed. However, prior to decimation, the kernel has to be enlarged up to a size multiple of 5, in our case 35 × 35, by bordering it symmetrically with zeros at the margins. Meanwhile, a decimation by a factor of 9 was also applied to the input image, and in this way, an input image of the size 63 × 63 was obtained.
Employing the above-mentioned block processing and polyphase decomposition, as shown before, the following efficient algorithm has been derived for the implementation of the designed 2D FIR filter.
Thus, for the particular case where the kernel matrix is 15 × 15, and the input matrix is 27 × 27, the vectors
,
,
,
,
,
, …,
,
, …,
,
, …,
,
, …,
will have the generic form
given below (for
,
):
For example, the vectors
,
, and
generated by formula (48) will be:
For a simpler explanation of the proposed filtering algorithm, it was first demonstrated in a particular case of lower complexity, where the filter kernel is of the size 15 × 15, while the input image is of the size 27 × 27. Nevertheless, the results can be easily extended for the kernel of the directional FIR filter designed before, of the size 31 × 31, extended to the size 35 × 35 (by bordering with zeros), to be able to perform the decimation with a factor of 5.
Next, the simpler algorithm presented above for a 2D filter with a 5 × 5 kernel and 9 × 9 input matrix can be readily extended by achieving a decimation of the filter kernel by a factor of 5 and a decimation of the input matrix by a factor of 9. Thus, by decimating with a factor of 5, instead of the kernel with the size 15 × 15, 25 matrices of size 3 × 3 are obtained. As an example, for matrix
, after decimating by 5, a block matrix of size 3 × 3 will result as follows:
Next, by concatenating the rows of matrix , the matrix is derived from Equation (46). The vector is also substituted with the vector given by (47).
The vectors
,
,
,
, …,
, which compose matrix
and are given by the input image, are defined by the general indexed expression as follows:
For instance, the vectors
,
,
resulting from formula (51) will be:
The vectors
,
,
,
, …,
have been determined as described next. For the purpose of easier understanding, our demonstration considers the simpler case in which the input image is of size 27 × 27 and is decimated by a factor of 9. As a result, instead of the input matrix of size 27 × 27, a number of 81 matrices of size 3 × 3 are derived. Taking the case of
as an example, through decimation by a factor of 9, the following 3 × 3 block matrix results are as follows:
Next, the rows of
will be concatenated, then the obtained vector is reversed, and finally, the vector
is derived from the general Equation (51):
Although the algorithm presentation was restricted to a particular situation where the input matrix is of the size 27 × 27, for an easier understanding, it is also straightforward to apply it in a more general case. For instance, a 2D FIR filtering with a 5 × 5 kernel applied to a 9 × 9 input image matrix was decomposed into 225 1D inner products using the following block matrix equations:
Finally, the following output vector will be derived:
In Equations (55)–(58), the block matrices are, respectively, , where the vector , and , where is the identity matrix (with ones on the main diagonal and zeros elsewhere); we also have . The matrices , , and are null matrices of the sizes 5 × 135, 135 × 45, and 135 × 81, respectively.
6. Discussion
The analytical design technique proposed here for anisotropic Gaussian 2D FIR filters is relatively simple and efficient. Two types of such filters have been approached, with straight and elliptical shapes of the frequency response. As shown in the provided examples, the filters designed through this method have a precise shape with negligible distortions, good linearity along the axes, and wide longitudinal bandwidths. Since they are of the FIR type, these filters are unconditionally stable. Because they are derived from a Gaussian prototype with a real-values transfer function, these filters have a zero phase, which is a desirable feature due to the absence of phase distortions in the filtered image.
A very rigorous comparison regarding performance with directional filters already existing in the literature is quite difficult to make because such filters differ very much in terms of their shape, specifications, and applications. Only some qualitative, general comparative remarks can be made. The analytically designed Gaussian straight directional filter is very selective at a relatively low order (due to the efficient approximation used) compared to other similar filters from the literature. Furthermore, the characteristics and associated contours given in
Figure 4 for several orientations show a straight, linear response in the frequency plane, with a visibly wider longitudinal bandwidth, compared with the Gaussian filter using triple-axis decomposition [
8] and also the Gaussian smoothing filters in [
9,
10] with an elliptical shape in the frequency plane.
The advantages of the proposed design technique for these 2D directional filters, which also apply to other types of 2D filters, as presented in [
49,
50,
51,
52,
53,
54], were highlighted in detail in
Section 2.1. The most important one would be the flexibility in design due to the fact that the resulting 2D filters have a parametric, factored frequency response, which allows them to be easily tuned and adjusted according to given specifications. The 2D filters derived through frequency mapping inherit the properties of the 1D prototype, and therefore, their shape is exactly controlled and has low distortions and wide longitudinal bandwidths. This ensures a high directional selectivity and makes them suitable for the tasks detailed in
Section 4, namely the detection and extraction of oriented lines and other objects from various images—a useful application that has not been approached by other researchers in the image processing field. In regards to the implementation, our novel solution based on polyphase and block filtering ensures a low computational complexity. We have not found any implementation of a 2D filter with the same degree of parallelism in the literature (computing 25 image samples simultaneously).
A comparison can also be made with the first author’s previous works approaching related design methods [
49,
50,
51,
52,
53,
54]. In [
49], a class of adjustable Gaussian filters is proposed, but they are of IIR type. While IIR filters are generally of lower order than FIR for similar specifications and, thus, are more computationally efficient, their stability must be ensured for correct operation, which sometimes may be quite difficult. In [
50,
51], other directional IIR filters, based on different prototypes, are designed analytically. In [
52], the proposed directional Gaussian FIR filters using separability and decomposition along three frequency axes have low orders, but their longitudinal bandwidth is narrower. Also, the method used in [
52] is more elaborate and difficult to apply. By comparison, the filters developed in the current work do not use 2D Gaussian separability, but they have much wider longitudinal bandwidths, and consequently, their directional selectivity is better; the applied method is also significantly simpler.
The proposed 2D anisotropic directional filters have the advantage of being parametric and, therefore, adjustable. For straight-shaped filters, matrix in (19) depends on the orientation angle , as in (20), and so does the overall filter kernel . For elliptically shaped filters, matrix in (35) depends both on the angle and ellipse semi-axes (E, F), according to (36). Thus, for any specified parameter values, the filter matrices are derived directly. This is one advantage of the analytical approach: The design procedure need not be resumed every time from the beginning when changing the parameters—they are simply substituted in the filter matrices.
Regarding the implementation part, the proposed polyphase block-filtering algorithm continues the algorithm from [
54] but is superior in efficiency. It has a higher degree of parallelism and different decimation factors and, therefore, performs better regarding computational complexity, as discussed below. We make a brief comparison between the direct convolution and the polyphase filtering technique proposed above in terms of arithmetic complexity. As is widely known, a 2D filtering of an image with
pixels, with a FIR filter having a kernel of the size
implies a 2D convolution operation between a
matrix and a
matrix. As the filter kernel overlaps with the image sliding along the two axes, each pixel requires
multiplications; therefore, the overall 2D filtering requires, in total,
multiplications. Also, it is easy to evaluate the total number of additions
.
In this simplified, demonstrative approach, we used 25 inner products, each implying multiplications and additions, giving in total multiplications and 225 additions, plus 660 additions in the pre-processing stage and additions in the post-processing stage.
The 2D directional filter effectively designed in
Section 3.3 has a kernel of size
; in order to obtain a polyphase decomposition with a decimation factor of 5, we need to extend the kernel to size
by adding four columns and rows of zeros. In this case, we need
multiplications and 4225 additions, plus 660 additions in the pre-processing stage and 135 additions in the post-processing stage.
Aside from a reduction in the arithmetic complexity, a significant speed improvement can be achieved by using a parallel implementation. Thus, we can compute 25 samples simultaneously and 100 computations can be done in parallel, and the partial results are added to obtain those 25 samples in parallel.