Convolution
===========

.. function:: Convolution(vnode clip, float[] matrix[, float bias=0.0, float divisor=0.0, int[] planes=[0, 1, 2], bint saturate=True, string mode="s"])
   :module: std

   Performs a spatial convolution.

   Here is how a 3x3 convolution is done. Each pixel in the 3x3
   neighbourhood is multiplied by the corresponding coefficient in
   *matrix*. The results of the nine multiplications are added together,
   then this sum is divided by *divisor*. Next, *bias* is added, and the
   result is rounded to the nearest larger integer. If this integer
   result is negative and the *saturate* parameter is False, it is
   multiplied by -1. Finally, the result is clamped to the format's range
   of valid values.

   *clip*
      Clip to process. It must have integer sample type and bit depth
      between 8 and 16, or float sample type and bit depth of 32. If
      there are any frames with other formats, an error will be
      returned.

   *matrix*
      Coefficients for the convolution.
      
      When *mode* is "s", this must be an array of 9 or 25 numbers, for
      a 3x3 or 5x5 convolution, respectively.

      When *mode* is not "s", this must be an array of 3 to 25 numbers,
      with an odd number of elements.

      The values of the coefficients must be between -1023 and 1023
      (inclusive). The coefficients are rounded to integers when
      the input is an integer format.

      This is how the elements of *matrix* correspond to the pixels in
      a 3x3 neighbourhood::

         1 2 3
         4 5 6
         7 8 9

      It's the same principle for the other types of convolutions. The
      middle element of *matrix* always corresponds to the center pixel.

   *bias*
      Value to add to the final result of the convolution (before clamping
      the result to the format's range of valid values).

   *divisor*
      Divide the output of the convolution by this value (before adding
      *bias*).

      If this parameter is 0.0 (the default), the output of the convolution
      will be divided by the sum of the elements of *matrix*, or by 1.0,
      if the sum is 0.

   *planes*
      Specifies which planes will be processed. Any unprocessed planes
      will be simply copied.

   *saturate*
      The final result is clamped to the format's range of valid values
      (0 .. (2**bitdepth)-1). Therefore, if this parameter is True,
      negative values become 0. If this parameter is False, it's instead
      the absolute value that is clamped and returned.

   *mode*
      Selects the type of convolution. Possible values are "s", for square,
      "h" for horizontal, "v" for vertical, and "hv" or "vh" for both
      horizontal and vertical.

   How to apply a simple blur equivalent to Avisynth's Blur(1):
   
   .. code-block:: python
   
      Convolution(matrix=[1, 2, 1, 2, 4, 2, 1, 2, 1])
   
   How to apply a stronger blur equivalent to Avisynth's Blur(1.58):

   .. code-block:: python
      
      Convolution(matrix=[1, 1, 1, 1, 1, 1, 1, 1, 1])

