public static ImageProjection ProjectAndFindVarianceOnVerticalLine(GrayImage image)
        {
            int             lineIdx            = 0;
            float           meanAccumlator     = 0;
            float           mean               = 0;
            int             lineCrossingPoints = 0;
            int             width              = image.Width;
            ImageProjection vertical           = new ImageProjection {
                Vtheta = 0, Density = new uint[image.Height]
            };

            for (int index = 1; index < image.Pixels.Length; index++)
            {
                lineCrossingPoints = 0;
                uint lineProject = 0;
                for (int j = 1; j < width; j++)
                {
                    if (image.Pixels[index] > 0)
                    {
                        lineProject++;
                    }

                    if (image.Pixels[index - 1] < image.Pixels[index])
                    {
                        lineCrossingPoints++;
                    }
                    index++;
                }
                lineIdx++;
                float delta = lineCrossingPoints - mean;
                mean += delta / lineIdx;
                float delta2 = lineCrossingPoints - mean;
                meanAccumlator += delta * delta2;
                vertical.Density[lineIdx - 1] = lineProject;
            }
            vertical.Vtheta = meanAccumlator / lineIdx;
            return(vertical);
        }
        public static ImageProjection ProjectAndFindVarianceOnHorizontalLine(GrayImage image)
        {
            int             lineIdx            = 0;
            float           meanAccumlator     = 0;
            float           mean               = 0;
            int             lineCrossingPoints = 0;
            int             width              = image.Width;
            ImageProjection horizontal         = new ImageProjection {
                Vtheta = 0, Density = new uint[width]
            };

            for (int j = 0; j < width; j++)
            {
                lineCrossingPoints = 0;
                uint lineProject = 0;
                for (int index = j + width; index < image.Pixels.Length; index += width)
                {
                    if (image.Pixels[index] > 0)
                    {
                        lineProject++;
                    }

                    if (image.Pixels[index - width] < image.Pixels[index])
                    {
                        lineCrossingPoints++;
                    }
                }
                lineIdx++;
                float delta = lineCrossingPoints - mean;
                mean += delta / lineIdx;
                float delta2 = lineCrossingPoints - mean;
                meanAccumlator += delta * delta2;
                horizontal.Density[lineIdx - 1] = lineProject;
            }
            horizontal.Vtheta = meanAccumlator / lineIdx;
            return(horizontal);
        }