/// <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; }
/// <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)); }
/// <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)); }
/// <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)); }
/// <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; }
/// <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)); }