Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2016
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.51 KB | None | 0 0
  1. using System.Linq;
  2. using System;
  3.  
  4. namespace Recognizer
  5. {
  6.     internal static class MedianFilterTask
  7.     {
  8.         /*
  9.          * Для борьбы с пиксельным шумом, подобным тому, что на изображении,
  10.          * обычно применяют медианный фильтр, в котором цвет каждого пикселя,
  11.          * заменяется на медиану всех цветов в некоторой окрестности пикселя.
  12.          * https://en.wikipedia.org/wiki/Median_filter
  13.          *
  14.          * Используйте окно размером 3х3 для не граничных пикселей,
  15.          * Окно размером 2х2 для угловых и 3х2 или 2х3 для граничных.
  16.          */
  17.         public static double[,] MedianFilter(double[,] original)
  18.         {
  19.  
  20.             double[,] array = new double[original.GetLength(0) + 2, original.GetLength(1) + 2];
  21.             for (int x = 0; x < original.GetLength(0); x++)
  22.                 for (int y = 0; y < original.GetLength(1); y++)
  23.                         array[x + 1, y + 1] = original[x, y];
  24.             for (int x = 1; x < original.GetLength(0) + 1; x++)
  25.                 for (int y = 1; y < original.GetLength(1) + 1; y++)
  26.                     if ((array[x, 0] == 0) && (array[x, 1] == 0) && (array[x, 2] == 0) || (array[x,0] == 255) &&
  27.                        (array[x, 1] == 255) && (array[x, 2] == 255))
  28.                     {
  29.                         double r = 0;
  30.                         double g = 0;
  31.                         int good = 0;
  32.                         for (int i = -1; i <= 1; i++)
  33.                                     if (!((array[x + i,  0] == 0) && (array[x + i, 1] == 0) && (array[x + i, 2] == 0) ||
  34.                                        (array[x + i,  0] == 255) && (array[x + i, 1] == 255) && (array[x + i,  2] == 255)))
  35.                                     {
  36.  
  37.                                         r += array[x + i, 0];
  38.                                         g += array[x + i, 1];
  39.                                         good++;
  40.                                     }
  41.                         array[x, 0] = r / good;
  42.                         array[x, 1] = g / good;
  43.                     }
  44.             for (int x = 0; x < original.GetLength(0); x++)
  45.                 for (int y = 0; y < original.GetLength(1); y++)
  46.                     for (int i = 0; i < 3; i++)
  47.                         original[x, y] = (byte)array[x + 1, y + 1];
  48.  
  49.  
  50.             return original;
  51.         }
  52.     }
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement