Ejemplo n.º 1
0
        private static void BuildOctave(Pyramid pyramid, int index, int layers, double sigma0, double k,
            Mat image)
        {
            var list = new List<PyramidMat>(layers);
            var dogList = new List<Mat>(layers);

            var sigmaPrev = sigma0;
            list.Add(new PyramidMat(image, index, 0, sigmaPrev, sigmaPrev * (1 << index)));

            for (var i = 1; i < layers; i++)
            {
                var sigmaCurrent = sigmaPrev * k;

                var prevImage = list[list.Count - 1].GetMat();
                var currentImage = GaussBlur(prevImage, sigma0, sigmaCurrent);

                list.Add(new PyramidMat(currentImage, index, i + 1, sigmaCurrent, sigmaCurrent * (1 << index)));
                dogList.Add(Diff(currentImage, prevImage));

                sigmaPrev = sigmaCurrent;
            }

            pyramid.octaves.Add(index, list);
            pyramid.dog.Add(index, dogList);
        }
Ejemplo n.º 2
0
        public static Pyramid Build(Mat source, int layers, double sigma1, double sigma0)
        {
            if (sigma1 > sigma0)
                throw new ArgumentException("sigma1 must be <= sigma0");

            var image = GaussBlur(source, sigma1, sigma0);
            var pyramid = new Pyramid(sigma0, Depth, layers);
            var k = Math.Pow(2, 1D / layers);

            for (var i = 0; i < Depth; i++)
            {
                BuildOctave(pyramid, i, layers + Overlap, sigma0, k, image);
                var result = pyramid.octaves[i];

                if (i != Depth - 1)
                    image = Downscale(result[layers].GetMat());
            }

            return pyramid;
        }