示例#1
0
        public void PreviewSpectra(Spectra spectra)
        {
            btnMeasure.Enabled = true;
            picSpectra.Visible = true;
            lblSelectStarNote.Visible = false;

            int xOffset = spectra.ZeroOrderPixelNo - 10;
            float xCoeff = picSpectra.Width * 1.0f / spectra.Points.Count;
            float colorCoeff = 255.0f / spectra.MaxSpectraValue;

            using (Graphics g = Graphics.FromImage(picSpectra.Image))
            {
                foreach (SpectraPoint point in spectra.Points)
                {
                    byte clr = (byte)(Math.Min(255, Math.Max(0, Math.Round(point.RawValue * colorCoeff))));
                    float x = xCoeff * (point.PixelNo - xOffset);
                    if (x >= 0)
                    {
                        g.DrawLine(m_GreyPens[clr], x, 0, x, picSpectra.Width);
                    }
                }

                g.Save();
            }

            picSpectra.Invalidate();
        }
示例#2
0
 public void PopulateWaveLengths(Spectra spectra)
 {
     foreach (SpectraPoint point in spectra.Points)
     {
         point.Wavelength = ResolveWavelength(point.PixelNo);
     }
 }
        private void frmRunMultiFrameSpectroscopy_Load(object sender, EventArgs e)
        {
            IImagePixel starCenter = m_VideoOperation.SelectedStar;
            m_SpectraReader = new SpectraReader(m_AstroImage, m_VideoOperation.SelectedStarBestAngle, 1);
            m_Spectra = m_SpectraReader.ReadSpectra((float)starCenter.XDouble, (float)starCenter.YDouble, (int)nudAreaWing.Value, (int)nudBackgroundWing.Value, (int)nudBackgroundGap.Value, PixelCombineMethod.Average);

            m_Mapper = new RotationMapper(m_AstroImage.Width, m_AstroImage.Height, m_VideoOperation.SelectedStarBestAngle);

            uint[,] pixels = m_AstroImage.GetMeasurableAreaPixels(starCenter.X, starCenter.Y, 35);
            m_ZeroOrderPsf = new PSFFit(starCenter.X, starCenter.Y);
            m_ZeroOrderPsf.Fit(pixels);
            m_Spectra.ZeroOrderFWHM = (float)m_ZeroOrderPsf.FWHM;

            PlotMeasurementAreas();
            PlotAlignTarget();

            nudDivisor.SetNUDValue((decimal)m_AstroImage.Pixelmap.MaxSignalValue);
            nudMultiplier.Value = 1024;
        }
示例#4
0
        public Spectra ReadSpectra(float x0, float y0, int halfWidth, int bgHalfWidth, int bgGap, PixelCombineMethod bgMethod)
        {
            var rv = new Spectra()
            {
                SignalAreaWidth         = 2 * halfWidth,
                BackgroundAreaHalfWidth = bgHalfWidth,
                BackgroundAreaGap       = bgGap,
                MaxPixelValue           = m_Image.Pixelmap.MaxSignalValue
            };

            int xFrom = int.MaxValue;
            int xTo   = int.MinValue;

            // Find the destination pixel range at the destination horizontal
            PointF p1 = m_Mapper.GetDestCoords(x0, y0);

            rv.ZeroOrderPixelNo = (int)Math.Round(p1.X);

            for (float x = p1.X - m_Mapper.MaxDestDiagonal; x < p1.X + m_Mapper.MaxDestDiagonal; x++)
            {
                PointF p = m_Mapper.GetSourceCoords(x, p1.Y);
                if (m_SourceVideoFrame.Contains(p))
                {
                    int xx = (int)x;

                    if (xx < xFrom)
                    {
                        xFrom = xx;
                    }
                    if (xx > xTo)
                    {
                        xTo = xx;
                    }
                }
            }

            m_BgValues     = new float[xTo - xFrom + 1];
            m_BgPixelCount = new uint[xTo - xFrom + 1];
            m_BgValuesList = new List <float> [xTo - xFrom + 1];
            rv.InitialisePixelArray(xTo - xFrom + 1);

            // Get all readings in the range
            for (int x = xFrom; x <= xTo; x++)
            {
                var point = new SpectraPoint();
                point.PixelNo             = x;
                point.RawSignalPixelCount = 0;

                for (int z = -halfWidth; z <= halfWidth; z++)
                {
                    PointF p  = m_Mapper.GetSourceCoords(x, p1.Y + z);
                    int    xx = (int)Math.Round(p.X);
                    int    yy = (int)Math.Round(p.Y);

                    if (m_SourceVideoFrame.Contains(xx, yy))
                    {
                        float sum       = 0;
                        int   numPoints = 0;
                        for (float kx = -0.4f; kx < 0.5f; kx += 0.2f)
                        {
                            for (float ky = -0.4f; ky < 0.5f; ky += 0.2f)
                            {
                                p = m_Mapper.GetSourceCoords(x + kx, p1.Y + ky + z);
                                int xxx = (int)Math.Round(p.X);
                                int yyy = (int)Math.Round(p.Y);
                                if (m_SourceVideoFrame.Contains(xxx, yyy))
                                {
                                    sum += (m_Image.Pixelmap[xxx, yyy] * m_PixelValueCoeff);
                                    numPoints++;
                                }
                            }
                        }
                        float destPixVal = (sum / numPoints);
                        point.RawValue += destPixVal;
                        point.RawSignalPixelCount++;
                        rv.Pixels[x - xFrom, z + bgHalfWidth + bgGap + halfWidth - 1] = destPixVal;
                    }
                }

                point.RawSignal = point.RawValue;
                rv.Points.Add(point);

                #region Reads background
                if (bgMethod == PixelCombineMethod.Average)
                {
                    ReadAverageBackgroundForPixelIndex(halfWidth, bgHalfWidth, bgGap, x, p1.Y, x - xFrom);
                }
                else if (bgMethod == PixelCombineMethod.Median)
                {
                    ReadMedianBackgroundForPixelIndex(halfWidth, bgHalfWidth, bgGap, x, p1.Y, x - xFrom);
                }
                #endregion
            }

            // Apply background
            for (int i = 0; i < rv.Points.Count; i++)
            {
                SpectraPoint point = rv.Points[i];

                if (bgMethod == PixelCombineMethod.Average)
                {
                    point.RawBackgroundPerPixel = GetAverageBackgroundValue(point.PixelNo, xFrom, xTo, bgHalfWidth);
                }
                else if (bgMethod == PixelCombineMethod.Median)
                {
                    point.RawBackgroundPerPixel = GetMedianBackgroundValue(point.PixelNo, xFrom, xTo, bgHalfWidth);
                }

                for (int z = -halfWidth - bgGap - bgHalfWidth + 1; z < -halfWidth - bgGap; z++)
                {
                    rv.Pixels[i, z + bgHalfWidth + bgGap + halfWidth - 1] = point.RawBackgroundPerPixel;
                }

                for (int z = halfWidth + bgGap + 1; z < halfWidth + bgGap + bgHalfWidth + 1; z++)
                {
                    rv.Pixels[i, z + bgHalfWidth + bgGap + halfWidth - 1] = point.RawBackgroundPerPixel;
                }

                point.RawValue -= point.RawBackgroundPerPixel * point.RawSignalPixelCount;

                if (point.RawValue < 0 && !TangraConfig.Settings.Spectroscopy.AllowNegativeValues)
                {
                    point.RawValue = 0;
                }
            }

            rv.MaxSpectraValue = (uint)Math.Ceiling(rv.Points.Where(x => x.PixelNo > rv.ZeroOrderPixelNo + 20).Select(x => x.RawValue).Max());

            return(rv);
        }
示例#5
0
        public void WriteTo(BinaryWriter writer)
        {
            writer.Write(SERIALIZATION_VERSION);

            writer.Write(CombinedMeasurements);
            writer.Write(SignalAreaWidth);
            writer.Write(MaxPixelValue);
            writer.Write(MaxSpectraValue);
            writer.Write(ZeroOrderPixelNo);

            writer.Write(Points.Count);
            foreach (var spectraPoint in Points)
            {
                spectraPoint.WriteTo(writer);
            }

            int width  = Pixels.GetLength(0);
            int height = Pixels.GetLength(1);

            writer.Write(width);
            writer.Write(height);
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    writer.Write(Pixels[x, y]);
                }
            }

            MeasurementInfo.WriteTo(writer);

            if (Calibration == null)
            {
                writer.Write(false);
            }
            else
            {
                writer.Write(true);
                Calibration.WriteTo(writer);
            }

            writer.Write(RawMeasurements.Count);
            for (int i = 0; i < RawMeasurements.Count; i++)
            {
                Spectra frameSpectra = RawMeasurements[i];

                writer.Write(frameSpectra.SignalAreaWidth);
                writer.Write(frameSpectra.MaxPixelValue);
                writer.Write(frameSpectra.MaxSpectraValue);
                writer.Write(frameSpectra.ZeroOrderPixelNo);
                writer.Write(frameSpectra.ZeroOrderFWHM); // Version 2 Property

                writer.Write(frameSpectra.Points.Count);
                foreach (var spectraPoint in frameSpectra.Points)
                {
                    spectraPoint.WriteTo(writer);
                }
            }

            ProcessingInfo.WriteTo(writer);
            ObservationInfo.WriteTo(writer);

            // Version 2 Properties
            writer.Write(ZeroOrderFWHM);
        }
示例#6
0
        public MasterSpectra(BinaryReader reader)
        {
            int version = reader.ReadInt32();

            CombinedMeasurements = reader.ReadInt32();
            SignalAreaWidth      = reader.ReadInt32();
            MaxPixelValue        = reader.ReadUInt32();
            MaxSpectraValue      = reader.ReadUInt32();
            ZeroOrderPixelNo     = reader.ReadInt32();

            int pixelsCount = reader.ReadInt32();

            Points = new List <SpectraPoint>();
            for (int i = 0; i < pixelsCount; i++)
            {
                var point = new SpectraPoint(reader);
                Points.Add(point);
            }

            int width  = reader.ReadInt32();
            int height = reader.ReadInt32();

            Pixels = new float[width, height];
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    Pixels[x, y] = reader.ReadSingle();
                }
            }

            MeasurementInfo = new MeasurementInfo(reader);
            if (reader.ReadBoolean())
            {
                Calibration = new SpectraCalibration(reader);
            }

            int rawFramesCount = reader.ReadInt32();

            for (int i = 0; i < rawFramesCount; i++)
            {
                var frameMeasurement = new Spectra();
                RawMeasurements.Add(frameMeasurement);

                frameMeasurement.SignalAreaWidth  = reader.ReadInt32();
                frameMeasurement.MaxPixelValue    = reader.ReadUInt32();
                frameMeasurement.MaxSpectraValue  = reader.ReadUInt32();
                frameMeasurement.ZeroOrderPixelNo = reader.ReadInt32();

                frameMeasurement.ZeroOrderFWHM = float.NaN;
                if (version > 1)
                {
                    frameMeasurement.ZeroOrderFWHM = reader.ReadSingle();
                }

                int frameMeaCount = reader.ReadInt32();

                for (int j = 0; j < frameMeaCount; j++)
                {
                    var point = new SpectraPoint(reader);
                    frameMeasurement.Points.Add(point);
                }
            }

            ProcessingInfo  = new ProcessingInfo(reader);
            ObservationInfo = new ObservationInfo(reader);

            ZeroOrderFWHM = float.NaN;
            if (version > 1)
            {
                ZeroOrderFWHM = reader.ReadSingle();
            }
        }
示例#7
0
        public Spectra ReadSpectra(float x0, float y0, int halfWidth, int bgHalfWidth, int bgGap, PixelCombineMethod bgMethod)
        {
            var rv = new Spectra()
            {
                SignalAreaWidth = 2 * halfWidth,
                BackgroundAreaHalfWidth = bgHalfWidth,
                BackgroundAreaGap = bgGap,
                MaxPixelValue = m_Image.Pixelmap.MaxSignalValue
            };

            int xFrom = int.MaxValue;
            int xTo = int.MinValue;

            // Find the destination pixel range at the destination horizontal
            PointF p1 = m_Mapper.GetDestCoords(x0, y0);
            rv.ZeroOrderPixelNo = (int)Math.Round(p1.X);

            for (float x = p1.X - m_Mapper.MaxDestDiagonal; x < p1.X + m_Mapper.MaxDestDiagonal; x++)
            {
                PointF p = m_Mapper.GetSourceCoords(x, p1.Y);
                if (m_SourceVideoFrame.Contains(p))
                {
                    int xx = (int) x;

                    if (xx < xFrom) xFrom = xx;
                    if (xx > xTo) xTo = xx;
                }
            }

            m_BgValues = new float[xTo - xFrom + 1];
            m_BgPixelCount = new uint[xTo - xFrom + 1];
            m_BgValuesList = new List<float>[xTo - xFrom + 1];
            rv.InitialisePixelArray(xTo - xFrom + 1);

            // Get all readings in the range
            for (int x = xFrom; x <= xTo; x++)
            {
                var point = new SpectraPoint();
                point.PixelNo = x;
                point.RawSignalPixelCount = 0;

                for (int z = -halfWidth; z <= halfWidth; z++)
                {
                    PointF p = m_Mapper.GetSourceCoords(x, p1.Y +z);
                    int xx = (int)Math.Round(p.X);
                    int yy = (int)Math.Round(p.Y);

                    if (m_SourceVideoFrame.Contains(xx, yy))
                    {
                        float sum = 0;
                        int numPoints = 0;
                        for (float kx = -0.4f; kx < 0.5f; kx+=0.2f)
                        for (float ky = -0.4f; ky < 0.5f; ky += 0.2f)
                        {
                            p = m_Mapper.GetSourceCoords(x + kx, p1.Y + ky + z);
                            int xxx = (int)Math.Round(p.X);
                            int yyy = (int)Math.Round(p.Y);
                            if (m_SourceVideoFrame.Contains(xxx, yyy))
                            {
                                sum += (m_Image.Pixelmap[xxx, yyy] * m_PixelValueCoeff);
                                numPoints++;
                            }
                        }
                        float destPixVal = (sum/numPoints);
                        point.RawValue += destPixVal;
                        point.RawSignalPixelCount++;
                        rv.Pixels[x - xFrom, z + bgHalfWidth + bgGap + halfWidth - 1] = destPixVal;
                    }
                }

                point.RawSignal = point.RawValue;
                rv.Points.Add(point);

                #region Reads background
                if (bgMethod == PixelCombineMethod.Average)
                {
                    ReadAverageBackgroundForPixelIndex(halfWidth, bgHalfWidth, bgGap, x, p1.Y, x - xFrom);
                }
                else if (bgMethod == PixelCombineMethod.Median)
                {
                    ReadMedianBackgroundForPixelIndex(halfWidth, bgHalfWidth, bgGap, x, p1.Y, x - xFrom);
                }
                #endregion
            }

            // Apply background
            for (int i = 0; i < rv.Points.Count; i++)
            {
                SpectraPoint point = rv.Points[i];

                if (bgMethod == PixelCombineMethod.Average)
                {
                    point.RawBackgroundPerPixel = GetAverageBackgroundValue(point.PixelNo, xFrom, xTo, bgHalfWidth);
                }
                else if (bgMethod == PixelCombineMethod.Median)
                {
                    point.RawBackgroundPerPixel = GetMedianBackgroundValue(point.PixelNo, xFrom, xTo, bgHalfWidth);
                }

                for (int z = -halfWidth - bgGap - bgHalfWidth + 1; z < -halfWidth - bgGap; z++)
                    rv.Pixels[i, z + bgHalfWidth + bgGap + halfWidth - 1] = point.RawBackgroundPerPixel;

                for (int z = halfWidth + bgGap + 1; z < halfWidth + bgGap + bgHalfWidth + 1; z++)
                    rv.Pixels[i, z + bgHalfWidth + bgGap + halfWidth - 1] = point.RawBackgroundPerPixel;

                point.RawValue -= point.RawBackgroundPerPixel * point.RawSignalPixelCount;

                if (point.RawValue < 0 && !TangraConfig.Settings.Spectroscopy.AllowNegativeValues)
                    point.RawValue = 0;
            }

            rv.MaxSpectraValue = (uint)Math.Ceiling(rv.Points.Where(x => x.PixelNo > rv.ZeroOrderPixelNo + 20).Select(x => x.RawValue).Max());

            return rv;
        }
示例#8
0
        public MasterSpectra(BinaryReader reader)
        {
            int version = reader.ReadInt32();

            CombinedMeasurements = reader.ReadInt32();
            SignalAreaWidth = reader.ReadInt32();
            MaxPixelValue = reader.ReadUInt32();
            MaxSpectraValue = reader.ReadUInt32();
            ZeroOrderPixelNo = reader.ReadInt32();

            int pixelsCount = reader.ReadInt32();
            Points = new List<SpectraPoint>();
            for (int i = 0; i < pixelsCount; i++)
            {
                var point = new SpectraPoint(reader);
                Points.Add(point);
            }

            int width = reader.ReadInt32();
            int height = reader.ReadInt32();
            Pixels = new float[width,height];
            for (int x = 0; x < width; x++)
            for (int y = 0; y < height; y++)
            {
                Pixels[x, y] = reader.ReadSingle();
            }

            MeasurementInfo = new MeasurementInfo(reader);
            if (reader.ReadBoolean())
                Calibration = new SpectraCalibration(reader);

            int rawFramesCount = reader.ReadInt32();
            for (int i = 0; i < rawFramesCount; i++)
            {
                var frameMeasurement = new Spectra();
                RawMeasurements.Add(frameMeasurement);

                frameMeasurement.SignalAreaWidth = reader.ReadInt32();
                frameMeasurement.MaxPixelValue = reader.ReadUInt32();
                frameMeasurement.MaxSpectraValue = reader.ReadUInt32();
                frameMeasurement.ZeroOrderPixelNo = reader.ReadInt32();

                frameMeasurement.ZeroOrderFWHM = float.NaN;
                if (version > 1)
                {
                    frameMeasurement.ZeroOrderFWHM = reader.ReadSingle();
                }

                int frameMeaCount = reader.ReadInt32();

                for (int j = 0; j < frameMeaCount; j++)
                {
                    var point = new SpectraPoint(reader);
                    frameMeasurement.Points.Add(point);
                }
            }

            ProcessingInfo = new ProcessingInfo(reader);
            ObservationInfo = new ObservationInfo(reader);

            ZeroOrderFWHM = float.NaN;
            if (version > 1)
            {
                ZeroOrderFWHM = reader.ReadSingle();
            }
        }