[AlgorithmInfo("Autovalutazione su compito del 09/07/2015", Category = "FEI")] public class Esercizio2015 : ImageOperation, Image> { public override void Run() { // 1) Binarizzazione con soglia mediana (con sugg. Array.Sort?) var values = InputImage.CopyPixels(); Array.Sort(values); int thr = values[values.Length / 2]; var bin = InputImage.Clone(); for (int i = 0; i < bin.PixelCount; i++) { bin[i] = (byte)(bin[i] >= thr ? 255 : 0); } OnIntermediateResult(new AlgorithmIntermediateResultEventArgs(bin.Clone(), "bin")); // 2) Chiusura (utilizzando Erosione e Dilatazione esistenti) var s = MorphologyStructuringElement.CreateCircle(9); var dilation = new MorphologyDilation(bin, s, 255); var erosion = new MorphologyErosion(dilation.Execute(), s, 255); var closed = erosion.Execute(); OnIntermediateResult(new AlgorithmIntermediateResultEventArgs(closed.Clone(), "chiusura")); // 3) Estrazione dei bordi con morfologia var sb = MorphologyStructuringElement.CreateCircle(3); erosion = new MorphologyErosion(closed, sb, 255); var tmpB = erosion.Execute(); var bordi = closed.Clone(); for (int i = 0; i < bordi.PixelCount; i++) { if (bordi[i] == 255 && tmpB[i] == 255) { bordi[i] = 0; } } OnIntermediateResult(new AlgorithmIntermediateResultEventArgs(bordi.Clone(), "bordi")); // 4) Isola i pixel con dist da foreground >10 var trDist = new DistanceTransform(closed, 0, MetricType.Chessboard).Execute(); // N.B. passo background come foreground OnIntermediateResult(new AlgorithmIntermediateResultEventArgs(trDist.Clone(), "trasf dist")); var distGt = trDist.Clone(); for (int i = 0; i < distGt.PixelCount; i++) { distGt[i] = (closed[i]==0 && distGt[i] < 10 ? 255 : 0); } OnIntermediateResult(new AlgorithmIntermediateResultEventArgs(distGt.Clone(), "dist<10")); // 5) Sovrappone Result = InputImage.Clone(); // Copia InputImage sul risultato for (int i = 0; i < Result.PixelCount; i++) { if (bordi[i] == 255) { Result[i] = 255; } else if (distGt[i] != 255) // i pixel restanti { Result[i] /= 2; } } } }