public void MiddleFilter() { for (int i = 1; i < SizesOfImage[1] - 1; i++) { for (int j = SizesOfImage[2]; j < SizesOfImage[0] - SizesOfImage[2]; j += SizesOfImage[2]) { int counter = 0; byte[] buffer = Pixels .Skip(i - 1) .Take(3) .Select(x => x .Skip(j - SizesOfImage[2]) .Take(3 * SizesOfImage[2])) .SelectMany(x => x) .ToArray() .GroupBy(x => counter++ % SizesOfImage[2]) .Select(x => x .OrderBy(y => y)) .SelectMany(x => x) .ToArray(); for (int k = 0; k < 3; k++) { Pixels[i][j + k] = buffer.Skip(4 + 9 * k).First(); } } } }
public void GaussFilter() { double[] gaussFilter = { 0.307801, 0.384396, 0.307801 }; for (int i = 1; i < SizesOfImage[1] - 1; i++) { for (int j = SizesOfImage[2]; j < SizesOfImage[0] - SizesOfImage[2]; j += SizesOfImage[2]) { int counter = 0; int anotherCounter = 0; byte[] buffer = Pixels .Skip(i - 1) .Take(3) .Select(x => x .Skip(j - SizesOfImage[2]) .Take(3 * SizesOfImage[2])) .SelectMany(x => x) .ToArray() .GroupBy(x => anotherCounter++ % SizesOfImage[2]) .Select(x => x .Select(y => y * gaussFilter[(counter / 3) % 3] * gaussFilter[counter++ % 3])) .Select(x => x .Select(y => (byte)x.Sum()) .ToArray()) .SelectMany(x => x) .ToArray(); for (int k = 0; k < 3; k++) { Pixels[i][j + k] = buffer.Skip(9 * k).First(); } } } }
public void SobelAxisFilter(int flag) // 1 - xAxis, 0 - yAxis { GreyFilter(); const int limit = 73; byte[][] bufferPixels = new byte[SizesOfImage[1]][] .Select(x => new byte[SizesOfImage[0]]) .ToArray(); int[] sobelFilter = { -1, 2 * (flag - 1), -1 + 2 * flag, -2 * flag, 0, 2 * flag, 1 - 2 * flag, 2 - 2 * flag, 1 }; // {-1, 0, 1, -2, 0, 2, -1, 0, 1} for flag == 1, {-1, -2, -1, 0, 0, 0, 1, 2, 1} for == 0 for (int i = 1; i < SizesOfImage[1] - 1; i++) { for (int j = SizesOfImage[2]; j < SizesOfImage[0] - SizesOfImage[2]; j++) { int counter = 0; byte[] buffer = Pixels .Skip(i - 1) .Take(3) .Select(x => x .Skip(j - SizesOfImage[2]) .Take(3 * SizesOfImage[2])) .SelectMany(x => x) .ToArray() .Where((x, y) => y % 3 == 0) .ToArray(); bufferPixels[i][j / SizesOfImage[2]] = (byte)(255 * Convert.ToInt32(Math.Abs(buffer.Select(x => x * sobelFilter[counter++ % 9]).Sum()) > limit)); // 255 for > limit and 0 for <= } } int k = 0; int l = 0; Pixels = Pixels .Select(x => x .Select(y => bufferPixels[k++ / SizesOfImage[0]][(l++ % SizesOfImage[0]) / SizesOfImage[2]]) .ToArray()) .ToArray(); }