예제 #1
0
        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();
            }));
        }
예제 #2
0
        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();
            }));
        }
예제 #3
0
        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;
                    }
                }
            }));
        }
예제 #4
0
 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);
 }