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(); }
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; }
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); }
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); }
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(); } }
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; }
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(); } }