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) }); }
public static IEnumerable <Point> GetPixels(this Imagem img) { var data = img.Data; for (int i = 0; i < img.Rows; i++) { for (int j = 0; j < img.Cols; j++) { yield return(new Point(j, i)); } } }
public ResultadoAlgoritmo Executa(Imagem img) { var data = img.Data; var input = new Matrix <float>(img.Rows * img.Cols, 1, 3); var output = new Matrix <int>(img.Rows * img.Cols, 1); for (int i = 0; i < img.Rows; i++) { for (int j = 0; j < img.Cols; j++) { input.Data[i * img.Cols + j, 0] = data[i, j, 0]; input.Data[i * img.Cols + j, 1] = data[i, j, 1]; input.Data[i * img.Cols + j, 2] = data[i, j, 2]; } } var term = new MCvTermCriteria(IteracoesMaximas, Epsilon); term.Type = TermCritType.Iter | TermCritType.Eps; Kmeans(input, 2, output, term, Tentativas, KMeansInitType, null); var saida = new Imagem(img.Width, img.Height); var coresSaida = new[] { new Bgr(Color.Black), new Bgr(Color.Red), }; for (int i = 0; i < img.Rows; i++) { for (int j = 0; j < img.Cols; j++) { var point = new PointF(j, i); var circle = new CircleF(point, 1); saida.Draw(circle, coresSaida[output[i * img.Cols + j, 0]]); } } var corCentro = saida[saida.Rows / 2, saida.Cols / 2]; var pixels = saida.GetPixels().Where(p => saida[p].Equals(corCentro)).ToList(); return(new ResultadoAlgoritmo { Imagem = saida, Area = pixels.Count, Perimetro = pixels.Count(p => saida.Vizinhos(p).Count(v => saida[v].Equals(corCentro)) < 4) }); }
private static void ExecutaAlgoritmo(string[] args) { var dict = LeParametros(args); IAlgoritmo algoritmo; switch (dict.GetStringOrDefault("a", "k")) { case "h": algoritmo = CriaAlgoritmoHough(dict); break; case "k": algoritmo = CriaAlgoritmoKMedias(dict); break; case "c": algoritmo = CriaAlgoritmoCrescimento(dict); break; default: throw new ArgumentException(); } var path = dict["path"]; var fileInfo = File.GetAttributes(path); IEnumerable <string> pathList; if (fileInfo.HasFlag(FileAttributes.Directory)) { pathList = Directory.GetFiles(path); } else { pathList = new[] { path }; } var outPath = dict.GetStringOrDefault("o", "output"); var resultados = new List <ResultadoAlgoritmo>(); Directory.CreateDirectory(outPath); foreach (var filename in pathList) { var img = new Imagem(filename); var resultado = algoritmo.Executa(img); resultados.Add(resultado); img.Save(Path.Combine(outPath, Path.GetFileName(filename))); resultado.Imagem.Save(Path.Combine(outPath, $"{Path.GetFileNameWithoutExtension(filename)}-{algoritmo.Sufixo}{Path.GetExtension(filename)}")); File.WriteAllText( Path.Combine(outPath, $"{Path.GetFileNameWithoutExtension(filename)}-{algoritmo.Sufixo}.txt"), $"Area: {resultado.Area}, Perímetro: {resultado.Perimetro}" ); } Console.WriteLine( $"Área: {resultados.Average(r => r.Area)}\n" + $"Perímetro: {resultados.Average(r => r.Perimetro)}\n" + $"Razão Área/Perímetro: {resultados.Average(r => r.Area) / resultados.Average(r => r.Perimetro)}"); }