Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections.Generic;
- using System.Linq;
- namespace Recognizer
- {
- internal static class MedianFilterTask
- {
- /*
- * Для борьбы с пиксельным шумом, подобным тому, что на изображении,
- * обычно применяют медианный фильтр, в котором цвет каждого пикселя,
- * заменяется на медиану всех цветов в некоторой окрестности пикселя.
- * https://en.wikipedia.org/wiki/Median_filter
- *
- * Используйте окно размером 3х3 для не граничных пикселей,
- * Окно размером 2х2 для угловых и 3х2 или 2х3 для граничных.
- */
- public static double[,] MedianFilter(double[,] original)
- {
- var width = original.GetLength(0);
- var heigth = original.GetLength(1);
- var medianFiltersPicture = new double[width, heigth];
- for (var x = 0; x < width; x++)
- for (var y = 0; y < heigth; y++)
- medianFiltersPicture[x, y] = MedianOfArea(x, y, original, width, heigth);
- return medianFiltersPicture;
- }
- public static double MedianOfArea(int x, int y, double[,] original, int width, int heigth)
- {
- double median;
- var listOfAreaPixels = new List<double>();
- for (int areasX = -1; areasX < 2; areasX++)
- for (int areasY = -1; areasY < 2; areasY++)
- if ((x + areasX >= 0) && (y + areasY >= 0) && (x + areasX < width) && (y + areasY < heigth))
- listOfAreaPixels.Add(original[x + areasX, y + areasY]);
- listOfAreaPixels.Sort();
- var countAreasPixels = listOfAreaPixels.Count;
- if (countAreasPixels % 2 == 0)
- median = (listOfAreaPixels[countAreasPixels / 2 - 1] + listOfAreaPixels[countAreasPixels / 2]) / 2;
- else
- median = listOfAreaPixels[countAreasPixels / 2];
- return median;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement