/// <summary> /// This method compares the acoustic indices derived from two different long duration recordings of the same length. /// It takes as input any number of csv files of acoustic indices in spectrogram columns. /// Typically there will be at least three indices csv files for each of the original recordings to be compared. /// The method produces four spectrogram image files: /// 1) A negative false-color spectrogram derived from the indices of recording 1. /// 2) A negative false-color spectrogram derived from the indices of recording 2. /// 3) A spectrogram of euclidean distances between the two input files. /// 4) The above three spectrograms combined in one image. /// </summary> public static void DrawDistanceSpectrogram( DirectoryInfo inputDirectory, FileInfo inputFileName1, FileInfo inputFileName2, DirectoryInfo outputDirectory) { // PARAMETERS string outputFileName1 = inputFileName1.Name; var cs1 = new LDSpectrogramRGB(minuteOffset, xScale, sampleRate, frameWidth, colorMap); cs1.ColorMode = colorMap; cs1.BackgroundFilter = backgroundFilterCoeff; string[] keys = colorMap.Split('-'); cs1.ReadCsvFiles(inputDirectory, inputFileName1.Name, keys); double blueEnhanceParameter = 0.0; cs1.DrawNegativeFalseColorSpectrogram(outputDirectory, outputFileName1, blueEnhanceParameter); string imagePath = Path.Combine(outputDirectory.FullName, outputFileName1 + ".COLNEG.png"); var spg1Image = Image.Load <Rgb24>(imagePath); if (spg1Image == null) { LoggedConsole.WriteLine("SPECTROGRAM IMAGE DOES NOT EXIST: {0}", imagePath); return; } int nyquist = cs1.SampleRate / 2; int hertzInterval = 1000; string title = $"FALSE COLOUR SPECTROGRAM: {inputFileName1}. (scale:hours x kHz) (colour: R-G-B={cs1.ColorMode})"; var titleBar = LDSpectrogramRGB.DrawTitleBarOfFalseColourSpectrogram(title, spg1Image.Width); spg1Image = LDSpectrogramRGB.FrameLDSpectrogram( spg1Image, titleBar, cs1, nyquist, hertzInterval); string outputFileName2 = inputFileName2.Name; var cs2 = new LDSpectrogramRGB(minuteOffset, xScale, sampleRate, frameWidth, colorMap) { ColorMode = colorMap, BackgroundFilter = backgroundFilterCoeff, }; cs2.ReadCsvFiles(inputDirectory, inputFileName2.Name, keys); // cs2.DrawGreyScaleSpectrograms(opdir, opFileName2); cs2.DrawNegativeFalseColorSpectrogram(outputDirectory, outputFileName2, blueEnhanceParameter); imagePath = Path.Combine(outputDirectory.FullName, outputFileName2 + ".COLNEG.png"); var spg2Image = Image.Load <Rgb24>(imagePath); if (spg2Image == null) { LoggedConsole.WriteLine("SPECTROGRAM IMAGE DOES NOT EXIST: {0}", imagePath); return; } title = $"FALSE COLOUR SPECTROGRAM: {inputFileName2}. (scale:hours x kHz) (colour: R-G-B={cs2.ColorMode})"; titleBar = LDSpectrogramRGB.DrawTitleBarOfFalseColourSpectrogram(title, spg2Image.Width); spg2Image = LDSpectrogramRGB.FrameLDSpectrogram( spg2Image, titleBar, cs1, nyquist, hertzInterval); string outputFileName4 = inputFileName1 + ".EuclideanDistance.png"; var deltaSp = DrawDistanceSpectrogram(cs1, cs2); Color[] colorArray = LDSpectrogramRGB.ColourChart2Array(GetDifferenceColourChart()); titleBar = DrawTitleBarOfEuclidianDistanceSpectrogram( inputFileName1.Name, inputFileName2.Name, colorArray, deltaSp.Width, SpectrogramConstants.HEIGHT_OF_TITLE_BAR); deltaSp = LDSpectrogramRGB.FrameLDSpectrogram(deltaSp, titleBar, cs2, nyquist, hertzInterval); deltaSp.Save(Path.Combine(outputDirectory.FullName, outputFileName4)); string outputFileName5 = inputFileName1 + ".2SpectrogramsAndDistance.png"; var combinedImage = ImageTools.CombineImagesVertically(spg1Image, spg2Image, deltaSp); combinedImage.Save(Path.Combine(outputDirectory.FullName, outputFileName5)); }