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