/// <summary> /// Must be run at end of slice selection algorithm. /// </summary> /// <param name="imagesAndHistogram"></param> /// <param name="utilities"></param> public static unsafe void ShowSliceSelectionDebugImage(ImagesAndHistogram imagesAndHistogram, ThumbnailGeneratorUtilities utilities) { var edgeImage = imagesAndHistogram.EdgeImage; var edgeDensityHistogram = imagesAndHistogram.EdgeDensityHistogram; DrawHistogram(edgeImage, edgeDensityHistogram); DrawVerticalLine(edgeImage, edgeDensityHistogram.Median, 254); DrawVerticalLine(edgeImage, (int)edgeDensityHistogram.Mean, 253); DrawVerticalLine(edgeImage, (int)(edgeDensityHistogram.Median - edgeDensityHistogram.StdDev), 252); DrawVerticalLine(edgeImage, (int)(edgeDensityHistogram.Median + edgeDensityHistogram.StdDev), 252); var resultAspect = 16.0 / 10.0; var sliceCount = 4; var sliceAspect = resultAspect / sliceCount; var desiredWidth = (int)(edgeImage.Height * sliceAspect); var range = utilities.GetRangeOfWidth(edgeDensityHistogram, desiredWidth); DrawVerticalLine(edgeImage, range.Min, 250); DrawVerticalLine(edgeImage, range.Max, 250); ShowImage(edgeImage); Application.Run(); }
public List <Bitmap> PickSlices(IReadOnlyList <Bitmap> inputImages, Size sliceSize) { var edgeImages = inputImages.Select(grayscaleFilter.Apply).ToList(); edgeImages.ForEach(edgeDetectionFilter.ApplyInPlace); var edgeDensityHistograms = edgeImages.Select(x => new HorizontalIntensityStatistics(x).Gray).ToList(); var imagesAndHistograms = Enumerable.Range(0, inputImages.Count).Select(index => { return(new ImagesAndHistogram { OriginalImage = inputImages[index], EdgeImage = edgeImages[index], EdgeDensityHistogram = edgeDensityHistograms[index], Rating = ratingCalculator.ComputeRating(inputImages[index], edgeDensityHistograms[index], sliceSize.Width, sliceSize.Height) }); }).OrderBy(x => x.Rating).ToList(); var sliceAspect = sliceSize.Width / (double)sliceSize.Height; foreach (var imagesAndHistogram in imagesAndHistograms) { var desiredWidth = (int)(imagesAndHistogram.OriginalImage.Height * sliceAspect); if (desiredWidth > imagesAndHistogram.OriginalImage.Width) { continue; } var range = thumbnailGeneratorUtilities.GetRangeOfWidth(imagesAndHistogram.EdgeDensityHistogram, desiredWidth); var horizontalCrop = new Crop(new Rectangle(range.Min, 0, range.Max - range.Min, imagesAndHistogram.OriginalImage.Height)).Apply(imagesAndHistogram.OriginalImage); var horizontalCrop24bpp = horizontalCrop.Clone(new Rectangle(Point.Empty, horizontalCrop.Size), PixelFormat.Format24bppRgb); imagesAndHistogram.SliceImage = horizontalCrop24bpp; var resizer = new ResizeBicubic(sliceSize.Width, sliceSize.Height); imagesAndHistogram.SliceImageResized = resizer.Apply(horizontalCrop24bpp); } return(imagesAndHistograms.Where(x => x.SliceImageResized != null).Select(x => x.SliceImageResized).ToList()); }