示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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));
        }
示例#5
0
        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);
                }
            }
        }
示例#6
0
        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);
        }
示例#7
0
        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
        }