Ejemplo n.º 1
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)
            });
        }
Ejemplo 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)
            });
        }