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); }
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; }