/* calculo da relação de ordem doa operações de filtragem - fechamento e abertura */ #include #include #define MAX #include "lib.h" /* void ajeita(int i,int j,int lold,int m[1024][1024]) { if (m[i][j-1] == lold) { m[i][j-1] = m[i][j]; ajeita(i, j-1, lold, m); } if (m[i-1][j] == lold) { m[i-1][j] = m[i][j]; ajeita(i-1, j, lold, m); } if (m[i][j+1] == lold) { m[i][j+1] = m[i][j]; ajeita(i, j+1, lold, m); } if (m[i+1][j] == lold) { m[i+1][j] = m[i][j]; ajeita(i+1, j, lold, m); } } */ // função Execução da erosão int erosao(int i, int j,int nr, int nc, int dim, int imagem_copia[1024][1024], int imagem_f1[1024][1024] ) { int a, b, min; for (i = (((dim + 1)/2)-1) ; i < nr-(dim-1); i++) { for (j = (((dim + 1)/2)-1) ; j < nc-(dim-1); j++) { min = 255; for (a = 0; a < dim ; a++) { for (b = 0; b < dim; b++) { if (imagem_copia[(i-(((dim + 1)/2)-1)+a)][(j-(((dim + 1)/2)-1)+b)] <= min ) { min = imagem_copia[(i-(((dim + 1)/2)-1)+a)][(j-(((dim + 1)/2)-1)+b)]; } } } imagem_f1[i][j] = min; } } return (0); } //Execução da dilatação int dilata(int i, int j,int nr, int nc, int dim, int imagem_copia[1024][1024], int imagem_f2[1024][1024] ) { int a, b, max; for (i = 0; i < nr-(dim-1); i++) { for (j = 0; j < nc-(dim-1); j++) { max = 0; for (a = 0; a < dim ; a++) { for (b = 0; b < dim; b++) { if (imagem_copia[(i-(((dim + 1)/2)-1)+a)][(j-(((dim + 1)/2)-1)+b)] >= max ) { max = imagem_copia[(i-(((dim + 1)/2)-1)+a)][(j-(((dim + 1)/2)-1)+b)]; } } } imagem_f2[i][j] = max; } } return(0); } int main (int argc, char *argv[]) { int i = 0, j = 0, k = 0, dim = 0, kk = 0, L = 0, ai = 0, aj = 0,nr, nc, cont = 0,min = 0, max = 0; float A = 0, B = 0, XY = 0, w = 0; FILE *f; IMAGE im; int imagem_copia[1024][1024], imagem_g[1024][1024], imagem_f1[1024][1024], imagem_f2[1024][1024]; int imagem_f3[1024][1024], imagem_f4[1024][1024], imagem_f5[1024][1024]; if (argc < 2) { printf ("A imagem não estã disponível \n"); exit (1); } im = Input_PBM (argv[1]); if (im == 0) { printf ("No input image ('%s') \n", argv[1]); exit (2); } // entrada do parametro de criterio printf ("entre com a dimensão da máscara do elemento estruturante \n"); scanf ("%d", &dim); // printf ("entre com o limiar para binarizar a imagem \n"); // scanf ("%d", &L); //copia da imagem original para as outras utilizadas for (i = 0; i < im->info->nr - 1 ; i++) { for (j = 0; j < im->info->nc - 1 ; j++) { imagem_copia[i][j] = im->data[i][j]; imagem_g[i][j] = 255; imagem_f1[i][j] = 255; imagem_f2[i][j] = 255; } } //PRIMEIRO FECHAMENTO //Execução da dilatação nr = im->info->nr; nc = im->info->nc; dilata(i, j, nr, nc, dim, imagem_copia, imagem_f2); //Execução da erosão erosao(i, j, nr, nc, dim, imagem_f2, imagem_f1); //PRIMEIRA ABERTURA //Execução da erosão for (i = 0; i < im->info->nr - 1 ; i++) { for (j = 0; j < im->info->nc - 1 ; j++) { imagem_f3[i][j] = imagem_f1[i][j]; } } erosao(i, j, nr, nc, dim, imagem_f3, imagem_f1); //Execução da dilatação dilata(i, j, nr, nc, dim, imagem_f1, imagem_f2); //imagem_f2 deve ser a fechamento/abertura! k = 0; f = fopen ("feab_res.pgm", "w"); fprintf (f, "P2\n%d %d\n255\n", im->info->nc, im->info->nr); for (i=0 ; iinfo->nr; i++) for (j=0 ; jinfo->nc; j++) { kk = imagem_f2[i][j]; if (kk < 0) kk = 0; else if (kk > 255) kk = 255; fprintf (f, "%3d ", imagem_f2[i][j]); k++; if (k > im->info->nc) { k = 0; fprintf (f, "\n"); } } fprintf (f, "\n"); fclose (f); }