public static uint[,] LowPassFilter(uint[,] b, int bpp, bool cutEdges) { uint[,] data = Convolution.Conv3x3(b, bpp, LOW_PASS_FILTER_MATRIX); if (cutEdges) { return(CutArrayEdges(data)); } else { data = SetArrayEdgesToZero(data); return(data); } }
public static uint[,] LowPassDifferenceFilter(uint[,] b, int bpp) { uint[,] lowPassData = Convolution.Conv3x3(b, bpp, LOW_PASS_FILTER_MATRIX); uint[,] lowPassDiffData = new uint[lowPassData.GetLength(0), lowPassData.GetLength(1)]; int nWidth = lowPassData.GetLength(0); int nHeight = lowPassData.GetLength(1); List <uint> allValues = new List <uint>(); for (int y = 0; y < nHeight; ++y) { for (int x = 0; x < nWidth; ++x) { // The median 5x5 value is the median of all values in the 5x5 region around the point allValues.Clear(); if (x - 2 >= 0) { if (y - 2 >= 0) { allValues.Add(lowPassData[x - 2, y - 2]); } if (y - 1 >= 0) { allValues.Add(lowPassData[x - 2, y - 1]); } allValues.Add(lowPassData[x - 2, y]); if (y + 1 < nHeight) { allValues.Add(lowPassData[x - 2, y + 1]); } if (y + 2 < nHeight) { allValues.Add(lowPassData[x - 2, y + 2]); } } if (x - 1 >= 0) { if (y - 2 >= 0) { allValues.Add(lowPassData[x - 1, y - 2]); } if (y - 1 >= 0) { allValues.Add(lowPassData[x - 1, y - 1]); } allValues.Add(lowPassData[x - 1, y]); if (y + 1 < nHeight) { allValues.Add(lowPassData[x - 1, y + 1]); } if (y + 2 < nHeight) { allValues.Add(lowPassData[x - 1, y + 2]); } } allValues.Add(lowPassData[x, y]); if (x + 1 < nWidth) { if (y - 2 >= 0) { allValues.Add(lowPassData[x + 1, y - 2]); } if (y - 1 >= 0) { allValues.Add(lowPassData[x + 1, y - 1]); } allValues.Add(lowPassData[x + 1, y]); if (y + 1 < nHeight) { allValues.Add(lowPassData[x + 1, y + 1]); } if (y + 2 < nHeight) { allValues.Add(lowPassData[x + 1, y + 2]); } } if (x + 2 < nWidth) { if (y - 2 >= 0) { allValues.Add(lowPassData[x + 2, y - 2]); } if (y - 1 >= 0) { allValues.Add(lowPassData[x + 2, y - 1]); } allValues.Add(lowPassData[x + 2, y]); if (y + 1 < nHeight) { allValues.Add(lowPassData[x + 2, y + 1]); } if (y + 2 < nHeight) { allValues.Add(lowPassData[x + 2, y + 2]); } } allValues.Sort(); int middleCal = allValues.Count / 2; if (allValues.Count % 2 == 1) { lowPassDiffData[x, y] = allValues[middleCal]; } else if (allValues.Count > 1) { lowPassDiffData[x, y] = (uint)((allValues[middleCal] + allValues[middleCal - 1]) / 2); } else if (allValues.Count == 1) { lowPassDiffData[x, y] = allValues[0]; } if (lowPassDiffData[x, y] > lowPassData[x, y]) { lowPassDiffData[x, y] = 0; } else { lowPassDiffData[x, y] = (uint)(lowPassData[x, y] - lowPassDiffData[x, y]); } } } return(lowPassDiffData); }
public static bool LowPassFilter(Pixelmap b) { return(Convolution.Conv3x3(b, LOW_PASS_FILTER_MATRIX)); }