Example #1
0
        public static CanvasEdgeVO CreateEdgesFromCanvas(CanvasPixel canvasPixel)
        {
            CanvasEdgeVO result = new CanvasEdgeVO(canvasPixel.Width, canvasPixel.Height);

            EdgePoint[] dest   = result.Data;
            Pixel[]     source = canvasPixel.Data;

            Pixel[] matrix = new Pixel[9];

            for (int y = 0; y < canvasPixel.Height; y++)
            {
                for (int x = 0; x < canvasPixel.Width; x++)
                {
                    int index = y * canvasPixel.Width + x;

                    matrix[0] = CreateEdgesFromCanvas_GetPixel(canvasPixel, x, y, -1, -1, index);
                    matrix[1] = CreateEdgesFromCanvas_GetPixel(canvasPixel, x, y, 0, -1, index);
                    matrix[2] = CreateEdgesFromCanvas_GetPixel(canvasPixel, x, y, 1, -1, index);

                    matrix[3] = CreateEdgesFromCanvas_GetPixel(canvasPixel, x, y, -1, 0, index);
                    matrix[4] = CreateEdgesFromCanvas_GetPixel(canvasPixel, x, y, 0, 0, index);
                    matrix[5] = CreateEdgesFromCanvas_GetPixel(canvasPixel, x, y, 1, 0, index);

                    matrix[6] = CreateEdgesFromCanvas_GetPixel(canvasPixel, x, y, -1, 1, index);
                    matrix[7] = CreateEdgesFromCanvas_GetPixel(canvasPixel, x, y, 0, 1, index);
                    matrix[8] = CreateEdgesFromCanvas_GetPixel(canvasPixel, x, y, 1, 1, index);

                    (GradientDirection direction, int intensity)gResult = DirectionGradientBO.Detect(matrix);

                    dest[index] = new EdgePoint(gResult.direction, gResult.intensity);
                }
            }
            return(result);
        }
Example #2
0
        public static void EdgeReducer(CanvasEdgeVO dataCE, int threshold)
        {
            CanvasEdgeVO tmpCE = new CanvasEdgeVO(dataCE.Width, dataCE.Height);

            tmpCE.Clear();

            for (int y = 0; y < dataCE.Height; y++)
            {
                int diff = 0;

                for (int x = 0; x < dataCE.Width; x++)
                {
                    int index = y * dataCE.Width + x;

                    EdgePoint oneEdge = dataCE.Data[index];

                    if (oneEdge.Direction == GradientDirection.vertical || oneEdge.Direction == GradientDirection.askewRaise)
                    {
                        diff += oneEdge.Intensity;

                        if (diff > threshold)
                        {
                            oneEdge.Intensity = diff;
                            tmpCE.Data[index] = oneEdge;
                            diff = 0;
                        }
                    }
                }
            }

            for (int x = 0; x < dataCE.Width; x++)

            {
                int diff = 0;

                for (int y = 0; y < dataCE.Height; y++)
                {
                    int index = y * dataCE.Width + x;

                    EdgePoint oneEdge = dataCE.Data[index];

                    if (oneEdge.Direction == GradientDirection.horizontal || oneEdge.Direction == GradientDirection.askewFall)
                    {
                        diff += oneEdge.Intensity;

                        if (diff > threshold)
                        {
                            if (tmpCE.Data[index].Intensity < diff)
                            {
                                oneEdge.Intensity = diff;
                                tmpCE.Data[index] = oneEdge;
                            }
                            diff = 0;
                        }
                    }
                }
            }

            // prepiseme vysledek
            Array.Copy(tmpCE.Data, dataCE.Data, tmpCE.Data.Length);
        }