/* Puzzle47.c -- Repeatedly Smooth 3x3 with Edge Handling
|
|
*/
#include <stdlib.h>
#include <stdio.h>
#include "../basicImage.c"
void smoothImage( image img, image smooth )
{
int r, ri, c, ci, sum, count;
unsigned char value ;
/* Find all neighborhood averages */
for ( r=0; r<img.nrows; r++ )
for ( c=0; c<img.ncols; c++ )
{
sum = 0; count = 0;
for ( ri= -1; ri<=1; ri++ )
if ( r+ri >=0 && r+ri < img.nrows )
for ( ci= -1; ci<=1; ci++ )
if ( c+ci >=0 && c+ci < img.ncols )
{
sum += getPixel( img, r+ri, c+ci );
count++ ;
}
setPixel( smooth, r, c, sum/count );
}
}
int main ( int argc, char* argv[] )
{
image img, smimg;
int j, N;
if ( argc != 4 )
{
printf( "smoothRepeat oldImage smoothImage N\n" );
system( "pause" );
exit( EXIT_FAILURE );
}
N = atoi( argv[3] );
/* read in the image */
readPGMimage( &img, argv[1] );
/* create a blank image */
newImage( &smimg, img.nrows, img.ncols );
/* repeatedly smooth the image */
/* img and sming trade roles each time */
for ( j=1; j<=N; j++ )
{
if ( j%2 == 1 )
smoothImage( img, smimg );
else
smoothImage( smimg, img );
}
/* write the image to disk and free memory */
if ( N%2 == 1 )
writePGMimage( smimg, argv[2] );
else
writePGMimage( img, argv[2] );
freeImage( &img );
freeImage( &smimg );
}
Comments: