示例#1
0
 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);
     }
 }
示例#2
0
        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);
        }
示例#3
0
 public static bool LowPassFilter(Pixelmap b)
 {
     return(Convolution.Conv3x3(b, LOW_PASS_FILTER_MATRIX));
 }