/* Puzzle45.c -- Smooth an image using an R by C neighborhood */
#include <stdlib.h>
#include <stdio.h>
#include "basicImage.c"
void smoothRxCImage( image img, image smooth, int nRows, int nCols )
{
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= -nRows/2; ri<=nRows/2; ri++ )
if ( r+ri >=0 && r+ri < img.nrows )
for ( ci= -nCols/2; ci<=nCols/2; 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 nRows, nCols ; /* Neighborhood Rows and Columns */
if ( argc != 5 )
{
printf( "smoothRxC oldImage smoothImage neighborhoodRows neighborhoodCols\n" );
exit( EXIT_FAILURE );
}
nRows = atoi( argv[3] );
if ( nRows <= 0 )
{
printf( "Rows in neighborhood must be greater than zero\n" );
exit( EXIT_FAILURE );
}
nCols = atoi( argv[4] );
if ( nCols <= 0 )
{
printf( "Cols in neighborhood must be greater than zero\n" );
exit( EXIT_FAILURE );
}
/* read in the image */
readPGMimage( &img, argv[1] );
/* create a blank image */
newImage( &smimg, img.nrows, img.ncols );
/* fill in values for the new image */
smoothRxCImage( img, smimg, nRows, nCols );
/* write the image to disk and free memory */
writePGMimage( smimg, argv[2] );
freeImage( &img );
freeImage( &smimg );
}
Comments: