/* Algoritmo da mediana marginal numa vizinhanca 3x3 */ #include #include #include "imagem.h" #include "utils.h" #define TAM_VIZ 9 void msg (void) { printf ("\nLeitura de imagem colorida") ; printf ("\n-------------------------\n") ; printf ("Opcoes:\n") ; printf (" Arquivo de imagem em formato PPM\n\n") ; } int intcompare(int *i, int *j) { if (*i > *j) return (1) ; if (*i < *j) return (-1) ; return(0) ; } int mediana(int *Image, int i, int j, int nc) { int k, l, di, dj, dados[TAM_VIZ] ; /* so 3x3 por enquanto */ k = 0 ; for (di = -1; di != 2; di++) for (dj = -1; dj != 2; dj++) { dados[k] = *(Image+(i+di)*nc + j+dj) ; k = k + 1 ; } qsort( (char *)dados, TAM_VIZ, sizeof(int), intcompare) ; return (dados[(int )floor(TAM_VIZ/2)]) ; } /*---------------------------------------------------------- PROGRAMA PRINCIPAL */ void main (int argc, char *argv[]) { int OK, i, j, nc, nl, mc, dist ; int *I, *Id, *R, *G, *B, *Rmed, *Gmed, *Bmed, dados[TAM_VIZ] ; int di, dj, min ; OK = FALSE ; if (argc == 2) { OK = le_imagem_ppm (argv[1], &R, &G, &B, &nl, &nc, &mc) ; } else { msg () ; exit(0) ; } printf("Filtro da mediana marginal 3x3\n") ; if (OK) { aloca_memo(&Rmed, nl, nc) ; aloca_memo(&Gmed, nl, nc) ; aloca_memo(&Bmed, nl, nc) ; for (i = 0; i < nl; i++) for (j = 0; j < nc; j++) { if (i == 0 || i == nl-1 || j == 0 || j == nc-1) { *(Rmed+i*nc+j) = *(R+i*nc+j) ; *(Gmed+i*nc+j) = *(G+i*nc+j) ; *(Bmed+i*nc+j) = *(B+i*nc+j) ; } else { *(Rmed+i*nc+j) = mediana(R, i, j, nc) ; *(Gmed+i*nc+j) = mediana(G, i, j, nc) ; *(Bmed+i*nc+j) = mediana(B, i, j, nc) ; } } grava_imagem_ppm (Rmed, Gmed, Bmed, "mediana-marg.ppm", nl, nc, mc) ; /* system ("xv mediana-marg.ppm &") ; */ desaloca_memo (&R) ; desaloca_memo (&G) ; desaloca_memo (&B) ; desaloca_memo (&Rmed) ; desaloca_memo (&Gmed) ; desaloca_memo (&Bmed) ; } }