예제 #1
0
        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)
            });
        }
예제 #2
0
        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)
            });
        }
예제 #3
0
        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));
                }
            }
        }
예제 #4
0
        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)
            });
        }
예제 #5
0
        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)}");
        }