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 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) }); }