public static List <List <PointD> > GetSparkles(List <double> input) { #region PreProcess // Dispersion List <double> disp = CurveProcessingTools.WindowDispersion(input, 50); //PlotData(disp, "DISPERSION", "DISPERSION"); // Average of dispersion List <double> dispAVGC = new List <double>(); dispAVGC = CurveProcessingTools.WindowAVGC(disp, 650); //PlotData(dispAVGC, "DISPERSION + AVGC", "DISPERSION_AvgC"); List <double> test = CurveProcessingTools.WindowAVGC(dispAVGC, 650); for (int i = 0; i < test.Count; i++) { test[i] = dispAVGC[i] - test[i]; } //PlotData(dispAVGC, test, "Comparison dispAVGC[i] - dispAVGC[i].Windows[800]", "Test"); //PlotData(disp, test, "Comparison disp and dispAVGC[i] - dispAVGC[i].Windows[800]", "Test2"); //PlotData(disp, dispAVGC, "Comparison disp and disp+avgc", "Disp_vs_dispavgc"); #endregion List <Point> SeparationPoints = GetSparkleSeparationPoints(disp, dispAVGC, input); List <List <PointD> > RawSparkles = GetSeparatedWords(SeparationPoints, input); List <List <PointD> > GoodSparkles = new List <List <PointD> >(); List <List <PointD> > BadSparkles = new List <List <PointD> >(); FiltrateSparkles(RawSparkles, input, out GoodSparkles, out BadSparkles); return(GoodSparkles); }
private static List <double> KillInclination(List <double> input) { ///Clear inclination List <double> AVG = CurveProcessingTools.WindowAVGC(input, 175); //PlotData(AVG, "AVG", "AVG"); // Find difference List <double> diff = new List <double>(); for (int i = 0; i < AVG.Count; i++) { diff.Add(input[i] - AVG[i]); } //PlotData(diff, "No Inclination", "No_Inclination"); // Smoothing List <double> minDiff = new List <double>(); minDiff.AddRange(diff); minDiff = CurveProcessingTools.WindowAVGC(minDiff, 15); //PlotData(minDiff, "Smooth No Inclination", "Smooth_No_Inclination"); // Remove lower than zero values double Min = minDiff.Min(); for (int i = 0; i < minDiff.Count; i++) { minDiff[i] -= Min; } //PlotData(minDiff, "No Inclination - Min", "No Inclination_Min"); return(minDiff); }
public SingleNeuron(int _ID, List <double> IntensityData) { ID = _ID; IntensityRawData = new List <double>(); IntensityRawData.AddRange(IntensityData); IntensityCleanData = CurveProcessingTools.ProcessCurve(IntensityData); AnalyseSignal(); IndexesToSepSparkles(); Patch = new Image <Gray, byte>(1, 1); Mask = new Image <Gray, byte>(1, 1); }
public SingleNeuron(int _ID, List <double> IntensityData, Image <Gray, Byte> _Patch) { if (_Patch == null) { throw new Exception("ERROR: Patch image is Null"); } ID = _ID; IntensityRawData = new List <double>(); IntensityRawData.AddRange(IntensityData); IntensityCleanData = CurveProcessingTools.ProcessCurve(IntensityData); AnalyseSignal(); IndexesToSepSparkles(); Patch = _Patch.Clone(); Mask = _Patch.ThresholdBinary(new Gray(1), new Gray(255)); }
private void SmoothSparkles() { double[] IntensityData = NeuronDataManager.Neurons[0].IntensityCleanData.ToArray(); int L = NeuronDataManager.Neurons[0].IntensityCleanData.Count; int N = NeuronDataManager.Neurons.Count; List <List <double> > AllData = GetNormalisedData(); GraphPane pane = ZDC_ColorMap.GraphPane; pane.CurveList.Clear(); pane.XAxis.Scale.Max = L + 50; PointPairList list; LineItem myCurve = new LineItem(""); myCurve.Line.Width = 1.0F; double lambda; List <double> tmpY; List <double> tmpX; for (int i = 0; i < NeuronDataManager.Neurons.Count; i++) { lambda = i * (740 - 380) / N + 380; for (int j = 0; j < NeuronDataManager.Neurons[i].Sparkles.Count; j++) { tmpY = new List <double>(); tmpX = new List <double>(); for (int k = 0; k < NeuronDataManager.Neurons[i].Sparkles[j].Count; k++) { tmpY.Add(NeuronDataManager.Neurons[i].Sparkles[j][k].Y); tmpX.Add(NeuronDataManager.Neurons[i].Sparkles[j][k].X); } myCurve = pane.AddCurve("", tmpX.ToArray(), tmpY.ToArray(), Color.Gray, SymbolType.None); tmpY = CurveProcessingTools.WindowAVGC(tmpY, 5); myCurve = pane.AddCurve("", tmpX.ToArray(), tmpY.ToArray(), Colors.waveToColor(lambda), SymbolType.None); } } }
public static List <double> ProcessCurve(List <double> input) { List <double> no_incline = new List <double>(); no_incline = KillInclination(input); // Smoothing List <double> minDiff = new List <double>(); minDiff.AddRange(input); minDiff = CurveProcessingTools.WindowAVGC(minDiff, 15); // moar beuty //PlotData(minDiff, "Smooth No Inclination", "Smooth_No_Inclination"); // Remove lower than zero values double Min = minDiff.Min(); for (int i = 0; i < minDiff.Count; i++) { minDiff[i] -= Min; } //PlotData(minDiff, "No Inclination - Min", "No Inclination_Min"); return(no_incline); }
public void AnalyseSignal() { SparkleIndexes = new List <double[]>(); double[] raw = _IntensityCleanData.ToArray(); _Average = new double[raw.Length]; _Sigma = new double[raw.Length]; _AveragePlusSigma = new double[raw.Length]; //1. Построим среднее _Average = CurveProcessingTools.WindowAVGC(_IntensityCleanData, windowWidth).ToArray(); //2. Построим сигму _Sigma = CurveProcessingTools.WindowDispersion(_Average.ToList(), windowWidth).ToArray(); //3. Построим среднее + 3.5 * сигма for (int i = 0; i < raw.Length; i++) { _AveragePlusSigma[i] = _Average[i] + 3.0 * _Sigma[i]; } //4. Найдем вспышки SparkleIndexes.Clear(); for (int i = 0; i < raw.Length;) { //идем по всему сигналу, если среднее + 3.5 сигма меньше основной кривой //начинамем поиск максимума, начальной и конечной точки if (_AveragePlusSigma[i] < raw[i]) { int left = i, right = i; // идем в право до уровня сигма while (right < raw.Length && _AveragePlusSigma[right] < raw[right]) { right++; } #region Уточнение границ // теперь left и right показывают индексные координаты точек на уровне пересечения с кривой уровня неслучайности. // найдем истинную левую граицу while (left > 5) { // будем сдвигаться влево //пока среднее от 4 точек до текущей не превысит её double sum = 0; for (int j = left - 5; j < left; j++) { sum += raw[j]; } sum /= 5; if (sum > raw[left]) { break; } else { left--; } } // найдем истинную правую границу while (right + 6 < raw.Length) { // будем сдвигаться вправо //пока среднее от 4 точек после текущей не превысит её List <double> sum = new List <double>();; for (int j = right + 1; j < right + 5; j++) { sum.Add(raw[j]); } if (sum.Average() > raw[right]) { break; } else { right++; } } // к этому моменту у нас есть координаты начала и конца события вспышки #endregion //найдем максимум светимости события вспышки. double max = double.MinValue; for (int j = left; j < right; j++) { if (raw[j] > max) { max = raw[j]; } } //если разница между уровнем отсечения в момент первого пересечения и максимумом существенна, добавим событие в список if (max > _AveragePlusSigma[i] + SigmaLevel[left]) { //if (max > 250) SparkleIndexes.Add(new double[2] { left, right }); } i = right + 1; continue; } i++; } // finish }