Example #1
0
        /// <summary>
        /// Guided filer function.
        /// </summary>
        /// <param name="input">Input signal</param>
        /// <param name="r">Filter size</param>
        /// <param name="eps">Epsilon (0, 1)</param>
        internal static void guidedfilter(Complex32[,] input, int r, float eps)
        {
            // Input signal properties:
            int l0 = input.GetLength(0), l1 = input.GetLength(1), i, j;

            // Calculating μ(I) and μ(I^2):
            Complex32[,] x = (Complex32[, ])input.Clone();
            Complex32[,] y = Matrice.Pow(input, 2.0f);

            // Applying fast box filter:
            x = x.Mean(r, r);
            y = y.Mean(r, r);

            // Calculating cov(I):
            // This is the covariance of input in each local patch:
            Complex32[,] c = new Complex32[l0, l1];
            for (i = 0; i < l0; i++)
            {
                for (j = 0; j < l1; j++)
                {
                    c[i, j] = y[i, j] - x[i, j] * x[i, j];
                }
            }

            // Calculating μ(a) and μ(b):
            Complex32[,] a = new Complex32[l0, l1];
            Complex32[,] b = new Complex32[l0, l1];
            for (i = 0; i < l0; i++)
            {
                for (j = 0; j < l1; j++)
                {
                    a[i, j] = c[i, j] / (c[i, j] + eps);
                    b[i, j] = x[i, j] - a[i, j] * x[i, j];
                }
            }

            // Applying fast box filter:
            a = a.Mean(r, r);
            b = b.Mean(r, r);

            // Calculating μ(a) * I + μ(b):
            for (i = 0; i < l0; i++)
            {
                for (j = 0; j < l1; j++)
                {
                    input[i, j] = a[i, j] * input[i, j] + b[i, j];
                }
            }

            return;
        }
Example #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="u">Matrix</param>
        /// <param name="radius">Radius</param>
        /// <returns>Matrix</returns>
        internal static Complex32[] downsample(Complex32[] u, int radius)
        {
            int r = u.Length;
            int n = (r + 1) / 2;
            int i, k;

            Complex32[] v = new Complex32[n];

            for (k = 0, i = 0; i < r; i += 2, k++)
            {
                v[k] = u[i];
            }

            return(v.Mean(radius));
        }
Example #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="u">Array</param>
        /// <param name="radius">Radius</param>
        /// <returns>Array</returns>
        internal static Complex32[] upsample(Complex32[] u, int radius)
        {
            int r = u.GetLength(0);
            int n = r * 2;
            int i, k;

            Complex32[] v = new Complex32[n];

            for (k = 0, i = 0; i < r; i++, k += 2)
            {
                v[k]     = u[i];
                v[k + 1] = u[i];
            }

            return(v.Mean(radius));
        }
Example #4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="u">Matrix</param>
        /// <param name="radius">Radius</param>
        /// <returns>Matrix</returns>
        internal static Complex32[,] downsample(Complex32[,] u, int radius)
        {
            int r = u.GetLength(0);
            int c = u.GetLength(1);
            int n = (r + 1) / 2, m = (c + 1) / 2;
            int i, j, k, l;

            Complex32[,] v = new Complex32[n, m];

            for (k = 0, i = 0; i < r; i += 2, k++)
            {
                for (l = 0, j = 0; j < c; j += 2, l++)
                {
                    v[k, l] = u[i, j];
                }
            }

            return(v.Mean(radius, radius));
        }
Example #5
0
        /// <summary>
        /// Guided filer function.
        /// </summary>
        /// <param name="input">Input signal</param>
        /// <param name="r">Filter size</param>
        /// <param name="eps">Epsilon (0, 1)</param>
        internal static void guidedfilter(Complex32[] input, int r, float eps)
        {
            // Input signal properties:
            int length = input.Length, i;

            // Calculating μ(I) and μ(I^2):
            Complex32[] x = (Complex32[])input.Clone();
            Complex32[] y = Matrice.Pow(input, 2.0f);

            // Applying fast box filter:
            x = x.Mean(r);
            y = y.Mean(r);

            // Calculating cov(I):
            // This is the covariance of input in each local patch:
            Complex32[] c = new Complex32[length];
            for (i = 0; i < length; i++)
            {
                c[i] = y[i] - x[i] * x[i];
            }

            // Calculating μ(a) and μ(b):
            Complex32[] a = new Complex32[length];
            Complex32[] b = new Complex32[length];
            for (i = 0; i < length; i++)
            {
                a[i] = c[i] / (c[i] + eps);
                b[i] = x[i] - a[i] * x[i];
            }

            // Applying fast box filter:
            a = a.Mean(r);
            b = b.Mean(r);

            // Calculating μ(a) * I + μ(b):
            for (i = 0; i < length; i++)
            {
                input[i] = a[i] * input[i] + b[i];
            }

            return;
        }
Example #6
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="u">Matrix</param>
        /// <param name="radius">Radius</param>
        /// <returns>Matrix</returns>
        internal static Complex32[,] upsample(Complex32[,] u, int radius)
        {
            int r = u.GetLength(0), c = u.GetLength(1);
            int n = r * 2, m = c * 2;
            int i, j, k, l;

            Complex32[,] v = new Complex32[n, m];

            for (k = 0, i = 0; i < r; i++, k += 2)
            {
                for (l = 0, j = 0; j < c; j++, l += 2)
                {
                    v[k + 1, l]     = u[i, j];
                    v[k, l + 1]     = u[i, j];
                    v[k, l]         = u[i, j];
                    v[k + 1, l + 1] = u[i, j];
                }
            }

            return(v.Mean(radius, radius));
        }