public int[,] GetEE(ElEst el, int rx, int ry) { int lengthX = (2 * rx + 1), lengthY = (2 * ry + 1);; int[,] EE = new int[lengthX, lengthY]; switch (el) { case ElEst.circulo: case ElEst.cruz: for (int x = 0; x < lengthX; x++) { for (int y = 0; y < lengthY; y++) { if (x == (rx - 1) / 2 || y == (ry - 1) / 2) { EE[x, y] = 255; } else { EE[x, y] = -1; } } } break; case ElEst.ponto: EE[(rx - 1) / 2, (ry - 1) / 2] = 255; break; case ElEst.quadrado: for (int x = 0; x < lengthX; x++) { for (int y = 0; y < lengthY; y++) { EE[x, y] = 255; } } break; case ElEst.quadradoCinza: for (int x = 0; x < lengthX; x++) { for (int y = 0; y < lengthY; y++) { EE[x, y] = 1; } } EE[rx / 2, ry / 2] = 2; break; } return(EE); }
public void Erosao(ElEst el, int rx, int ry, Imagem B) { int x, y, i, j, c, w = MatrizCor.Width, h = MatrizCor.Height; int[,] ee; if (B == null) { ee = GetEE(el, rx, ry); } else { ee = GetEE(B); rx = B.MatrizCor.Width / 2; ry = B.MatrizCor.Height / 2; } bool iguais; var aux = new int[w, h, 3]; for (c = 0; c < 3; c++) { for (x = rx; x < w - rx; x++) { for (y = ry; y < h - ry; y++) { iguais = true; for (i = -rx; i <= rx && iguais; i++) { for (j = -ry; j <= ry && iguais; j++) { if (ee[rx + i, ry + j] >= 0) { iguais = MatrizCor.Matriz[x + i, y + j, c] == ee[rx + i, ry + j]; } } } aux[x, y, c] = iguais ? 255 : 0; } } } this.MatrizCor.Matriz = aux; }
public void DilatacaoCinza(ElEst el, int rx, int ry) { Imagem img = this; int[,] ee = GetEE(el, rx, ry); int h = this.MatrizCor.Height; int w = this.MatrizCor.Width; Imagem saida = new Imagem(); saida.Clone(this); int x, y, c, i, j, max, aux; for (c = 0; c < 3; c++) { for (x = rx; x < (w - rx); x++) { for (y = ry; y < (h - ry); y++) { aux = 0; for (i = -rx; i <= rx; i++) { for (j = -ry; j <= ry; j++) { max = img.MatrizCor.Matriz[x + i, y + j, c] + (ee[rx + i, ry + j]); if (max > aux) { aux = max; } } } saida.MatrizCor.Matriz[x, y, c] = aux; } } } this.MatrizCor = saida.MatrizCor; }