private Task InitCells(IImageFeatureExtractor featureExtractor) { return(Task.Run(() => { _completedCells = new Image[GridSize.Height, GridSize.Width]; _targetCellFeatures = new IImageFeatureSet[GridSize.Height, GridSize.Width]; // subdivide the target image into grid of (rows x cols) cells and extract features for each var resizedTarget = ImageUtils.MakeGrayscale(new Bitmap(2, 2, PixelFormat.Format24bppRgb), TargetImageSize); using (var g = Graphics.FromImage(resizedTarget)) { g.DrawImage(TargetImage, 0, 0, TargetImageSize.Width, TargetImageSize.Height); } for (int r = 0; r < GridSize.Height; r++) { for (int c = 0; c < GridSize.Width; c++) { var imageRect = new Rectangle(new Point(CellSize.Width * c, CellSize.Height * r), CellSize); var cellImage = resizedTarget.Clone(imageRect, PixelFormat.Format24bppRgb); _targetCellFeatures[r, c] = featureExtractor.ExtractFeatures(cellImage); } } resizedTarget.Dispose(); })); }
public Task <Image> Build(IImageSource imageSource, IImageFeatureExtractor featureExtractor, CancellationToken cancelToken) { return(Task.Run(async() => { await InitCells(featureExtractor); await AssignImagesToCells(imageSource, featureExtractor, cancelToken); return await CreateCompletedImage(); })); }
private Task AssignImagesToCells(IImageSource imageSource, IImageFeatureExtractor featureExtractor, CancellationToken cancelToken) { var remainingCells = (from R in Enumerable.Range(0, GridSize.Height) from C in Enumerable.Range(0, GridSize.Width) select new { R, C, Target = GetTargetCell(R, C) }).ToArray(); return(Task.Run(async() => { while (!cancelToken.IsCancellationRequested) { if (IsComplete) { System.Console.WriteLine("Mosaic is complete!"); break; } var nextImage = await imageSource.GetNextImage(cancelToken); if (nextImage != null) { System.Console.WriteLine($"Attempting to match image {nextImage.Id} with remaining {remainingCells.Count()} cells..."); var nextImageReduced = ImageUtils.MakeGrayscale(nextImage.RawImage, CellSize); var features = featureExtractor.ExtractFeatures(nextImageReduced); remainingCells = remainingCells.Where(c => GetCompletedCell(c.R, c.C) == null).ToArray(); foreach (var cell in remainingCells.Where(c => features.IsMatch(c.Target))) { SetCompletedCell(cell.R, cell.C, nextImageReduced); System.Console.WriteLine($" MATCH: '{nextImage.Id}' --> cell r:{cell.R}, c:{cell.C}"); } nextImage.RawImage.Dispose(); } else { // hacky, fix this up System.Console.WriteLine("ERROR: Failed to retreive any images, quitting..."); break; } } })); }
Create <TExtractor, TClustering>(IImageFeatureExtractor <FeatureDescriptor> detector, TClustering clustering) where TClustering : IUnsupervisedLearning <IClassifier <double[], int>, double[], int> { return(new BagOfVisualWords <FeatureDescriptor, double[], TClustering, IImageFeatureExtractor <FeatureDescriptor> >(detector, clustering)); }
/// <summary> /// Constructs a new <see cref="BagOfVisualWords"/>. /// </summary> /// /// <param name="extractor">The feature extractor to use.</param> /// <param name="algorithm">The clustering algorithm to use.</param> /// public BagOfVisualWords(IImageFeatureExtractor <TPoint> extractor, //IClusteringAlgorithm<double[]> IUnsupervisedLearning <IClassifier <double[], int>, double[], int> algorithm) { base.Init(extractor, algorithm); }
/// <summary> /// Constructs a new <see cref="BagOfVisualWords"/>. /// </summary> /// /// <param name="extractor">The feature extractor to use.</param> /// <param name="numberOfWords">The number of codewords.</param> /// public BagOfVisualWords(IImageFeatureExtractor <TPoint> extractor, int numberOfWords) { base.Init(extractor, BagOfWords.GetDefaultClusteringAlgorithm(numberOfWords)); }
/// <summary> /// Constructs a new <see cref="BagOfVisualWords"/>. /// </summary> /// /// <param name="extractor">The feature extractor to use.</param> /// <param name="algorithm">The clustering algorithm to use.</param> /// public BagOfVisualWords(IImageFeatureExtractor <TPoint> extractor, IUnsupervisedLearning <IClassifier <TFeature, int>, TFeature, int> algorithm) { Init(extractor, algorithm); }