Esempio n. 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)
            });
        }
Esempio n. 2
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)
            });
        }