/*+-------------------------------------------------------------------------+ | MORFOLOGIA MATEMATICA: | | ---------------------- | | | | UTILS.H | | | | Arquivo que contem algumas rotinas uteis para implementacao dos pro-| | gramas de morfologia matematica. | | | | Por Luiz Eduardo da Silva JANEIRO/97 | +-------------------------------------------------------------------------+*/ /*+-------------------------------------------------------------------------+ | Estrutura para implementacao de fila encadeada. | +-------------------------------------------------------------------------+*/ struct no { int i, j; struct no *next; }; /*+-------------------------------------------------------------------------+ | Adiciona um pixel na fila de pixel's. Esta rotina possibilita a varredu-| | ra dos pixel's vizinhos de uma regiao em ordem LARGURA-PRIMEIRO. | +-------------------------------------------------------------------------+*/ void insere_fila (struct no **COM, struct no **FIM, int i, int j) { struct no *aux; aux = malloc (sizeof (struct no)); aux->i = i; aux->j = j; aux->next = NULL; if (*FIM) (*FIM)->next = aux; (*FIM) = aux; if (!(*COM)) (*COM) = aux; } /*+-------------------------------------------------------------------------+ | Retira um pixel na fila de pixeis. | +-------------------------------------------------------------------------+*/ void retira_fila (struct no **COM, struct no **FIM, int *i, int *j) { struct no *aux; aux = (*COM); *i = aux->i; *j = aux->j; (*COM) = aux->next; free (aux); if (!(*COM)) (*FIM) = NULL; } /*+-------------------------------------------------------------------------+ | Retorna se a fila esta vazia ou nao. | +-------------------------------------------------------------------------+*/ int fila_vazia (struct no *COM) { return (COM == NULL); } /*+-------------------------------------------------------------------------+ | Rotina de depuracao responsavel pela apresentacao da fila. | +-------------------------------------------------------------------------+*/ void mostra_fila (struct no *COM) { struct no *aux; aux = COM; printf ("\nFILA: "); while (aux) { printf ("(%d,%d) ",aux->i, aux->j); aux = aux->next; } printf ("\n\n"); return; } /*+-------------------------------------------------------------------------+ | Funcao que retorna a coordenada do vizinho de um ponto. | | 3 2 1 1 | | Vizinhanca 8: 4 . 0 Vizinhanca 4: 2 . 0 | | 5 6 7 3 | +-------------------------------------------------------------------------+*/ int Viz (int v, int n, int i, int j, int nl, int nc, int *ip, int *jp) { if (v == 4) n = 2 * n; switch (n) { case 0: if (j+1=0 && j+1=0) {*ip = i-1; *jp = j; return TRUE;} break; case 3: if (i-1>=0 && j-1>=0) {*ip = i-1; *jp = j-1; return TRUE;} break; case 4: if (j-1>=0) {*ip = i; *jp = j-1; return TRUE;} break; case 5: if (i+1=0) {*ip = i+1; *jp = j-1; return TRUE;} break; case 6: if (i+1= 8) return 0; viz[i]=0; fila[i]=1; while(1){ for(k=0; k<8 && !fila[k]; k++); if(k>=8) { conta++; for (;i<8 && !viz[i]; i+=(8/n)); if(i>=8) return conta; viz[i]=0; fila[i]=1; } else{ fila[k] = 0; for(j=0;j