Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2016
527
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.16 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using System.Linq;
  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. var width = original.GetLength(0);
  20. var heigth = original.GetLength(1);
  21. var medianFiltersPicture = new double[width, heigth];
  22.  
  23. for (var x = 0; x < width; x++)
  24. for (var y = 0; y < heigth; y++)
  25. medianFiltersPicture[x, y] = MedianOfArea(x, y, original, width, heigth);
  26. return medianFiltersPicture;
  27. }
  28. public static double MedianOfArea(int x, int y, double[,] original, int width, int heigth)
  29. {
  30. double median;
  31. var listOfAreaPixels = new List<double>();
  32. for (int areasX = -1; areasX < 2; areasX++)
  33. for (int areasY = -1; areasY < 2; areasY++)
  34. if ((x + areasX >= 0) && (y + areasY >= 0) && (x + areasX < width) && (y + areasY < heigth))
  35. listOfAreaPixels.Add(original[x + areasX, y + areasY]);
  36.  
  37. listOfAreaPixels.Sort();
  38. var countAreasPixels = listOfAreaPixels.Count;
  39.  
  40. if (countAreasPixels % 2 == 0)
  41. median = (listOfAreaPixels[countAreasPixels / 2 - 1] + listOfAreaPixels[countAreasPixels / 2]) / 2;
  42. else
  43. median = listOfAreaPixels[countAreasPixels / 2];
  44.  
  45. return median;
  46. }
  47. }
  48. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement