static void Main(string[] args) { #region init if (0 == args.Length) { Console.WriteLine("no slide name"); return; } var slideName = args[0]; var processinHelper = new Processing(slideName); var slide = processinHelper.Slide; #endregion init var part = new WsiPartitioner(new Rectangle(new Point(0, 0), slide.Size), new Size(1000, 1000), new Size(0, 0), 1.0); var tissueData = new TiledProcessInformation<bool>(part, slideName); #region global tissue detection int overviewImageWidth = slide.Size.Width / OverviewTileSize; int overviewImageHeight = slide.Size.Height / OverviewTileSize; Bitmap overviewImage = slide.GetImagePart(0, 0, slide.Size.Width, slide.Size.Height, overviewImageWidth, overviewImageHeight); var bitmapProcessor = new BitmapProcessor(overviewImage); ObjectLayer overviewLayer = new TissueDetector().Execute(bitmapProcessor, Radius, NoiseLevel); bitmapProcessor.Dispose(); DrawObjectsToImage(overviewImage, overviewLayer, Color.Black); overviewImage.Save(processinHelper.DataPath + "tissueDetectionOverview.png"); #endregion global tissue detection //part.Tiles[] foreach (var tile in part) { #region global tissue detection var rect = tile.SourceRect; int overviewX = rect.X / OverviewTileSize; int overviewY = rect.Y / OverviewTileSize; int windowSize = rect.Width / OverviewTileSize; bool tileInObject = true; int partsOutside = 0; for (int y = 0; y < windowSize; y++) { for (int x = 0; x < windowSize; x++) { int newX = overviewX + x; int newY = overviewY + y; if (newX < 0 || newX >= overviewLayer.Map.Width || newY < 0 || newY >= overviewLayer.Map.Height) { continue; } uint id = overviewLayer.Map[newX, newY]; if (id != 0) continue; partsOutside++; if (!(partsOutside >= Math.Pow(windowSize + 1, 2) * 0.75)) continue; tileInObject = false; break; } if (!tileInObject) { break; } } tissueData.AddDataToCurrentTile(tileInObject); #endregion global tissue detection if (tileInObject) Console.WriteLine(tile.SourceRect + ":" + partsOutside); } tissueData.ToFile(processinHelper.DataPath + "tissueData.tpi"); using (Bitmap b = tissueData.GenerateHeatMap(tissue => tissue ? Color.Green : Color.Red)) b.Save(processinHelper.DataPath + "tissueData.png"); Console.WriteLine("done"); Console.ReadKey(); }
private static void processInput() { int Radius = 2; int NoiseLevel = 10; Console.WriteLine("Processing Input..."); foreach (var import in importItems) { Console.WriteLine(); Console.WriteLine(import.FileName); Console.WriteLine("Slide extrahieren..."); var processingHelper = new Processing(import.FileName); var slide = processingHelper.Slide; Console.WriteLine("Ausschnitt aus Slide extrahieren mit originaler Auflösung..."); int partImageWidth = import.LowerRight.X - import.UpperLeft.X; int partImageHeight = import.LowerRight.Y - import.UpperLeft.Y; Bitmap partImage = slide.GetImagePart( import.UpperLeft.X, import.UpperLeft.Y, partImageWidth, partImageHeight, partImageWidth, partImageHeight ); #region global tissue detection Console.WriteLine("Gewebe suchen und in separatem Layer speichern..."); var bitmapProcessor = new BitmapProcessor(partImage); ObjectLayer overviewLayer = new TissueDetector().Execute(bitmapProcessor, Radius, NoiseLevel); bitmapProcessor.Dispose(); Console.WriteLine("Gewebe-Layer in Ausschnitt zeichnen + speichern..."); DrawObjectsToImage(partImage, overviewLayer, Color.Black); partImage.Save(processingHelper.DataPath + "ImagePartTissue.png"); #endregion global tissue detection #region Deconvolution Console.WriteLine("Execute deconvolution 3..."); var gpX = new ColorDeconvolution().Get3rdStain(partImage, ColorDeconvolution.KnownStain.HaematoxylinEosin); gpX.Dispose(); Bitmap gpX_bmp = gpX.Bitmap; gpX_bmp.Save(processingHelper.DataPath + "ImagePartColor3.png"); Console.WriteLine("Execute deconvolution 2..."); var gpE = new ColorDeconvolution().Get2ndStain(partImage, ColorDeconvolution.KnownStain.HaematoxylinEosin); gpE.Dispose(); Bitmap gpE_bmp = gpE.Bitmap; gpE_bmp.Save(processingHelper.DataPath + "ImagePartColor2.png"); Console.WriteLine("Execute deconvolution 1..."); var gpH = new ColorDeconvolution().Get1stStain(partImage, ColorDeconvolution.KnownStain.HaematoxylinEosin); gpH.Dispose(); Bitmap gpH_bmp = gpH.Bitmap; gpH_bmp.Save(processingHelper.DataPath + "ImagePartColor1.png"); #endregion Deconvolution #region execute edge detection Console.WriteLine("Execute edge detection..."); SobelResponse responseH = Filtering.ExecuteSobel(gpH_bmp); SobelResponse responseE = Filtering.ExecuteSobel(gpE_bmp); var substracted = new double[responseH.Size.Width, responseH.Size.Height]; var substractedRange = new Range<double>(); for (var x = 0; x < responseH.Size.Width; x++) { for (var y = 0; y < responseH.Size.Height; y++) { var value = Math.Max(0, responseE.Gradient[x, y] - responseH.Gradient[x, y]); substracted[x, y] = value; substractedRange.Add(value); } } double[,] nonMaximumSupression = Filtering.ExecuteNonMaximumSupression(substracted, responseE.Orientation); Bitmap edges = Visualization.Visualize(nonMaximumSupression, Visualization.CreateColorizing(substractedRange.Maximum)); edges.Save(processingHelper.DataPath + "ImagePartEdges.png"); #endregion execute edge detection exportItems.Add( new Ausgabe { Identify = import.Identify, Result = false, Message = "kein Fehler" } ); } }