public TissueAnnotaionList groubByOnClassAndOthers(String ClassName) { TissueAnnotaionList newList = new TissueAnnotaionList(); foreach (TissueAnnotationClass annotaion in this.tissueList) { TissueAnnotationClass newAnnotaion = annotaion.Clone(); if (!newAnnotaion.getAnnotaionClass().Equals(ClassName)) { newAnnotaion.setAnnotaionClassOther(); } newList.add(newAnnotaion); } newList.sort(); return(newList); }
private static TissueAnnotaionList GetAnnotaions(String srcSlides, String outputPics) { TissueAnnotaionList annotationList = new TissueAnnotaionList(); int i = 0; //Get Anotaions from silde foreach (var slideName in Util.GetSlideFilenames(new String[] { srcSlides })) { using (var slideCache = new SlideCache(slideName)) { Parallel.ForEach(slideCache.Slide.GetAnnotations(), (annotation) => { if (abort != 0) { if (i >= abort) { return; } i++; } //Annotaions Bitmap extrahieren var contained = new List <IAnnotation>(); foreach (var candidate in slideCache.Slide.GetAnnotations()) { if (candidate == annotation) { continue; } var rectangle = annotation.BoundingBox; rectangle.Intersect(candidate.BoundingBox); if (rectangle.IsEmpty) { continue; } if (annotation.BoundingBox.Contains(candidate.BoundingBox)) { contained.Add(candidate); } } using (Bitmap annotationBitmap = annotation.Extract(1, contained)) { TissueAnnotationClass tissueAnnotation = new TissueAnnotationClass(annotation.Id, annotation.Name, slideCache.SlideName); //Werte Berechnsen tissueAnnotation = tissueAnnotation.ComputeFeatureValues(annotationBitmap); //Zur Liste hinzufügren annotationList.add(tissueAnnotation); //FOR DEBUG Save Image if (isSave) { annotationBitmap.Save(outputPics + "\\" + tissueAnnotation + ".png"); } Console.WriteLine(tissueAnnotation + " exc:" + contained.Count); } }); if (abort != 0 && i >= abort) { return(annotationList); } } } return(annotationList); }
public void add(TissueAnnotationClass annotaion) { this.tissueList.Add(annotaion); }
public static TissueAnnotationClass ComputeFeatures(TissueAnnotationClass tissueAnnotationOld, Bitmap image) { using (Bitmap hImage = image.Clone() as Bitmap, eImage = image.Clone() as Bitmap) { TissueAnnotationClass tissueAnnotation = tissueAnnotationOld.Clone(); int imageSize = 0; //H und E Werte aus Bild ermitteln var gpH = new ColorDeconvolution().Get1stStain(hImage, ColorDeconvolution.KnownStain.HaematoxylinEosin); var gpE = new ColorDeconvolution().Get2ndStain(eImage, ColorDeconvolution.KnownStain.HaematoxylinEosin); uint[] hHistogram = new uint[256]; uint[] eHistogram = new uint[256]; foreach (var grayscalePixel in gpH.Pixels()) { imageSize++; hHistogram[grayscalePixel.V]++; eHistogram[gpE.GetPixel(grayscalePixel.X, grayscalePixel.Y)]++; } //Segmentation aus dem Bild ermitteln //Layers erstellen var luminaLayer = ObjectLayerCreate.CreateLuminaLayer(image); var coresLayer = ObjectLayerCreate.CreateCoresLayer(image); //Features dem layer hinzufügen coresLayer = ObjectLayerrUtils.AddFeatureFormFactor( ObjectLayerrUtils.AddFeatureCenterPoint(coresLayer)); luminaLayer = ObjectLayerrUtils.AddFeatureCoresInNear( ObjectLayerrUtils.AddFeatureFormFactor(luminaLayer), coresLayer); //Alle Features ermitteln und in Listen schreiben --> sortiert um anschließend Mid und Avverage auszurechen List <uint> hHistogramList = histogramToList(hHistogram); List <uint> eHistogramList = histogramToList(eHistogram); List <uint> coresSizeList = ObjectLayerrUtils.GetFeatureValueList(coresLayer, "area"); List <uint> luminaSizeList = ObjectLayerrUtils.GetFeatureValueList(luminaLayer, "area"); List <uint> coresFormFactorList = ObjectLayerrUtils.GetFeatureValueList(coresLayer, "FormFactorOfContour"); List <uint> luminaFormFactorWithSize = new List <uint>(); List <uint> luminaCoresInNear = new List <uint>(); List <uint> luminaCoresInNearWithForm = new List <uint>(); foreach (var imageObject in luminaLayer.Objects) { var coresInNear = imageObject.Features.GetFeatureByName("coresInNear").Value; var formFactor = imageObject.Features.GetFeatureByName("FormFactorOfContour").Value; var area = imageObject.Features.GetFeatureByName("area").Value; if (Math.Abs(coresInNear) != 0) { luminaCoresInNear.Add((uint)(area / coresInNear)); luminaCoresInNearWithForm.Add((uint)((area * formFactor) / coresInNear)); } if (Math.Abs(formFactor) != 0) { luminaFormFactorWithSize.Add((uint)(area / (2 * formFactor))); } } luminaCoresInNear.Sort(); luminaCoresInNearWithForm.Sort(); luminaFormFactorWithSize.Sort(); //alle Features dem Object hinzufügen tissueAnnotation.Q25H = calcQuantil(hHistogramList, 0.25); tissueAnnotation.MeanH = calcQuantil(hHistogramList, 0.5); tissueAnnotation.Q75H = calcQuantil(hHistogramList, 0.75); tissueAnnotation.Q25E = calcQuantil(eHistogramList, 0.25); tissueAnnotation.MeanE = calcQuantil(eHistogramList, 0.5); tissueAnnotation.Q75E = calcQuantil(eHistogramList, 0.75); if (coresSizeList.Count == 0) { tissueAnnotation.CountCores = 0u; } else { tissueAnnotation.CountCores = (uint)(imageSize / coresSizeList.Count); } if (luminaSizeList.Count == 0) { tissueAnnotation.CountLumina = 0u; } else { tissueAnnotation.CountLumina = (uint)(imageSize / luminaSizeList.Count); } tissueAnnotation.MidCoresSize = calcMid(coresSizeList); tissueAnnotation.MeanCoresSize = calcQuantil(coresSizeList, 0.5); tissueAnnotation.Q25CoresSize = calcQuantil(coresSizeList, 0.25); tissueAnnotation.Q75CoresSize = calcQuantil(coresSizeList, 0.75); tissueAnnotation.MidLuminaSize = calcMid(luminaSizeList); tissueAnnotation.MeanLuminaSize = calcQuantil(luminaSizeList, 0.5); tissueAnnotation.Q25LuminaSize = calcQuantil(luminaSizeList, 0.25); tissueAnnotation.Q75LuminaSize = calcQuantil(luminaSizeList, 0.75); if (coresSizeList.Count == 0) { tissueAnnotation.DensityCores = 0; } else { tissueAnnotation.DensityCores = (uint)(imageSize / coresSizeList.Count); } tissueAnnotation.MidFormFactorCores = calcMid(coresFormFactorList); tissueAnnotation.MeanFormFactorCores = calcQuantil(coresFormFactorList, 0.5); tissueAnnotation.Q25FormFactorCores = calcQuantil(coresFormFactorList, 0.25); tissueAnnotation.Q75FormFactorCores = calcQuantil(coresFormFactorList, 0.75); tissueAnnotation.MidFormFactorLuminaWithSize = calcMid(luminaFormFactorWithSize); tissueAnnotation.MeanFormFactorLuminaWithSize = calcQuantil(luminaFormFactorWithSize, 0.5); tissueAnnotation.Q25FormFactorLuminaWithSize = calcQuantil(luminaFormFactorWithSize, 0.25); tissueAnnotation.Q75FormFactorLuminaWithSize = calcQuantil(luminaFormFactorWithSize, 0.75); tissueAnnotation.MidDensityLuminaCoresInNear = calcMid(luminaCoresInNear); tissueAnnotation.MeanDensityLuminaCoresInNear = calcQuantil(luminaCoresInNear, 0.5); tissueAnnotation.Q25DensityLuminaCoresInNear = calcQuantil(luminaCoresInNear, 0.25); tissueAnnotation.Q75DensityLuminaCoresInNear = calcQuantil(luminaCoresInNear, 0.75); tissueAnnotation.MidDensityFormFactorLuminaCoresInNear = calcMid(luminaCoresInNearWithForm); tissueAnnotation.MeanDensityFormFactorLuminaCoresInNear = calcQuantil(luminaCoresInNearWithForm, 0.5); tissueAnnotation.Q25DensityFormFactorLuminaCoresInNear = calcQuantil(luminaCoresInNearWithForm, 0.25); tissueAnnotation.Q75DensityFormFactorLuminaCoresInNear = calcQuantil(luminaCoresInNearWithForm, 0.75); return(tissueAnnotation); } }