public static Image DrawTStatisticSpectrogramsOfSingleIndex(string key, LDSpectrogramRGB cs1, LDSpectrogramRGB cs2, double tStatThreshold) { var image1 = cs1.DrawGreyscaleSpectrogramOfIndex(key); var image2 = cs2.DrawGreyscaleSpectrogramOfIndex(key); if (image1 == null || image2 == null) { Console.WriteLine("WARNING: From method ColourSpectrogram.DrawTStatisticGreyscaleSpectrogramOfIndex()"); Console.WriteLine(" Null image returned with key: {0}", key); return(null); } //frame image 1 int nyquist = cs1.SampleRate / 2; int herzInterval = 1000; string title = $"{key} SPECTROGRAM for: {cs1.FileName}. (scale:hours x kHz)"; var titleBar = LDSpectrogramRGB.DrawTitleBarOfGrayScaleSpectrogram(title, image1.Width); image1 = LDSpectrogramRGB.FrameLDSpectrogram(image1, titleBar, cs1, nyquist, herzInterval); //frame image 2 title = $"{key} SPECTROGRAM for: {cs2.FileName}. (scale:hours x kHz)"; titleBar = LDSpectrogramRGB.DrawTitleBarOfGrayScaleSpectrogram(title, image2.Width); image2 = LDSpectrogramRGB.FrameLDSpectrogram(image2, titleBar, cs1, nyquist, herzInterval); //get matrices required to calculate matrix of t-statistics double[,] avg1 = cs1.GetSpectrogramMatrix(key); if (key.Equals("ENT")) { avg1 = MatrixTools.SubtractValuesFromOne(avg1); } double[,] std1 = cs1.GetStandarDeviationMatrix(key); double[,] avg2 = cs2.GetSpectrogramMatrix(key); if (key.Equals("ENT")) { avg2 = MatrixTools.SubtractValuesFromOne(avg2); } double[,] std2 = cs2.GetStandarDeviationMatrix(key); //draw a spectrogram of t-statistic values //double[,] tStatMatrix = SpectrogramDifference.GetTStatisticMatrix(avg1, std1, cs1.SampleCount, avg2, std2, cs2.SampleCount); //Image image3 = SpectrogramDifference.DrawTStatisticSpectrogram(tStatMatrix); //titleBar = SpectrogramDifference.DrawTitleBarOfTStatisticSpectrogram(cs1.BaseName, cs2.BaseName, image1.Width, titleHt); //image3 = ColourSpectrogram.FrameSpectrogram(image3, titleBar, minOffset, cs2.X_interval, cs2.Y_interval); //draw a difference spectrogram derived from by thresholding a t-statistic matrix var image4 = DrawDifferenceSpectrogramDerivedFromSingleTStatistic(key, cs1, cs2, tStatThreshold, ColourGain); title = string.Format("{0} DIFFERENCE SPECTROGRAM (thresholded by t-statistic={3}) for: {1} - {2}. (scale:hours x kHz)", key, cs1.FileName, cs2.FileName, tStatThreshold); titleBar = LDSpectrogramRGB.DrawTitleBarOfGrayScaleSpectrogram(title, image2.Width); image4 = LDSpectrogramRGB.FrameLDSpectrogram(image4, titleBar, cs2, nyquist, herzInterval); var combinedImage = ImageTools.CombineImagesVertically(image1, image2, image4); return(combinedImage); }
// ####################################################################################################################################### // ### ABOVE METHODS DRAW TIME GRID LINES ON SPECTROGRAMS #################################################################################### // ####################################################################################################################################### public static Image <Rgb24> GetImageFullyAnnotated(Image <Rgb24> image, string title, int[,] gridLineLocations, TimeSpan duration) { if (image == null) { throw new ArgumentNullException(nameof(image)); } FrequencyScale.DrawFrequencyLinesOnImage((Image <Rgb24>)image, gridLineLocations, includeLabels: true); var titleBar = LDSpectrogramRGB.DrawTitleBarOfGrayScaleSpectrogram(title, image.Width); var timeBmp = ImageTrack.DrawTimeTrack(duration, image.Width); var compositeImage = ImageTools.CombineImagesVertically(titleBar, timeBmp, image, timeBmp); return(compositeImage); }
public Image GetImageFullyAnnotated(Image image, string title, int[,] gridLineLocations) { if (image == null) { throw new ArgumentNullException(nameof(image)); } FrequencyScale.DrawFrequencyLinesOnImage((Bitmap)image, gridLineLocations, includeLabels: true); var titleBar = LDSpectrogramRGB.DrawTitleBarOfGrayScaleSpectrogram(title, image.Width); var timeBmp = ImageTrack.DrawTimeTrack(this.Duration, image.Width); var list = new List <Image> { titleBar, timeBmp, image, timeBmp }; var compositeImage = ImageTools.CombineImagesVertically(list); return(compositeImage); }
/// <summary> /// This method draws a spectrogram with other useful information attached. /// </summary> /// <param name="sonogram">of BaseSonogram class.</param> /// <param name="events">a list of acoustic events.</param> /// <param name="plots">a list of plots relevant to the spectrogram scores.</param> /// <param name="hits">not often used - can be null.</param> public static Image <Rgb24> GetSonogramPlusCharts( BaseSonogram sonogram, List <AcousticEvent> events, List <Plot> plots, double[,] hits) { var spectrogram = sonogram.GetImage(doHighlightSubband: false, add1KHzLines: true, doMelScale: false); Contract.RequiresNotNull(spectrogram, nameof(spectrogram)); var height = spectrogram.Height; var frameSize = sonogram.Configuration.WindowSize; // init with linear frequency scale and draw freq grid lines on image int hertzInterval = 1000; if (height < 200) { hertzInterval = 2000; } var freqScale = new FrequencyScale(sonogram.NyquistFrequency, frameSize, hertzInterval); FrequencyScale.DrawFrequencyLinesOnImage(spectrogram, freqScale.GridLineLocations, includeLabels: true); // draw event outlines onto spectrogram. if (events != null && events.Count > 0) { // set colour for the events foreach (AcousticEvent ev in events) { ev.BorderColour = AcousticEvent.DefaultBorderColor; ev.ScoreColour = AcousticEvent.DefaultScoreColor; ev.DrawEvent(spectrogram, sonogram.FramesPerSecond, sonogram.FBinWidth, height); } } // now add in hits to the spectrogram image. if (hits != null) { spectrogram = Image_MultiTrack.OverlayScoresAsRedTransparency(spectrogram, hits); // following line needs to be reworked if want to call OverlayRainbowTransparency(hits); //image.OverlayRainbowTransparency(hits); } int pixelWidth = spectrogram.Width; var titleBar = LDSpectrogramRGB.DrawTitleBarOfGrayScaleSpectrogram("TITLE", pixelWidth); var timeTrack = ImageTrack.DrawTimeTrack(sonogram.Duration, pixelWidth); var imageList = new List <Image <Rgb24> > { titleBar, timeTrack, spectrogram, timeTrack, }; if (plots != null) { foreach (var plot in plots) { // Next line assumes plot data normalised in 0,1 var plotImage = plot.DrawAnnotatedPlot(ImageTrack.DefaultHeight); // the following draws same plot without the title. //var plotImage = ImageTrack.DrawScoreArrayTrack(plot.data, plot.threshold, pixelWidth); imageList.Add(plotImage); } } var compositeImage = ImageTools.CombineImagesVertically(imageList); return(compositeImage); }
/// <summary> /// This method draws a spectrogram with other useful information attached. /// </summary> /// <param name="sonogram">of BaseSonogram class.</param> /// <param name="events">a list of acoustic events.</param> /// <param name="plots">a list of plots relevant to the spectrogram scores.</param> /// <param name="hits">not often used - can be null.</param> public static Image <Rgb24> GetSonogramPlusCharts( BaseSonogram sonogram, List <EventCommon> events, List <Plot> plots, double[,] hits) { var spectrogram = sonogram.GetImage(doHighlightSubband: false, add1KHzLines: true, doMelScale: false); Contract.RequiresNotNull(spectrogram, nameof(spectrogram)); var height = spectrogram.Height; var width = spectrogram.Width; var frameSize = sonogram.Configuration.WindowSize; //var segmentDuration = sonogram.Duration; var spectrogramDuration = width * sonogram.FrameStep; // init with linear frequency scale and draw freq grid lines on image int hertzInterval = 1000; if (height < 200) { hertzInterval = 2000; } var nyquist = sonogram.NyquistFrequency; var freqScale = new FrequencyScale(nyquist, frameSize, hertzInterval); FrequencyScale.DrawFrequencyLinesOnImage(spectrogram, freqScale.GridLineLocations, includeLabels: true); // draw event outlines onto spectrogram. if (events != null && events.Count > 0) { foreach (SpectralEvent ev in events) { var options = new EventRenderingOptions(new UnitConverters(ev.SegmentStartSeconds, spectrogramDuration, nyquist, width, height)); spectrogram.Mutate(x => ev.Draw(x, options)); } } // now add in hits to the spectrogram image. if (hits != null) { spectrogram = Image_MultiTrack.OverlayScoresAsRedTransparency(spectrogram, hits); } int pixelWidth = spectrogram.Width; var titleBar = LDSpectrogramRGB.DrawTitleBarOfGrayScaleSpectrogram("TITLE", pixelWidth); var timeTrack = ImageTrack.DrawTimeTrack(sonogram.Duration, pixelWidth); var imageList = new List <Image <Rgb24> > { titleBar, timeTrack, spectrogram, timeTrack, }; if (plots != null) { foreach (var plot in plots) { // Next line assumes plot data normalised in 0,1 var plotImage = plot.DrawAnnotatedPlot(ImageTrack.DefaultHeight); // the following draws same plot without the title. //var plotImage = ImageTrack.DrawScoreArrayTrack(plot.data, plot.threshold, pixelWidth); imageList.Add(plotImage); } } var compositeImage = ImageTools.CombineImagesVertically(imageList); return(compositeImage); }