public void GreyFilter() { int counter = 0; Pixels = Pixels .Select(x => x .GroupBy(y => counter++ / SizesOfImage[2]) .Select(y => y .Select(z => (byte)(0.3 * y.First() + 0.59 * y.Skip(1).First() + 0.11 * y.Skip(2).First()))) .SelectMany(y => y) .ToArray()) .ToArray(); }
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(); }