#define MAX #include "lib.h" #include float Erro_medio(IMAGE origi, IMAGE filtrado); float Sinal_ruido(IMAGE origi, IMAGE filtrado); int main(int argc, char *argv[]) { IMAGE im=0,output=0; float porcent_brancos=0.0; float porcent_pontos; int n_pretos,n_brancos; int m,n; float n_pontos; if (argc < 5) { printf ("Usage: filter \n"); exit(1); } im = Input_PBM (argv[1]); if (im == 0) { printf("No input image ('%s')\n", argv[1]); exit(2); } sscanf(argv[3], "%f", &porcent_brancos); sscanf(argv[4], "%f", &porcent_pontos); if ((porcent_brancos > 100) || (porcent_pontos > 100)) { printf("Burro!!!\n"); exit(3); } printf("Ruido impulsivo com %.1f %% de pontos da imagem\n",porcent_pontos); printf(" %.1f %% compostos de pontos brancos\n",porcent_brancos); printf(" %.1f %% compostos de pontos pretos\n",100.0 - porcent_brancos); n_pontos = porcent_pontos/100 * im->info->nr * im->info->nc; n_brancos = (int) ((float)(porcent_brancos/100.0) * n_pontos); n_pretos = (int) ((float)((100.0 - porcent_brancos)/100) * n_pontos); copy (&output,im); while (n_brancos > 0) { m = (int) ((float)im->info->nr*rand()/RAND_MAX); n = (int) ((float)im->info->nc*rand()/RAND_MAX); output->data[m][n] = 255; n_brancos--; } while (n_pretos > 0) { m = (int) ((float)im->info->nr*rand()/RAND_MAX); n = (int) ((float)im->info->nc*rand()/RAND_MAX); output->data[m][n] = 0; n_pretos--; } Output_PBM(output,argv[2]); printf("SUCESSO!\n"); printf("O arquivo se encontra em '%s'.\n",argv[2]); } float Erro(IMAGE origi, IMAGE filtrado) { int i,j; float total=0.0; for (i = 0; i < origi->info->nr; i++) for (j = 0; j < origi->info->nc; j++) total = total + pow(origi->data[i][j] - filtrado->data[i][j],2); return total; } float Erro_medio(IMAGE origi, IMAGE filtrado) { int i,j; float erms=0.0,total=0.0; total = Erro(origi,filtrado); erms = total/(origi->info->nr * origi->info->nc); return sqrt(erms); } float Sinal_ruido(IMAGE origi, IMAGE filtrado) { int i,j; float numerador,denominador; for (i = 0; i < origi->info->nr; i++) for (j = 0; j < origi->info->nc; j++){ numerador = numerador + pow(filtrado->data[i][j],2); denominador = denominador + pow(origi->data[i][j] - filtrado->data[i][j],2); } return (numerador/denominador); }