public static void GetGlobalOtsuThreshold(double[,] inputMatrix, out byte[,] opByteMatrix, out double opThreshold, out Image <Rgb24> histogramImage) { if (inputMatrix == null) { throw new ArgumentNullException(nameof(inputMatrix)); } var normMatrix = MatrixTools.NormaliseInZeroOne(inputMatrix, out var min, out var max); var byteMatrix = MatrixTools.ConvertMatrixOfDouble2Byte(normMatrix); GetOtsuThreshold(byteMatrix, out opByteMatrix, out var threshold, out histogramImage); opThreshold = threshold / (double)byte.MaxValue; opThreshold = min + (opThreshold * (max - min)); }
// ################################# STATIC METHODS BELOW HERE ############################### public static Image DrawSpectrogramAnnotated(double[,] data, SpectrogramSettings config, SpectrogramAttributes attributes) { // normalise the data between 0 and 95th percentiles int binCount = 100; double min; double max; DataTools.MinMax(data, out min, out max); double binWidth = (max - min) / binCount; var histogram = Histogram.Histo(data, binCount, min, max, binWidth); int percentile = 95; int binId = Histogram.GetPercentileBin(histogram, percentile); double upperBound = min + (binId * percentile); var normedMatrix = MatrixTools.NormaliseInZeroOne(data, min, upperBound); /* * int minPercentile = 5; * int minBinId = Histogram.GetPercentileBin(histogram, minPercentile); * double lowerBound = min + (minBinId * minPercentile); * int maxPercentile = 95; * int maxBinId = Histogram.GetPercentileBin(histogram, maxPercentile); * double upperBound = min + (maxBinId * maxPercentile); * var normedMatrix = MatrixTools.NormaliseInZeroOne(data, lowerBound, upperBound); */ int nyquist = attributes.NyquistFrequency; int frameSize = config.WindowSize; // assuming linear frequency scale int finalBinCount = frameSize / 2; var scaleType = FreqScaleType.Linear; // if doing mel scale then if (config.DoMelScale) { finalBinCount = 256; //128; //512; // 256; // 100; // 40; // 200; // scaleType = FreqScaleType.Mel; } var freqScale = new FrequencyScale(scaleType, nyquist, frameSize, finalBinCount, hertzGridInterval: 1000); var image = SpectrogramTools.GetImage(normedMatrix, nyquist, config.DoMelScale); var annotatedImage = SpectrogramTools.GetImageFullyAnnotated(image, config.SourceFileName + ": " + scaleType.ToString(), freqScale.GridLineLocations, attributes.Duration); return(annotatedImage); }
/// <summary> /// Used to normalise a spectrogram in 0,1. /// </summary> /// <param name="matrix">the spectrogram data.</param> /// <param name="truncateMin">set all values above to 1.0.</param> /// <param name="truncateMax">set all values below to zero.</param> /// <param name="backgroundFilterCoeff">used to de-emphisize the background.</param> /// <returns>a normalised matrix of spectrogram data.</returns> public static double[,] NormaliseSpectrogramMatrix(double[,] matrix, double truncateMin, double truncateMax, double backgroundFilterCoeff) { double[,] m = MatrixTools.NormaliseInZeroOne(matrix, truncateMin, truncateMax); m = MatrixTools.FilterBackgroundValues(m, backgroundFilterCoeff); // to de-demphasize the background small values return(m); }
//############################################################################################################################################################ //############################################################################################################################################################ public static double[,] NormaliseSpectrogramMatrix(IndexProperties indexProperties, double[,] matrix, double backgroundFilterCoeff) { matrix = MatrixTools.NormaliseInZeroOne(matrix, indexProperties.NormMin, indexProperties.NormMax); matrix = MatrixTools.FilterBackgroundValues(matrix, backgroundFilterCoeff); // to de-demphasize the background small values return(matrix); }