/* calculo da relação de ordem doa operações de filtragem - abertura e fechamento */ #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]; 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; } } //Execução da erosão nr = im->info->nr; nc = im->info->nc; erosao(i, j, nr, nc, dim, imagem_copia, imagem_f1); //Execução da dilatação dilata(i, j, nr, nc, dim, imagem_copia, imagem_f2); //Verificação de máximos e montagem da imagem_g for (i = 0; i< im->info->nr-(dim-1); i++) { for (j = 0; j< im->info->nc-(dim-1); j++) { if ( (fabs( imagem_copia[i][j] - imagem_f1[i][j] )) < (fabs( imagem_f2[i][j] - imagem_copia[i][j] )) ) imagem_g[i][j]= imagem_f1[i][j]; else if ((fabs ( imagem_copia[i][j] - imagem_f1[i][j] )) > (fabs ( imagem_f2[i][j] - imagem_copia[i][j] )) ) imagem_g [i][j]= imagem_f2[i][j]; else imagem_g [i][j]= imagem_copia[i][j]; } } k = 0; f = fopen ("morfv1_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_g[i][j]; if (kk < 0) kk = 0; else if (kk > 255) kk = 255; fprintf (f, "%3d ", imagem_g[i][j]); k++; if (k > im->info->nc) { k = 0; fprintf (f, "\n"); } } fprintf (f, "\n"); fclose (f); }