/*********************************************************************** * * File: pgmfilter.c (25-May-2001) * (27-May-2005) * * Glaetten eines Schwarzweissbildes [Pixelmap im (ASCII) PGM-Format] * * Jedes Pixel (Grauwert) wird durch den Mittelwert der m*m * Nachbarpixel ersetzt. * * infile....Originalbild (PGM-File mit maxgray=255 und 17 Pixel/Zeile) * m.........Filterbreite in Pixel (ungerade) * outfile...geglaettetes Bild * **********************************************************************/ #include #include #define max(a,b) ((a)>(b) ? (a):(b)) #define min(a,b) ((a)<(b) ? (a):(b)) /**********************************************************************/ void smooth(unsigned char **imgs,unsigned char **img,\ int nx,int ny,int m) { /**********************************************************************/ int is,ix,iy,jx,jy,k; for(ix=0;ix<=nx-1;ix=ix+1) { for(iy=0;iy<=ny-1;iy=iy+1) { k=0; is=0; for(jx=max(ix-m/2,0);jx<=min(ix+m/2,nx-1);jx=jx+1) { for(jy=max(iy-m/2,0);jy<=min(iy+m/2,ny-1);jy=jy+1) { k=k+1; is=is+img[jx][jy]; } } imgs[ix][iy]=is/k; } } } /**********************************************************************/ int main() { /**********************************************************************/ FILE *fpi,*fpo; char fname[80],pnm[3]; unsigned char **img,**imgs; int ix,iy,k,m,maxgray,nx,ny; printf("infile="); scanf("%s",fname); fpi=fopen(fname,"r"); fscanf(fpi,"%s",pnm); fscanf(fpi,"%d %d",&nx,&ny); fscanf(fpi,"%d",&maxgray); fgetc(fpi); img=(unsigned char**)malloc(nx*sizeof(unsigned char*)); imgs=(unsigned char**)malloc(nx*sizeof(unsigned char*)); for(ix=0;ix<=nx-1;ix=ix+1) { img[ix]=(unsigned char*)malloc(ny*sizeof(unsigned char)); imgs[ix]=(unsigned char*)malloc(ny*sizeof(unsigned char)); } for(iy=0;iy<=ny-1;iy=iy+1) { for(ix=0;ix<=nx-1;ix=ix+1) { fscanf(fpi,"%d",&img[ix][iy]); } } fclose(fpi); for(;;) { printf("m="); scanf("%d",&m); if(m%2==1) { break; } } smooth(imgs,img,nx,ny,m); printf("outfile="); scanf("%s",fname); fpo=fopen(fname,"w"); fprintf(fpo,"%s\n",pnm); fprintf(fpo,"%d %d\n",nx,ny); fprintf(fpo,"%d\n",maxgray); k=0; for(iy=0;iy<=ny-1;iy=iy+1) { for(ix=0;ix<=nx-1;ix=ix+1) { k=k+1; if(k<17) { fprintf(fpo,"%3d ",imgs[ix][iy]); } else { k=0; fprintf(fpo,"%3d \n",imgs[ix][iy]); } } } fclose(fpo); return 0; } /**********************************************************************/