protected override void OnValidate(Image3D image) { base.OnValidate(image); Window.MaxIntensity = image.Maximum; Window.MinIntensity = image.Minimum; }
protected override void OnValidate(Image3D image) { if (image.LengthZ != 1) { throw new LogException("can only render Images with exactly one slice"); } Window.MaxIntensity = image.Maximum; Window.MinIntensity = image.Minimum; }
protected override void OnRenderPixel(Image3D image, DisplayImage display, int x, int y) { double mipValue = double.MinValue; for (int z = image.LengthZ - 1; z >= 0; z--) { mipValue = Math.Max(mipValue, image[x, y, z]); } display.SetPixel(x, y, Window.GetColor(mipValue)); }
protected override void OnRenderPixel(Image3D image, DisplayImage display, int x, int y) { var voxelColor = Colors.Black; for (int z = image.LengthZ - 1; z >= 0; z--) { var color = tf.GetColor(image[x, y, z]); voxelColor = ColorHelper.BlendAlpha(color, voxelColor); } display.SetPixel(x, y, voxelColor); }
protected override Image3D OnProcess(Image3D image, Progress progress) { if (activated) { return base.OnProcess(image, progress); } else { progress.Done(); return image; } }
public void UpdateImageSize(int x, int y) { if (x == 0 || y == 0) { return; } Image1D?.Dispose(); Image1D = new EditBitmap(x, y, PixelFormats.Bgr24); Image2D?.Dispose(); Image2D = new EditBitmap(x, y, PixelFormats.Bgr24); Image3D?.Dispose(); Image3D = new EditBitmap(x, y, PixelFormats.Bgr24); Redraw(); }
protected override Image3D OnProcess(Image3D image, Progress progress) { if (activated) { if (image.LengthX < 3 || image.LengthY < 3 || image.LengthZ < 3) { throw new LogException("3D Filter need 3 slices minimum"); } return base.OnProcess(image, progress); } else { progress.Done(); return image; } }
public void FromImage(Image3D image) { if (image.LengthZ <= 25) { // full image for (int z = 0; z < image.LengthZ; z++) { HistogramFromSlice(image, z); } } else { int delta = image.LengthZ / 25; // from 25 slices for (int z = 0; z < image.LengthZ; z += delta) { HistogramFromSlice(image, z); } } }
public double FilterPixel(int x, int y, int z, Image3D image) { if (Activated) { double[,] area = image.GetArea(x, y, z, xCount, yCount); double sum = 0; for (int i = 0; i < yCount; i++) { for (int j = 0; j < xCount; j++) { sum += area[j, i] * filter[j, i]; } } return sum / divider; } return image[x, y, z]; }
public NSBTX(File f) { this.f = f; data = f.getContents(); str = new ByteArrayInputStream(data); //look for TEX0 block //ugly, but i'm lazy to implement it properly. bool found = false; int blockStart = 0; while (str.lengthAvailable(4)) { uint v = str.readUInt(); if (v == 0x30584554) // "TEX0" { str.setOrigin(str.getPos() - 4); blockStart = (int)(str.getPos() - 4); found = true; break; } // else // str.skipback(3); //just in case its not word-aligned } str.seek(0); if (!found) { textures = new PalettedImage[0]; palettes = new PaletteDef[0]; MessageBox.Show("This model file doesn't contain any valid texture data.", "NSMBe5.3", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } Console.Out.WriteLine("\n"); //Read stuff str.seek(0x14); texDataOffset = str.readInt() + blockStart; Console.Out.WriteLine("Texdata " + texDataOffset.ToString("X8")); str.seek(0x24); f5texDataOffset = str.readInt() + blockStart; Console.Out.WriteLine("f5Texdata " + f5texDataOffset.ToString("X8")); f5dataOffset = str.readInt() + blockStart; Console.Out.WriteLine("f5data " + f5dataOffset.ToString("X8")); str.seek(0x30); palDataSize = str.readInt() * 8; Console.Out.WriteLine("paldata size " + palDataSize.ToString("X8")); str.seek(0x34); palDefOffset = str.readInt(); Console.Out.WriteLine("paldef " + palDefOffset.ToString("X8")); palDataOffset = str.readInt(); Console.Out.WriteLine("paldata " + palDataOffset.ToString("X8")); //Read texture definitions str.seek(0x3D); textures = new PalettedImage[str.readByte()]; str.skip((uint)(0xE + textures.Length * 4)); ImageManagerWindow mgr = new ImageManagerWindow(); mgr.Text = string.Format(LanguageManager.Get("ImageManager", "textureTitle"), f.name); bool hasFormat5 = false; for (int i = 0; i < textures.Length; i++) { int offset = 8 * str.readUShort(); ushort param = str.readUShort(); int format = (param >> 10) & 7; if (format == 5) { offset += f5texDataOffset; } else { offset += texDataOffset; } int width = 8 << ((param >> 4) & 7); int height = 8 << ((param >> 7) & 7); bool color0 = ((param >> 13) & 1) != 0; str.readUInt(); // unused int size = width * height * Image3D.bpps[format] / 8; //Console.Out.WriteLine(offset.ToString("X8") + " " + format + " " + width + "x" + height + " " + color0 + " LZ"); InlineFile mainfile = new InlineFile(f, offset, size, Image3D.formatNames[format]); if (format == 5) { hasFormat5 = true; int f5size = (width * height) / 16 * 2; InlineFile f5file = new InlineFile(f, f5dataOffset, f5size, Image3D.formatNames[format]); f5dataOffset += f5size; textures[i] = new Image3Dformat5(mainfile, f5file, width, height); } else { textures[i] = new Image3D(mainfile, color0, width, height, format); } // textures[i] = new Texture(this, color0, width, height, format, offset, ""); /* if (format == 5) * { * textures[i].f5DataOffset = f5dataOffset; * f5dataOffset += (uint)(width * height) / 16 * 2; * }*/ } for (int i = 0; i < textures.Length; i++) { if (textures[i] == null) { continue; } textures[i].name = str.ReadString(16); mgr.m.addImage(textures[i]); } //Read palette definitions str.seek(palDefOffset + 1); palettes = new PaletteDef[str.readByte()]; str.skip((uint)(0xE + palettes.Length * 4)); for (int i = 0; i < palettes.Length; i++) { int offset = 8 * str.readUShort() + palDataOffset + blockStart; str.readUShort(); palettes[i] = new PaletteDef(); palettes[i].offs = offset; } Array.Sort(palettes); for (int i = 0; i < palettes.Length; i++) { palettes[i].name = str.ReadString(16); if (i != palettes.Length - 1) { palettes[i].size = palettes[i + 1].offs - palettes[i].offs; } } palettes[palettes.Length - 1].size = blockStart + palDataOffset + palDataSize - palettes[palettes.Length - 1].offs; for (int i = 0; i < palettes.Length; i++) { if (hasFormat5) { FilePalette pa = new FilePalette(new InlineFile(f, palettes[i].offs, palettes[i].size, palettes[i].name)); mgr.m.addPalette(pa); } else { int extrapalcount = (palettes[i].size) / 512; for (int j = 0; j < extrapalcount; j++) { FilePalette pa = new FilePalette(new InlineFile(f, palettes[i].offs + j * 512, 512, palettes[i].name + ":" + j)); mgr.m.addPalette(pa); } int lastsize = palettes[i].size % 512; if (lastsize != 0) { FilePalette pa = new FilePalette(new InlineFile(f, palettes[i].offs + extrapalcount * 512, lastsize, palettes[i].name + ":" + extrapalcount)); mgr.m.addPalette(pa); } } } mgr.Show(); // new ImagePreviewer(textures[0].render(palettes[0])).Show(); }
private void createReportToolStripMenuItem_Click(object sender, EventArgs e) { ListView.SelectedIndexCollection indexes = this.listViewHeap.SelectedIndices; if (indexes.Count == 0) { return; } else { Image3D Result = new Image3D(((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Width, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Height, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Depth, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).NumBands); ReportWriter rw = new ReportWriter(); rw.create("tellme.xml"); rw.setInfo("First Report", "Don't know name", "Description", 5, 100); int indexesCount = indexes.Count; for (int i = 0; i < indexesCount; i++) { Image3D TmpIm = ((Image3D)(this.listViewHeap.Items[indexes[i]].Tag)); rw.addThumbnailImage(TmpIm, "Test" + i, "", "essai"); //rw.addThumbnailImage(TmpIm, "Test"+i, TmpIm.Name, "essai"); } rw.close(); } }
private void CreateNewImage(int DimX, int DimY, int DimZ, int Channel, float Value) { Image3D UnitImage = new Image3D(DimX, DimY, DimZ, Channel); for (int TmpChannel = 0; TmpChannel < UnitImage.NumBands; TmpChannel++) { for (int ijk = 0; ijk < UnitImage.ImageSize; ijk++) UnitImage.Data[TmpChannel][ijk] = Value; } //UnitImage.Name = "Unit Image"; AddImageToHeap(UnitImage, 0); }
private float[] ComputeSimpleStationarity(Image3D Input, out float Std, int NumIter, int NumPoint) { float[] Table = new float[NumIter]; float[] TmpTable = new float[NumPoint]; Random r = new Random(); for (int Iter = 0; Iter < NumIter; Iter++) { for (int RandIdx = 0; RandIdx < NumPoint; RandIdx++) { TmpTable[RandIdx] = Input.Data[0][(int)r.Next(0, Input.ImageSize)]; } Table[Iter] = new IM.Library.Mathematics.MathTools().Mean(TmpTable); } Std = new IM.Library.Mathematics.MathTools().Std(Table); return Table; }
private void uniformNoiseToolStripMenuItem_Click(object sender, EventArgs e) { RequestForNoise RQuest = new RequestForNoise(); RQuest.Text = "Uniform Noise"; RQuest.label1.Text = "Min."; RQuest.label2.Text = "Max."; if (RQuest.ShowDialog() != DialogResult.OK) { return; } ListView.SelectedIndexCollection indexes = this.listViewHeap.SelectedIndices; if (indexes.Count == 0) return; Image3D Result = new Image3D(((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Width, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Height, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Depth, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).NumBands); Random r = new Random(); float RandVal = 0.0f; float Range = (float)RQuest.numericUpDownGaussianNoiseStdv.Value - (float)RQuest.numericUpDownGaussianNoiseMean.Value; int indexesCount = indexes.Count; for (int i = 0; i < indexesCount; i++) { Image3D TmpIm = ((Image3D)(this.listViewHeap.Items[indexes[i]].Tag)); for (int Band = 0; Band < TmpIm.NumBands; Band++) { Array.Copy(TmpIm.Data[Band], Result.Data[Band], TmpIm.ImageSize); for (int idx = 0; idx < Result.ImageSize; idx++) { RandVal = Range * (float)r.NextDouble() + (float)RQuest.numericUpDownGaussianNoiseMean.Value; Result.Data[Band][idx] += RandVal; } } //Result.Name = "Sqrt result"; AddImageToHeap(Result, 0); } indexes.Clear(); }
protected override void OnValidate(Image3D image) { base.OnValidate(image); tf = tfBuilder.CreateTransferFunction(); }
protected override void OnProcess3D(Image3D imageIn, Image3D imageOut, int x, int y, int z) { imageOut[x, y, z] = FilterPixel(x, y, z, imageIn); }
private void sphereToolStripMenuItem_Click(object sender, EventArgs e) { ListView.SelectedIndexCollection indexes = this.listViewHeap.SelectedIndices; if (indexes.Count > 1) { MessageBox.Show("Too many images selected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } FormForSphere WindowForSphere = new FormForSphere(); WindowForSphere.numericUpDownPosX.Value = ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Width / 2; WindowForSphere.numericUpDownPosY.Value = ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Height / 2; WindowForSphere.numericUpDownPosZ.Value = ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Depth / 2; if (WindowForSphere.ShowDialog() != DialogResult.OK) { return; } double CenterX = (double)WindowForSphere.numericUpDownPosX.Value; double CenterY = (double)WindowForSphere.numericUpDownPosY.Value; double CenterZ = (double)WindowForSphere.numericUpDownPosZ.Value; double DistMax = (double)WindowForSphere.numericUpDownRadius.Value; float NewIntensity = (float)WindowForSphere.numericUpDownIntensity.Value; Image3D UnitImage = new Image3D(((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Width, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Height, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Depth, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).NumBands); Image3D TmpIm = (Image3D)(this.listViewHeap.Items[indexes[0]].Tag); for (int Band = 0; Band < TmpIm.NumBands; Band++) { Array.Copy(TmpIm.Data[Band], UnitImage.Data[Band], UnitImage.ImageSize); for (int z = 0; z < UnitImage.Depth; z++) for (int y = 0; y < UnitImage.Height; y++) for (int x = 0; x < UnitImage.Width; x++) { double Dist = Math.Sqrt((z - CenterZ) * (z - CenterZ) + (y - CenterY) * (y - CenterY) + (x - CenterX) * (x - CenterX)); if (Dist < DistMax) UnitImage.Data[Band][x + y * UnitImage.Width + z * UnitImage.ScanSliceSize] += NewIntensity; } } AddImageToHeap(UnitImage, 0); indexes.Clear(); }
private void sqrtToolStripMenuItem1_Click(object sender, EventArgs e) { ListView.SelectedIndexCollection indexes = this.listViewHeap.SelectedIndices; if (indexes.Count == 0) return; Image3D Result = new Image3D(((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Width, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Height, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Depth, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).NumBands); int indexesCount = indexes.Count; for (int i = 0; i < indexesCount; i++) { Image3D TmpIm = ((Image3D)(this.listViewHeap.Items[indexes[i]].Tag)); new IM.Library.Mathematics.MathTools().Pow(ref Result, TmpIm, 0.5f); //Result.Name = "Sqrt result"; AddImageToHeap(Result, 0); } indexes.Clear(); }
private void addToolStripMenuItem_Click(object sender, EventArgs e) { ListView.SelectedIndexCollection indexes = this.listViewHeap.SelectedIndices; if (indexes.Count == 0) return; if (indexes.Count == 1) return; if (CheckDimensions() == false) { MessageBox.Show("Image dimensions do not match", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (CheckChannelCompatibility() == false) { MessageBox.Show("Number of channel does not match", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } Image3D Result = new Image3D(((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Width, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Height, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Depth, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).NumBands); for (int channel = 0; channel < Result.NumBands; channel++) Array.Copy(((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Data[channel], Result.Data[channel], Result.ImageSize); int indexesCount = indexes.Count; for (int i = 1; i < indexesCount; i++) { Image3D TmpIm = ((Image3D)(this.listViewHeap.Items[indexes[i]].Tag)); new IM.Library.Mathematics.MathTools().Add(ref Result, Result, TmpIm); } // Result.Name = "Addition result"; AddImageToHeap(Result, 0); indexes.Clear(); }
private void vectorFieldToolStripMenuItem_Click(object sender, EventArgs e) { ListView.SelectedIndexCollection indexes = this.listViewHeap.SelectedIndices; if (indexes.Count != 2) { MessageBox.Show("This operation requires 2 images", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } int indexesCount = indexes.Count; if (CheckDimensions() == false) { MessageBox.Show("Image dimensions do not match", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } request RQuest = new request(); Control[] ButtonControl = RQuest.Controls.Find("buttonCreateGrid", false); ButtonControl[0].Text = "Create Field"; if (RQuest.ShowDialog() != DialogResult.OK) { return; } Image3D VectorField = new Image3D(((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Width, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Height, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Depth, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).NumBands); new IM.Library.Tools.Drawing().VectorField2D((Image3D)(this.listViewHeap.Items[indexes[0]].Tag), 0, (Image3D)(this.listViewHeap.Items[indexes[1]].Tag), 0, VectorField, 0, 0.5f, (int)RQuest.numericUpDownGridSizeValue); Sequence NewSeq = new Sequence(); NewSeq.Add(VectorField); IMGlobal.AddSequence(NewSeq, "Vector field"); }
private string UpdateInfoPicture(Image3D ImageToProcess) { string textBoxInfoPictureText; if (ImageToProcess == null) { textBoxInfoPicture.Text = "No picture selected"; textBoxImageName.Enabled = false; numericUpDownChannelForHisto.Enabled = false; radioButtonHistoTypeClassic.Enabled = false; radioButtonHistoTypeCumulated.Enabled = false; UpdateHisto(null, 0); return ""; } textBoxImageName.Enabled = true; //textBoxImageName.Text = ImageToProcess.Name; textBoxInfoPictureText = "Width : " + ImageToProcess.Width.ToString() + "\r\n"; textBoxInfoPictureText += "Height : " + ImageToProcess.Height.ToString() + "\r\n"; textBoxInfoPictureText += "Depth : " + ImageToProcess.Depth.ToString() + "\r\n"; textBoxInfoPictureText += "Number of channels : " + ImageToProcess.NumBands.ToString() + "\r\n"; textBoxInfoPictureText += "X Scale : " + ImageToProcess.XResolution + "\r\n"; textBoxInfoPictureText += "Y Scale : " + ImageToProcess.YResolution + "\r\n"; textBoxInfoPictureText += "Z Scale : " + ImageToProcess.ZResolution + "\r\n"; float TmpValue; for (int channel = 0; channel < ImageToProcess.NumBands; channel++) { textBoxInfoPictureText += "----------------------\r\n"; textBoxInfoPictureText += "Channel " + channel.ToString() + "\r\n"; float minValue = new IM.Library.Mathematics.MathTools().Min(ImageToProcess.Data[channel]); textBoxInfoPictureText += "Min : " + minValue.ToString() + "\r\n"; float maxValue = new IM.Library.Mathematics.MathTools().Max(ImageToProcess.Data[channel]); textBoxInfoPictureText += "Max : " + maxValue.ToString() + "\r\n"; TmpValue = new IM.Library.Mathematics.MathTools().Mean(ImageToProcess.Data[channel]); textBoxInfoPictureText += "Mean : " + TmpValue.ToString() + "\r\n"; TmpValue = new IM.Library.Mathematics.MathTools().Std(ImageToProcess.Data[channel]); textBoxInfoPictureText += "Std : " + TmpValue.ToString() + "\r\n"; TmpValue = new IM.Library.Mathematics.MathTools().MAD(ImageToProcess.Data[channel], true); textBoxInfoPictureText += "MAD : " + TmpValue.ToString() + "\r\n"; TmpValue = new IM.Library.Mathematics.MathTools().Median(ImageToProcess.Data[channel], 0, ImageToProcess.ImageSize - 1); textBoxInfoPictureText += "Median : " + TmpValue.ToString() + "\r\n"; TmpValue = new IM.Library.Mathematics.MathTools().Skew(ImageToProcess.Data[channel]); textBoxInfoPictureText += "Skewness : " + TmpValue.ToString() + "\r\n"; TmpValue = new IM.Library.Mathematics.MathTools().Kurt(ImageToProcess.Data[channel]); textBoxInfoPictureText += "Kurtosis : " + TmpValue.ToString() + "\r\n"; } UpdateHisto(ImageToProcess, (int)numericUpDownChannelForHisto.Value); textBoxInfoPicture.Text = textBoxInfoPictureText; return textBoxInfoPictureText; }
private void UpdateImageResolution() { ListView.SelectedIndexCollection indexes = this.listViewHeap.SelectedIndices; if (indexes.Count == 0) return; Image3D Result = new Image3D(((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Width, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Height, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Depth, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).NumBands); int indexesCount = indexes.Count; for (int i = 0; i < indexesCount; i++) { Image3D TmpIm = ((Image3D)(this.listViewHeap.Items[indexes[i]].Tag)); TmpIm.XResolution = (double)numericUpDownXRes.Value; TmpIm.YResolution = (double)numericUpDownYRes.Value; TmpIm.ZResolution = (double)numericUpDownZRes.Value; } indexes.Clear(); }
private void sMLToolStripMenuItem_Click(object sender, EventArgs e) { ListView.SelectedIndexCollection indexes = this.listViewHeap.SelectedIndices; if (indexes.Count == 0) return; float Smoothness; int indexesCount = indexes.Count; Image3D CurrentIM = ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)); for (int i = 0; i < indexesCount; i++) { Image3D ResIm = new Image3D(CurrentIM.Width, CurrentIM.Height, CurrentIM.Depth, CurrentIM.NumBands); for (int Channel = 0; Channel < CurrentIM.NumBands; Channel++) { new IM.Library.Filtering.Focus().SML_3D(CurrentIM, Channel, ResIm, Channel, 3, true); } for (int Channel = 0; Channel < CurrentIM.NumBands; Channel++) { float ResSML = 0.0f; for (int Pix = 0; Pix < ResIm.ImageSize; Pix++) { ResSML += ResIm.Data[Channel][Pix]; } Console.WriteLine("SML band " + Channel + " = " + ResSML); } } }
private void sightToolStripMenuItem_Click(object sender, EventArgs e) { request RQuest = new request(); if (RQuest.ShowDialog() != DialogResult.OK) { return; } ListView.SelectedIndexCollection indexes = this.listViewHeap.SelectedIndices; if (indexes.Count != 1) return; // first of all, copy the current sequence Image3D SightIm = new Image3D(((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Width, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Height, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Depth, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).NumBands); //int Channel = 0; PointF StartPt = new PointF(); PointF EndPt = new PointF(); for (int TmpChannel = 0; TmpChannel < SightIm.NumBands; TmpChannel++) { for (int j = 0; j < SightIm.Height; j += (int)RQuest.numericUpDownGridSizeValue) { StartPt.X = 0.0f; StartPt.Y = j; EndPt.X = SightIm.Width; EndPt.Y = j; new IM.Library.Tools.Drawing().Draw_Line2D(SightIm, TmpChannel, StartPt, EndPt, 255.0f); } for (int i = 0; i < SightIm.Width; i += (int)RQuest.numericUpDownGridSizeValue) { StartPt.X = i; StartPt.Y = 0.0f; EndPt.X = i; EndPt.Y = SightIm.Height; new IM.Library.Tools.Drawing().Draw_Line2D(SightIm, TmpChannel, StartPt, EndPt, 255.0f); } } //UnitImage.Name = "Unit Image"; AddImageToHeap(SightIm, 0); indexes.Clear(); }
/// <summary> /// Merge by channels /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void channelToolStripMenuItem_Click(object sender, EventArgs e) { ListView.SelectedIndexCollection indexes = this.listViewHeap.SelectedIndices; if (indexes.Count == 0) return; if (indexes.Count == 1) return; int NewBandNumber = 0; int PrevSizeX = ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Width; int PrevSizeY = ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Height; int PrevSizeZ = ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Depth; int indexesCount = indexes.Count; for (int i = 0; i < indexesCount; i++) { NewBandNumber += ((Image3D)(this.listViewHeap.Items[indexes[i]].Tag)).NumBands; } //if (NewBandNumber > 3) //{ // MessageBox.Show("Too many channels to merge", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); // return; //} if (CheckDimensions() == false) { MessageBox.Show("Image dimensions do not match", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } // first of all, copy the current sequence Image3D MergedImage = new Image3D(PrevSizeX, PrevSizeY, PrevSizeZ, NewBandNumber); int Channel = 0; for (int T = 0; T < indexesCount; T++) { Image3D TmpIm = ((Image3D)(this.listViewHeap.Items[indexes[T]].Tag)); for (int TmpChannel = 0; TmpChannel < TmpIm.NumBands; Channel++, TmpChannel++) Array.Copy(TmpIm.Data[TmpChannel], MergedImage.Data[Channel], MergedImage.Data[0].Length); } //MergedImage.Name = "Merged picture"; AddImageToHeap(MergedImage, 0); indexes.Clear(); }
private void poissonToolStripMenuItem_Click(object sender, EventArgs e) { ListView.SelectedIndexCollection indexes = this.listViewHeap.SelectedIndices; if (indexes.Count == 0) return; Image3D Result = new Image3D(((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Width, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Height, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Depth, ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).NumBands); int indexesCount = indexes.Count; for (int i = 0; i < indexesCount; i++) { Image3D TmpIm = ((Image3D)(this.listViewHeap.Items[indexes[i]].Tag)); for (int Band = 0; Band < TmpIm.NumBands; Band++) { Array.Copy(TmpIm.Data[Band], Result.Data[Band], TmpIm.ImageSize); } // numericUpDownGaussMeanValue IM.Library.Tools.PoissonNoiseGenerator PoissonNoise = new IM.Library.Tools.PoissonNoiseGenerator(12); PoissonNoise.Disturb(Result); //Result.Name = "Sqrt result"; AddImageToHeap(Result, 0); } indexes.Clear(); }
private float[] ComputePseudoMonteCarloStatioUnderPoissonNoiseByEmpiricalModeDecomp(Image3D Input, out float Mean, out float Std, int StartIter, int EndIter) { float[] Table = new float[EndIter - StartIter + 1]; Random r = new Random(); for (int Iter = StartIter; Iter <= EndIter; Iter++) { float[] TmpTable = new float[Iter]; for (int RandIdx = 0; RandIdx < Iter; RandIdx++) { TmpTable[RandIdx] = Input.Data[0][(int)r.Next(0, Input.ImageSize)]; } Table[Iter - StartIter] = new IM.Library.Mathematics.MathTools().Mean(TmpTable); } Mean = new IM.Library.Mathematics.MathTools().Mean(Table); Std = new IM.Library.Mathematics.MathTools().Std(Table); return Table; }
private void anscombeToolStripMenuItem_Click(object sender, EventArgs e) { ListView.SelectedIndexCollection indexes = this.listViewHeap.SelectedIndices; if (indexes.Count == 0) return; //Image3D Result = new Image3D(((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Width, // ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Height, // ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Depth, // ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).NumBands); int indexesCount = indexes.Count; for (int i = 0; i < indexesCount; i++) { int NumChannel = ((Image3D)(this.listViewHeap.Items[indexes[i]].Tag)).NumBands; Image3D Result = new Image3D(((Image3D)(this.listViewHeap.Items[indexes[i]].Tag)).Width, ((Image3D)(this.listViewHeap.Items[indexes[i]].Tag)).Height, ((Image3D)(this.listViewHeap.Items[indexes[i]].Tag)).Depth, NumChannel); Image3D TmpIm = ((Image3D)(this.listViewHeap.Items[indexes[i]].Tag)); for (int Band = 0; Band < NumChannel; Band++) new IM.Library.Mathematics.MathTools().AnscombeTransform(TmpIm.Data[Band], ref Result.Data[Band]); AddImageToHeap(Result, 0); } indexes.Clear(); }
private void stationirToolStripMenuItem_Click(object sender, EventArgs e) { ListView.SelectedIndexCollection indexes = this.listViewHeap.SelectedIndices; if (indexes.Count == 0) return; float Mean, Std; int indexesCount = indexes.Count; int NumIter = 100; for (int i = 0; i < indexesCount; i++) { Image3D TmpIm = ((Image3D)(this.listViewHeap.Items[indexes[i]].Tag)); int StartIter = 30; int EndIter = TmpIm.ImageSize / 100; Image3D ResImage = new Image3D(EndIter - StartIter + 1, 1, 1, 1); // ResImage.Data[0] = ComputePseudoMonteCarloStatioUnderPoissonNoiseByEmpiricalModeDecomp(TmpIm,out Mean, out Std, NumIter); ResImage.Data[0] = ComputePseudoMonteCarloStatioUnderPoissonNoiseByEmpiricalModeDecomp(TmpIm, out Mean, out Std, StartIter, EndIter); new IM.Library.IO.DataToTextWriter().WriteInColumn(ResImage.Data[0], "D:\\resStation" + i, true); //Sequence TmpSeq = new Sequence(); //TmpSeq.Add(ResImage); //IMGlobal.AddSequence(TmpSeq); } }
protected override void OnRenderPixel(Image3D image, DisplayImage display, int x, int y) { var voxel = image[x, y, 0]; display.SetPixel(x, y, Window.GetColor(voxel)); }
private void centralGradientToolStripMenuItem_Click(object sender, EventArgs e) { ListView.SelectedIndexCollection indexes = this.listViewHeap.SelectedIndices; if (indexes.Count > 1) { MessageBox.Show("Too many images selected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } int DimX = 24; int DimY = 16; int DimZ = 1; int Band = 1; float Value = 1.0f; if (indexes.Count == 1) { DimX = ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Width; DimY = ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Height; DimZ = ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).Depth; Band = ((Image3D)(this.listViewHeap.Items[indexes[0]].Tag)).NumBands; } RequestImage RQuest = new RequestImage(); //RQuest.ShowDialog(); Control[] ButtonControl = RQuest.Controls.Find("numericUpDownDimX", false); NumericUpDown TmpNum = (NumericUpDown)ButtonControl[0]; TmpNum.Value = DimX; ButtonControl = RQuest.Controls.Find("numericUpDownDimY", false); TmpNum = (NumericUpDown)ButtonControl[0]; TmpNum.Value = DimY; ButtonControl = RQuest.Controls.Find("numericUpDownDimZ", false); TmpNum = (NumericUpDown)ButtonControl[0]; TmpNum.Value = DimZ; ButtonControl = RQuest.Controls.Find("numericUpDownBand", false); TmpNum = (NumericUpDown)ButtonControl[0]; TmpNum.Value = Band; ButtonControl = RQuest.Controls.Find("numericUpDownIntensity", false); TmpNum = (NumericUpDown)ButtonControl[0]; TmpNum.Value = (decimal)Value; if (RQuest.ShowDialog() != DialogResult.OK) { return; } Image3D UnitImage = new Image3D(DimX, DimY, DimZ, 1); for (int j = 0; j < UnitImage.Height; j++) { for (int i = 0; i < UnitImage.Width; i++) { UnitImage.Data[0][i + j * UnitImage.Width] = Value * (float)Math.Sqrt((i - DimX / 2.0f) * (i - DimX / 2.0f) + (j - DimY / 2.0f) * (j - DimY / 2.0f)); } } //UnitImage.Name = "Unit Image"; AddImageToHeap(UnitImage, 0); indexes.Clear(); }
public NSBTX(File f) { this.f = f; data = f.getContents(); str = new ByteArrayInputStream(data); bool LZd = false; if (str.readUInt() == 0x37375A4C) //LZ77 { byte[] ndata = new byte[data.Length - 4]; Array.Copy(data, 4, ndata, 0, ndata.Length); data = ROM.LZ77_Decompress(ndata); str = new ByteArrayInputStream(data); LZd = true; } //look for TEX0 block //ugly, but i'm lazy to implement it properly. bool found = false; int blockStart = 0; while (str.lengthAvailable(4)) { uint v = str.readUInt(); if (v == 0x30584554) // "TEX0" { str.setOrigin(str.getPos() - 4); blockStart = (int)(str.getPos() - 4); found = true; startoffset = (int)str.getPos() - 4; break; } // else // str.skipback(3); //just in case its not word-aligned } str.seek(0); if (!found) { textures = new PalettedImage[0]; palettes = new PaletteDef[0]; return; } Console.Out.WriteLine("\n"); //Read stuff str.seek(0x14); texDataOffset = str.readInt() + blockStart; Console.Out.WriteLine("Texdata " + texDataOffset.ToString("X8")); str.seek(0x24); f5texDataOffset = str.readInt() + blockStart; Console.Out.WriteLine("f5Texdata " + f5texDataOffset.ToString("X8")); f5dataOffset = str.readInt() + blockStart; Console.Out.WriteLine("f5data " + f5dataOffset.ToString("X8")); str.seek(0x30); palDataSize = str.readInt() * 8; Console.Out.WriteLine("paldata size " + palDataSize.ToString("X8")); str.seek(0x34); palDefOffset = str.readInt(); Console.Out.WriteLine("paldef " + palDefOffset.ToString("X8")); palDataOffset = str.readInt(); Console.Out.WriteLine("paldata " + palDataOffset.ToString("X8")); //Read texture definitions str.seek(0x3D); textures = new PalettedImage[str.readByte()]; str.skip((uint)(0xE + textures.Length * 4)); //ImageManagerWindow mgr = new ImageManagerWindow(); //mgr.Text = f.name + " - Texture Editor"; bool hasFormat5 = false; for (int i = 0; i < textures.Length; i++) { int offset = 8 * str.readUShort(); ushort param = str.readUShort(); int format = (param >> 10) & 7; if (format == 5) { offset += f5texDataOffset; } else { offset += texDataOffset; } int width = 8 << ((param >> 4) & 7); int height = 8 << ((param >> 7) & 7); bool color0 = ((param >> 13) & 1) != 0; str.readUInt(); // unused int size = width * height * Image3D.bpps[format] / 8; Console.Out.WriteLine(offset.ToString("X8") + " " + format + " " + width + "x" + height + " " + color0 + " LZ" + LZd); InlineFile mainfile = new InlineFile(f, offset, size, Image3D.formatNames[format], null, LZd ? InlineFile.CompressionType.LZWithHeaderComp : InlineFile.CompressionType.NoComp); if (format == 5) { hasFormat5 = true; int f5size = (width * height) / 16 * 2; InlineFile f5file = new InlineFile(f, f5dataOffset, f5size, Image3D.formatNames[format], null, LZd ? InlineFile.CompressionType.LZWithHeaderComp : InlineFile.CompressionType.NoComp); f5dataOffset += f5size; textures[i] = new Image3Dformat5(mainfile, f5file, width, height); } else { textures[i] = new Image3D(mainfile, color0, width, height, format, offset); } // textures[i] = new Texture(this, color0, width, height, format, offset, ""); /* if (format == 5) * { * textures[i].f5DataOffset = f5dataOffset; * f5dataOffset += (uint)(width * height) / 16 * 2; * }*/ } for (int i = 0; i < textures.Length; i++) { if (textures[i] == null) { continue; } textures[i].name = str.ReadString(16); //mgr.m.addImage(textures[i]); } //Read palette definitions str.seek(palDefOffset + 1); palettes = new PaletteDef[str.readByte()]; str.skip((uint)(0xE + palettes.Length * 4)); for (int i = 0; i < palettes.Length; i++) { int offset = 8 * str.readUShort() + palDataOffset + blockStart; str.readUShort(); palettes[i] = new PaletteDef(); palettes[i].offs = offset; } Array.Sort(palettes); for (int i = 0; i < palettes.Length; i++) { palettes[i].name = str.ReadString(16); if (i != palettes.Length - 1) { palettes[i].size = palettes[i + 1].offs - palettes[i].offs; } } palettes[palettes.Length - 1].size = blockStart + palDataOffset + palDataSize - palettes[palettes.Length - 1].offs; for (int i = 0; i < palettes.Length; i++) { if (hasFormat5) { FilePalette pa = new FilePalette(new InlineFile(f, palettes[i].offs, palettes[i].size, palettes[i].name, null, LZd ? InlineFile.CompressionType.LZWithHeaderComp : InlineFile.CompressionType.NoComp)); pal.Add((NSMBe4.Palette)pa); //mgr.m.addPalette(pa); } else { int extrapalcount = (palettes[i].size) / 512; for (int j = 0; j < extrapalcount; j++) { FilePalette pa = new FilePalette(new InlineFile(f, palettes[i].offs + j * 512, 512, palettes[i].name + ":" + j, null, LZd ? InlineFile.CompressionType.LZWithHeaderComp : InlineFile.CompressionType.NoComp)); pal.Add((NSMBe4.Palette)pa); //mgr.m.addPalette(pa); } int lastsize = palettes[i].size % 512; if (lastsize != 0) { FilePalette pa = new FilePalette(new InlineFile(f, palettes[i].offs + extrapalcount * 512, lastsize, palettes[i].name + ":" + extrapalcount, null, LZd ? InlineFile.CompressionType.LZWithHeaderComp : InlineFile.CompressionType.NoComp)); pal.Add((NSMBe4.Palette)pa); //mgr.m.addPalette(pa); } } } //mgr.Show(); // new ImagePreviewer(textures[0].render(palettes[0])).Show(); }
private void channelToolStripMenuItem1_Click(object sender, EventArgs e) { ListView.SelectedIndexCollection indexes = this.listViewHeap.SelectedIndices; if (indexes.Count == 0) return; int indexesCount = indexes.Count; int count = 0; for (int i = 0; i < indexesCount; i++) { Image3D TmpIm = ((Image3D)(this.listViewHeap.Items[indexes[i]].Tag)); int ChannelNumber = TmpIm.NumBands; for (int indexIm = 0; indexIm < ChannelNumber; indexIm++) { Image3D Result = new Image3D(TmpIm.Width, TmpIm.Height, TmpIm.Depth, 1); //Result.Name = "Channel split" + count.ToString(); count++; Array.Copy(TmpIm.Data[indexIm], Result.Data[0], Result.ImageSize); AddImageToHeap(Result, 0); } } indexes.Clear(); }