c8b_filtrom_m(c,m)
canal8b *c;
mascarar *m;
{
int i,j,k,l;
img8b **pce,**pcs; /* Puntero a la imagen entrante, a la imagen saliente,
a las tablas de entrada para las dos im genes. */
float cpix;
float *pm;
pce=c->entra_ime;
pcs=c->entra_ims;
for (i=m->semilado;i<c->y-m->semilado;i++) {
for (j=m->semilado;j<c->x-m->semilado;j++) {
for (cpix=0,pm=m->ne,k=-m->semilado;k<m->semilado+1;k++)
{
for (l=-m->semilado;l<m->semilado+1;l++,pm++) {
cpix+=*pm * (float) *(*(pce+i+k)+j+l);
} /* Recorre las columnas de una fila de la m scara.
*/
} /* Recorre cada fila. */
*(*(pcs+i)+j)=(img8b) (cpix/(m->superficie));
} /* Recorre cada columna de una fila de la imagen. */
} /* Recorre cada fila de la imagen. */
return(1);
}
/* ESQUINA SUPERIOR IZQUIERDA. */
c8b_filtrom_ai(c,m) /* Filtro arriba izquierda. */
canal8b *c;
mascarar *m;
{
int i,j,k,l;
img8b **pce,**pcs; /* Puntero a la imagen entrante, a la imagen saliente,
a las tablas de entrada para las dos im genes.
*/
float cpix,superf;
float *pm,*dir_cmas;
pce=c->entra_ime;
pcs=c->entra_ims;
dir_cmas=m->ne+(int)(m->lado*m->lado/2); /* Punto central de la m scara.
*/
for (i=0;i<m->semilado;i++) { /* Recorre las filas. Eje Y.*/
for (j=0;j<m->semilado;j++) { /* Recorre las columnas. Eje
X. */
for (superf=0,cpix=0,pm=dir_cmas,k=-i;k<m->semilado+1;k++)
{/* Recorre las filas de la m scara. */
for (l=-j;l<m->semilado+1;l++) {/* Recorre la columnas
de la m scara. */
cpix+=*((pm+l)+m->lado*k) * (float) *(*(pce+i+k)+j+l);
superf+=*((pm+l)+m->lado*k);
} /* Recorre las columnas de una fila de la m scara.
*/
} /* Recorre cada fila. */
*(*(pcs+i)+j)=(img8b) (cpix/superf);
} /* Recorre cada columna de una fila de la imagen. */
} /* Recorre cada fila de la imagen. */
return(1);
}
/* LISTàN SUPERIOR. (Excepto lo contemplado
en arriba izquierda y arriba derecha. */
c8b_filtrom_a(c,m) /* Arriba. */
canal8b *c;
mascarar *m;
{
int i,j,k,l;
img8b **pce,**pcs; /* Puntero a la imagen entrante, a la imagen saliente,
a las tablas de entrada para las dos im genes.
*/
float cpix,superf;
float *pm,*dir_cmas;
pce=c->entra_ime;
pcs=c->entra_ims;
dir_cmas=m->ne+(int)(m->lado*m->lado/2); /* Punto central de la m scara.
*/
for (i=0;i<m->semilado;i++) { /* Recorre las filas. Eje Y.*/
for (j=m->semilado;j<c->x-m->semilado;j++) { /* Recorre las
columnas. Eje X. */
for (superf=0,cpix=0,pm=dir_cmas,k=-i;k<m->semilado+1;k++)
{/* Recorre las filas de la m scara. */
for (l=-m->semilado;l<m->semilado+1;l++) {/* Recorre
la columnas de la m scara. */
cpix+=*((pm+l)+m->lado*k) * (float) *(*(pce+i+k)+j+l);
superf+=*((pm+l)+m->lado*k);
/*printf("\n%f",*((pm+l)+m->lado*k));*/
} /* Recorre las columnas de una fila de la m scara.
*/
} /* Recorre cada fila. */
*(*(pcs+i)+j)=(img8b) (cpix/superf);
} /* Recorre cada columna de una fila de la imagen. */
} /* Recorre cada fila de la imagen. */
return(1);
}
/* ARRIBA A LA DERECHA. */
c8b_filtrom_ad(c,m) /* Arriba derecha. */
canal8b *c;
mascarar *m;
{
int i,j,k,l;
img8b **pce,**pcs; /* Puntero a la imagen entrante, a la imagen saliente,
a las tablas de entrada para las dos im genes.
*/
float cpix,superf;
float *pm,*dir_cmas;
pce=c->entra_ime;
pcs=c->entra_ims;
dir_cmas=m->ne+(int)(m->lado*m->lado/2); /* Punto central de la m scara.
*/
for (i=0;i<m->semilado;i++) { /* Recorre las filas. Eje Y.*/
for (j=c->x-m->semilado;j<c->x;j++) { /* Recorre las columnas.
Eje X. */
for (superf=0,cpix=0,pm=dir_cmas,k=-i;k<m->semilado+1;k++)
{/* Recorre las filas de la m scara. */
for (l=-m->semilado;l<c->x-j;l++) {/* Recorre la columnas
de la m scara. */
cpix+=*((pm+l)+m->lado*k) * (float) *(*(pce+i+k)+j+l);
superf+=*((pm+l)+m->lado*k);
} /* Recorre las columnas de una fila de la m scara.
*/
} /* Recorre cada fila. */
*(*(pcs+i)+j)=(img8b) (cpix/superf);
} /* Recorre cada columna de una fila de la imagen. */
} /* Recorre cada fila de la imagen. */
return(1);
}
/* LISTàN IZQUIERDO. */
c8b_filtrom_i(c,m) /* Izquierda. */
canal8b *c;
mascarar *m;
{
int i,j,k,l;
img8b **pce,**pcs; /* Puntero a la imagen entrante, a la imagen saliente,
a las tablas de entrada para las dos im genes.
*/
float cpix,superf;
float *pm,*dir_cmas;
pce=c->entra_ime;
pcs=c->entra_ims;
dir_cmas=m->ne+(int)(m->lado*m->lado/2); /* Punto central de la m scara.
*/
for (i=m->semilado;i<c->y-m->semilado;i++) { /* Recorre las filas.
Eje Y.*/
for (j=0;j<m->semilado;j++) { /* Recorre las columnas. Eje
X. */
for (superf=0,cpix=0,pm=dir_cmas,k=-m->semilado;k<m->semilado+1;k++)
{/* Recorre las filas de la m scara. */
for (l=-j;l<m->semilado+1;l++) {/* Recorre la columnas
de la m scara. */
cpix+=*((pm+l)+m->lado*k) * (float) *(*(pce+i+k)+j+l);
superf+=*((pm+l)+m->lado*k);
/*printf("\n%f",*((pm+l)+m->lado*k));*/
} /* Recorre las columnas de una fila de la m scara.
*/
} /* Recorre cada fila. */
*(*(pcs+i)+j)=(img8b) (cpix/superf);
} /* Recorre cada columna de una fila de la imagen. */
} /* Recorre cada fila de la imagen. */
return(1);
}
/* LISTàN DERECHO. */
c8b_filtrom_d(c,m) /* Derecha. */
canal8b *c;
mascarar *m;
{
int i,j,k,l;
img8b **pce,**pcs; /* Puntero a la imagen entrante, a la imagen saliente,
a las tablas de entrada para las dos im genes.
*/
float cpix,superf;
float *pm,*dir_cmas;
pce=c->entra_ime;
pcs=c->entra_ims;
dir_cmas=m->ne+(int)(m->lado*m->lado/2); /* Punto central de la m scara.
*/
for (i=m->semilado;i<c->y-m->semilado;i++) { /* Recorre las filas.
Eje Y.*/
for (j=c->x-m->semilado;j<c->x;j++) { /* Recorre las columnas.
Eje X. */
for (superf=0,cpix=0,pm=dir_cmas,k=-m->semilado;k<m->semilado+1;k++)
{/* Recorre las filas de la m scara. */
for (l=-m->semilado;l<c->x-j;l++) {/* Recorre la columnas
de la m scara. */
cpix+=*((pm+l)+m->lado*k) * (float) *(*(pce+i+k)+j+l);
superf+=*((pm+l)+m->lado*k);
/*printf("\n%f",*((pm+l)+m->lado*k));*/
} /* Recorre las columnas de una fila de la m scara.
*/
} /* Recorre cada fila. */
*(*(pcs+i)+j)=(img8b) (cpix/superf);
} /* Recorre cada columna de una fila de la imagen. */
} /* Recorre cada fila de la imagen. */
return(1);
}
/* ESQUINA INFERIOR IZQUIERDA. */
c8b_filtrom_bi(c,m) /* Abajo izquierda. */
canal8b *c;
mascarar *m;
{
int i,j,k,l;
img8b **pce,**pcs; /* Puntero a la imagen entrante, a la imagen saliente,
a las tablas de entrada para las dos im genes.
*/
float cpix,superf;
float *pm,*dir_cmas;
pce=c->entra_ime;
pcs=c->entra_ims;
dir_cmas=m->ne+(int)(m->lado*m->lado/2); /* Punto central de la m scara.
*/
for (i=c->y-m->semilado;i<c->y;i++) { /* Recorre las filas. Eje
Y.*/
for (j=0;j<m->semilado;j++) { /* Recorre las columnas. Eje
X. */
for (superf=0,cpix=0,pm=dir_cmas,k=-m->semilado;k<c->y-i;k++)
{/* Recorre las filas de la m scara. */
for (l=-j;l<m->semilado+1;l++) {/* Recorre la columnas
de la m scara. */
cpix+=*((pm+l)+m->lado*k) * (float) *(*(pce+i+k)+j+l);
superf+=*((pm+l)+m->lado*k);
/*printf("\n%f",*((pm+l)+m->lado*k));*/
} /* Recorre las columnas de una fila de la m scara.
*/
} /* Recorre cada fila. */
*(*(pcs+i)+j)=(img8b) (cpix/superf);
} /* Recorre cada columna de una fila de la imagen. */
} /* Recorre cada fila de la imagen. */
return(1);
}
/* LISTàN INFERIOR. */
c8b_filtrom_b(c,m) /* Abajo. */
canal8b *c;
mascarar *m;
{
int i,j,k,l;
img8b **pce,**pcs; /* Puntero a la imagen entrante, a la imagen saliente,
a las tablas de entrada para las dos im genes.
*/
float cpix,superf;
float *pm,*dir_cmas;
pce=c->entra_ime;
pcs=c->entra_ims;
dir_cmas=m->ne+(int)(m->lado*m->lado/2); /* Punto central de la m scara.
*/
for (i=c->y-m->semilado;i<c->y;i++) { /* Recorre las filas. Eje
Y.*/
for (j=m->semilado;j<c->x-m->semilado;j++) { /* Recorre las
columnas. Eje X. */
for (superf=0,cpix=0,pm=dir_cmas,k=-m->semilado;k<c->y-i;k++)
{/* Recorre las filas de la m scara. */
for (l=-m->semilado;l<m->semilado+1;l++) {/* Recorre
la columnas de la m scara. */
cpix+=*((pm+l)+m->lado*k) * (float) *(*(pce+i+k)+j+l);
superf+=*((pm+l)+m->lado*k);
} /* Recorre las columnas de una fila de la m scara.
*/
} /* Recorre cada fila. */
*(*(pcs+i)+j)=(img8b) (cpix/superf);
} /* Recorre cada columna de una fila de la imagen. */
} /* Recorre cada fila de la imagen. */
return(1);
}
/* ABAJO A LA DERECHA. */
c8b_filtrom_bd(c,m) /* Abajo derecha. */
canal8b *c;
mascarar *m;
{
int i,j,k,l;
img8b **pce,**pcs; /* Puntero a la imagen entrante, a la imagen saliente,
a las tablas de entrada para las dos im genes.
*/
float cpix,superf;
float *pm,*dir_cmas;
pce=c->entra_ime;
pcs=c->entra_ims;
dir_cmas=m->ne+(int)(m->lado*m->lado/2); /* Punto central de la m scara.
*/
for (i=c->y-m->semilado;i<c->y;i++) { /* Recorre las filas. Eje
Y.*/
for (j=c->x-m->semilado;j<c->x;j++) { /* Recorre las columnas.
Eje X. */
for (superf=0,cpix=0,pm=dir_cmas,k=-m->semilado;k<c->y-i;k++)
{/* Recorre las filas de la m scara. */
for (l=-m->semilado;l<c->x-j;l++) {/* Recorre la columnas
de la m scara. */
cpix+=*((pm+l)+m->lado*k) * (float) *(*(pce+i+k)+j+l);
superf+=*((pm+l)+m->lado*k);
/*printf("\n%f",*((pm+l)+m->lado*k));*/
} /* Recorre las columnas de una fila de la m scara.
*/
} /* Recorre cada fila. */
*(*(pcs+i)+j)=(img8b) (cpix/superf);
} /* Recorre cada columna de una fila de la imagen. */
} /* Recorre cada fila de la imagen. */
return(1);
}
/*----------------------------------------------*/
/*
Ponemos la sombra como imagen canal activo para su visi¢n.
Esto es mas r pido que copiar la imagen de la sombra en la entrante.
*/
c8b_interces(c)
canal8b *c;
{
img8b *iswap,**dirswap;
iswap=c->ims;
c->ims=c->ime;
c->ime=iswap;
dirswap=c->entra_ims;
c->entra_ims=c->entra_ime;
c->entra_ime=dirswap;
return(1);
}
/*----------------------------------------------*/
/* La funci¢n de filtro
devuelve la direcci¢n del canal filtrado. */
canal8b *c8b_filtramcanal(c,m)
canal8b *c;
mascarar *m;
{
/* Filtramos el cuerpo central. */
c8b_filtrom_ai(c,m); /* Arriba izquierda.*/
c8b_filtrom_a(c,m); /* Arriba. */
c8b_filtrom_ad(c,m); /* Arriba derecha. */
c8b_filtrom_i(c,m); /* Izquierda. */
c8b_filtrom_d(c,m); /* Derecha. */
c8b_filtrom_bi(c,m); /* Abajo izquierda. */
c8b_filtrom_b(c,m); /* Abajo. */
c8b_filtrom_bd(c,m); /* Abajo derecha. */
c8b_filtrom_m(c,m); /** Filtra. */
c8b_interces(c); /** swap las dos im genes */
return(c);
}
/* Entrada al filtro. */
c8b_filtra(im,m)
c8b_imagen *im;
mascarar m;
{
int c;
for (c=0;c<im->ncan;c++) {
c8b_filtrac(im,m);
}
}
|