public ResultadoAlgoritmo Executa(Imagem entrada) { var img = entrada.Convert <Gray, byte>(); var circulos = img .HoughCircles(new Gray(LimiarCanny), new Gray(LimiarAcumuladorCirculo), 2.0, DistanciaMinima, RaioMinimo, RaioMaximo) .SelectMany(c => c) .OrderByDescending(c => c.Radius) .Take(2); if (Math.Abs(circulos.FirstOrDefault().Radius - circulos.LastOrDefault().Radius) > 5) { circulos = circulos.Take(1); } var saida = new Imagem(entrada.Data); foreach (var c in circulos) { var centro = new CircleF(c.Center, 5); saida.Draw(c, new Bgr(Color.Red)); saida.Draw(centro, new Bgr(Color.Red)); } return(new ResultadoAlgoritmo { Imagem = saida, Area = circulos.Sum(c => c.Area), Perimetro = circulos.Sum(c => 2 * Math.PI * c.Radius) }); }
public ResultadoAlgoritmo Executa(Imagem entrada) { var gray = entrada.Convert <Gray, byte>(); var size = entrada.Size; var centro = new Point(size.Width / 2, size.Height / 2); var seed = new Rectangle( new Point(centro.X - size.Width * PorcentagemInicial / 2 / 100, centro.Y - size.Height * PorcentagemInicial / 2 / 100), new Size(size.Width * PorcentagemInicial / 100, size.Height * PorcentagemInicial / 100)); var map = new byte[entrada.Rows, entrada.Cols, 3]; var queue = new Queue <Point>(); for (int i = seed.Left; i <= seed.Right; i++) { for (int j = seed.Top; j <= seed.Bottom; j++) { map[j, i, Canal] = 255; queue.Enqueue(new Point(i, j)); } } var data = gray.Data; while (queue.Any()) { var proximo = queue.Dequeue(); var vizinhos = entrada.Vizinhos(proximo); var pixel = data[proximo.Y, proximo.X, 0]; foreach (var v in vizinhos) { if (map[v.Y, v.X, Canal] != 255) { var diff = Math.Abs(pixel - data[v.Y, v.X, 0]); if (diff <= Limiar) { queue.Enqueue(v); map[v.Y, v.X, Canal] = 255; } } } } var saida = new Imagem(map); var corArea = Canal == 2 ? new Bgr(0, 0, 255) : throw new InvalidOperationException(); var pixels = saida.GetPixels().Where(p => saida[p].Equals(corArea)).ToList(); return(new ResultadoAlgoritmo { Imagem = saida, Area = pixels.Count, Perimetro = pixels.Count(p => saida.Vizinhos(p).Count(v => saida[v].Equals(corArea)) < 4) }); }