/*Realiza sequencias de operacoes de erosao e dilatacao*/ #define MAX #include "lib.h" #include <math.h> int erosao(IMAGE im, int x, int y, int n){ // originalmente dilatacao int i,j,k,d; int max; // printf("\n ** Dilatacao %d, %d **", x, y); max=0; d=n/2; for (k=0;k<n*n;k++){ i=x+(k/n)-d; j=y+(k%n)-d; if ((i>=0)&&(j>=0)&&(i<im->info->nr)&&(j<im->info->nc)) if (max<im->data[i][j]) max=im->data[i][j]; } return max; } int dilatacao(IMAGE im, int x, int y, int n){ // originalmente erosao int i,j,k,d; int min; // printf("\n ** Erosao %d, %d **", x, y); min=255; d=n/2; for (k=0;k<n*n;k++){ i=x+(k/n)-d; j=y+(k%n)-d; if ((i>=0)&&(j>=0)&&(i<im->info->nr)&&(j<im->info->nc)) if (min>im->data[i][j]) min=im->data[i][j]; } return min; } main () { IMAGE aux, imgatual, imganterior, imagens[10]; int dim, i, j, k, l, m, n, opr[50]; char arqs[10][15], sufixo[25]; printf("\n Digite a dimensao da mascara: \n"); scanf ("%d", &dim); if ((dim/2)*2 == dim) { printf(" o parametro <n> deve ser um numero impar!\n"); exit(2); } printf("\n Calculando as operacoes com uma matriz %d x %d \n",dim,dim); printf("\n Digite as operacoes (1=erosao, 2=dilatacao,"); printf(" 0=final, -1=fim das operacoes):\n"); i=-1; do {i++; scanf("%d", &opr[i]); // printf("\n opr ->%d\n", opr[i]); }while((opr[i] != -1) && (i<50)); printf("\n Digite o nome dos arquivos (F para ¨Fim¨): \n"); i=-1; do {i++; printf("\n Proximo: \n"); scanf("%s", arqs[i]); // printf("\n strlen -> %d \n arq-> %s\n", strlen(arqs[i]), arqs[i]); }while(strlen(arqs[i]) > 1); for (i; i<10; i++)arqs[i][0]=(char)'\0'; i=0; while(strlen(arqs[i]) > 0) { imagens[i] = Input_PBM (arqs[i]); if (imagens[i] == 0) { printf ("Arquivo Invalido: ('%s')\n", arqs[i]); exit (2); } printf("Processando Arq %d: %s\n", i, arqs[i]); j=0; while((opr[j]!=-1) && (j<50)) { printf(" ** while externo-> j = %d, opr[j]-> %d ** \n", j, opr[j]); k=j; imganterior=newimage(imagens[i]->info->nr,imagens[i]->info->nc); imgatual=newimage(imagens[i]->info->nr,imagens[i]->info->nc); for(m=0; m<imagens[i]->info->nr; m++) for(n=0; n<imagens[i]->info->nc; n++) imganterior->data[m][n]=imagens[i]->data[m][n]; strcpy(sufixo, arqs[i]); l=strlen(arqs[i]); while((opr[k]!=0) && (k<50)) { printf(" ** while interno-> k = %d, opr[k]-> %d ** \n", k, opr[k]); if(opr[k]==1) { sufixo[l]=(char)'e'; for(m=0; m<imagens[i]->info->nr; m++) for(n=0; n<imagens[i]->info->nc; n++) imgatual->data[m][n]=erosao(imganterior,m,n,dim); } if(opr[k]==2) { sufixo[l]=(char)'d'; for(m=0; m<imagens[i]->info->nr; m++) for(n=0; n<imagens[i]->info->nc; n++) imgatual->data[m][n]=dilatacao(imganterior,m,n,dim); } l++; aux=imgatual; imgatual=imganterior; imganterior=aux; k++; } sufixo[l]=(char)'.'; sufixo[l+1]=(char)'p'; sufixo[l+2]=(char)'g'; sufixo[l+3]=(char)'m'; sufixo[l+4]=(char)'\0'; printf ("\n Salvando imagem %s ...\n", sufixo); Output_PBM (imganterior, sufixo); j=k+1; } i++; } }