public cFeedBackMessage Run(c3DNewWorld _3DWorld) { if (base.Start() == false) { base.FeedBackMessage.IsSucceed = false; return base.FeedBackMessage; } #region Properties Management object _firstValue = base.ListProperties.FindByName("Thresold"); double Thresold = 0.5; if (_firstValue == null) { base.GenerateError("-Thresold- not found !"); return base.FeedBackMessage; } try { cProperty TmpProp = (cProperty)_firstValue; Thresold = (double)TmpProp.GetValue(); } catch (Exception) { base.GenerateError("-Thresold- cast didn't work"); return base.FeedBackMessage; } _firstValue = base.ListProperties.FindByName("Split objects ?"); bool IsSplit = false; if (_firstValue == null) { base.GenerateError("-Split objects ?- not found !"); return base.FeedBackMessage; } try { cProperty TmpProp = (cProperty)_firstValue; IsSplit = (bool)TmpProp.GetValue(); } catch (Exception) { base.GenerateError("-Split objects ?- cast didn't work"); return base.FeedBackMessage; } #endregion ListObjects = new cListGeometric3DObject(""); if (IsSplit == false) { c3DMeshObject MyMesh = null; if (this.VTKInput == null) { MyMesh = new c3DMeshObject(this.Input, Thresold); } else { MyMesh = new c3DMeshObject(this.VTKInput, (int)Thresold); } MyMesh.Create(Color.Aqua, this.Pos ); ListObjects.Name = MyMesh.GetName() + " metaobject"; ListObjects.Add(MyMesh); } else { // ok that's a little bit more complicated now // first we need to binarize the image cImageSegmentationThreshold IST = new cImageSegmentationThreshold(); IST.ListProperties.FindByName("Threshold").SetNewValue(Thresold); cImage SourceImage = new cImage(this.Input, false); IST.SetInputData(SourceImage); IST.Run(); // now perform image labeling cImage BinImage = IST.GetOutPut(); cImage LabeledImage = new cImage(BinImage, false); ConnectedComponentSet CCS = new ConnectedComponentSet(BinImage,LabeledImage,SourceImage, 0, eConnectivity.THREED_6, 0, float.MaxValue); Random RD = new Random(); int IdxObj = 1; // loop over each object int NumObj = CCS.Count; ListObjects.Name = "T_" + Thresold + " [" + SourceImage.Name + " Metaobject"; for(int i = 0;i<NumObj;i++) { ConnectedVoxels item = CCS[i]; // if (item.Volume <= 1) continue; List<cPoint3D> ExtremePts = item.GetExtremaPoints(); // crop the labeled image cImage TmpIm = LabeledImage.Crop(ExtremePts[0], ExtremePts[1]); // we have to clean the cropped image to prevent any overlapping object to be segmented for (int Pix = 0; Pix < TmpIm.ImageSize; Pix++) { if ((TmpIm.SingleChannelImage[0].Data[Pix] > 0) && (TmpIm.SingleChannelImage[0].Data[Pix] != IdxObj)) TmpIm.SingleChannelImage[0].Data[Pix] = 0; } // update the position of the object cPoint3D NewPos = ExtremePts[0]*SourceImage.Resolution; c3DMeshObject MyMesh = new c3DMeshObject(TmpIm.SingleChannelImage[0], 0.5); MyMesh.Create(Color.FromArgb(RD.Next(255), RD.Next(255), RD.Next(255)), NewPos); MyMesh.SetName(MyMesh.GetName() + "_" + IdxObj); MyMesh.AssociatedConnectedComponent = item; ListObjects.AddObject(MyMesh); IdxObj++; } } return base.FeedBackMessage; }
private void ToolStripMenuItem_SegmentationThreshold(object sender, EventArgs e) { cDisplaySingleImage NewView = new cDisplaySingleImage(); cImageSegmentationThreshold ME = new cImageSegmentationThreshold(); ME.SetInputData(this.AssociatedImage); ME.ListProperties.FindByName("Threshold").SetNewValue((double)100); ME.ListProperties.FindByName("Threshold").IsGUIforValue = true; ME.IsInvert = true; ME.Run(); NewView.SetInputData(ME.GetOutPut()); NewView.Run(); }
private void buttonApply_Click(object sender, EventArgs e) { if (DensityMaps.GetNumChannels() > cGlobalInfo.ListCellularPhenotypes.Count - 2) { MessageBox.Show("This process cannot manage more than " + (cGlobalInfo.ListCellularPhenotypes.Count - 2) + " different classes !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } cImageSegmentationThreshold ST = new cImageSegmentationThreshold(); ST.SetInputData(DensityMaps); ST.ListProperties.UpdateValueByName("Threshold", (double)this.numericUpDown1.Value); ST.MaxValue = 1; ST.Run(); cImage SegmentedImages = ST.GetOutPut(); // let's create an image containing the different non overlapping populations // Values: // 0 : outliers // 1 : Overlapping population // then population specific areas ResultingImage = new cImage(SegmentedImages.Width, SegmentedImages.Height, SegmentedImages.Depth, 1); ResultingImage.Name = "Overlapping Populations Analysis"; for (int i = 0; i < ResultingImage.Width * ResultingImage.Height * ResultingImage.Depth; i++) { int IdxPop = 0; float PixTotal = 0; float CurrentValue = 0; for (int IdxChannel = 0; IdxChannel < SegmentedImages.GetNumChannels(); IdxChannel++) { CurrentValue = SegmentedImages.SingleChannelImage[IdxChannel].Data[i]; PixTotal += CurrentValue; if (CurrentValue == 1) IdxPop = IdxChannel; } if (PixTotal > 1) ResultingImage.SingleChannelImage[0].Data[i] = 1; else if (PixTotal == 1) { ResultingImage.SingleChannelImage[0].Data[i] = IdxPop + 2; } //float Value0 = SegmentedImages.SingleChannelImage[PositiveBand].Data[i]; //float Value1 = SegmentedImages.SingleChannelImage[NegativeBand].Data[i]; //if ((Value0 > 0) && (Value1 > 0)) // overlapping // ResultingImage.SingleChannelImage[0].Data[i] = 1; //else if ((Value0 > 0) && (Value1 <= 0)) // ResultingImage.SingleChannelImage[0].Data[i] = 2;// DensityMaps.SingleChannelImage[PositiveBand].Data[i]; //else if ((Value0 <= 0) && (Value1 > 0)) // ResultingImage.SingleChannelImage[0].Data[i] = 3;// -DensityMaps.SingleChannelImage[NegativeBand].Data[i]; } if (checkBoxUpdatePhenotypeName.Checked) { cGlobalInfo.ListCellularPhenotypes[0].Name = "Outliers"; cGlobalInfo.ListCellularPhenotypes[1].Name = "Overlapping Populations"; for (int IdxChannel = 0; IdxChannel < DensityMaps.GetNumChannels(); IdxChannel++) { cGlobalInfo.ListCellularPhenotypes[IdxChannel + 2].Name = DensityMaps.SingleChannelImage[IdxChannel].Name + " Specific"; } } if (checkBoxDisplayResultingImage.Checked) { // cImageViewer IV2 = new cImageViewer(); // IV2.SetImage(ResultingImage/*SegmentedImages*/); // IV2.Show(); List<byte[][]> ListLUTs = new List<byte[][]>(); cLUT LUT = new cLUT(); ListLUTs.Add(LUT.LUT_FIRE); pictureBoxForImage.Image = ResultingImage.GetBitmap(1, null, ListLUTs); } // return; // now apply the result to the points for (int j = 0; j < Parent.InputTable[0].Count/* dt.Rows.Count*/; j++) { double TmpValueX = (ImageWidth * (ListX[j] - MinX)) / (MaxX - MinX); double TmpValueY = ImageHeight - (ImageHeight * (ListY[j] - MinY)) / (MaxY - MinY); int PosX = (int)TmpValueX; int PosY = (int)TmpValueY; if (PosX >= ResultingImage.Width) PosX = ResultingImage.Width - 1; if (PosY >= ResultingImage.Height) PosY = ResultingImage.Height - 1; if (PosX < 0) PosX = 0; if (PosY < 0) PosY = 0; double Value = ResultingImage.SingleChannelImage[0].Data[PosX + PosY * ResultingImage.Width]; if (Value > 0) { Parent.MachineLearning.Classes[j] = Value; } else Parent.MachineLearning.Classes[j] = 0; //double currentClass = MachineLearning.Classes[j]; //ListX.Add(double.Parse(dt.Rows[j][this.comboBoxAxeX.SelectedIndex].ToString())); //ListY.Add(double.Parse(dt.Rows[j][this.comboBoxAxeY.SelectedIndex].ToString())); } Parent.MachineLearning.UpDateNumberOfCluster(); Parent.ReDraw(); //(int)MachineLearning.Classes[j] }