100 Answer ― Color Channels


#include <stdlib.h>
#include <stdio.h>
#include "../basicImage.c"
#include "../basicColorImage.c"

void toColorChannels( colorImage cimg, image red, image grn, image blu )
{
  int r, c, avg;
  pixel pix;
  for ( r=0; r<cimg.nrows; r++ )
    for ( c=0; c<cimg.ncols; c++ )
    {
      pix = getColorPixel( cimg, r, c ) ;
      setPixel( red, r, c, pix.red );
      setPixel( grn, r, c, pix.grn );
      setPixel( blu, r, c, pix.blu );
    }
}

void channelsToColor( colorImage cimg, image red, image grn, image blu )
{
  int r, c, avg;
  pixel pix;
  for ( r=0; r<cimg.nrows; r++ )
    for ( c=0; c<cimg.ncols; c++ )
    {
      pix.red = getPixel( red, r, c );
      pix.grn = getPixel( grn, r, c );
      pix.blu = getPixel( blu, r, c );
      setColorPixel( cimg, r, c, pix );
    }
}

int main ( int argc, char* argv[] )
{
  colorImage cimg;
  image red, green, blue;
  int threshold = 0;
  int flag = 0;

  if ( argc != 6 ||
      ((strcmp( argv[1], "-s")!=0) && (strcmp( argv[1], "-c")!=0)) )
  {
    printf("colorToChannels -s colorImage.ppm red.pgm green.pgm blue.pgm\n");
    printf(" --- separate color image into color channels\n");
    printf("colorToChannels -c colorImage.ppm red.pgm green.pgm blue.pgm\n");
    printf(" --- combine color channels into color image\n");
    exit( EXIT_FAILURE );
  }

  if ( strcmp( argv[1], "-s")== 0 )
  {
    /* read in the old image */
    readPPMimage( &cimg, argv[2]);

    /* create three empty gray level images*/
    if ( newImage( &red, cimg.nrows, cimg.ncols ) == NULL )
    {
      printf(">>error<< can't allocate memory for red image\n");
      exit( EXIT_FAILURE );
    }

    if ( newImage( &green, cimg.nrows, cimg.ncols ) == NULL )
    {
      printf(">>error<< can't allocate memory for green image\n");
      exit( EXIT_FAILURE );
    }

    if ( newImage( &blue, cimg.nrows, cimg.ncols ) == NULL )
    {
      printf(">>error<< can't allocate memory for blue image\n");
      exit( EXIT_FAILURE );
    }

    /* fill in gray level image */
    toColorChannels( cimg, red, green, blue );

    /* write the images to disk */
    writePGMimage( red,   argv[3]);
    writePGMimage( green, argv[4]);
    writePGMimage( blue,  argv[5]);
  }

  else
  {
    /* read in three color channel images */
    readPGMimage( &red,   argv[3]) ;
    readPGMimage( &green, argv[4]) ;
    readPGMimage( &blue,  argv[5]) ;

    if ( red.nrows != green.nrows || red.ncols != green.ncols )
    {
      printf(">>error<< red and green channels are different sizes\n");
      exit( EXIT_FAILURE );
    }

    if ( red.nrows != blue.nrows || red.ncols != blue.ncols )
    {
      printf(">>error<< red and blue channels are different sizes\n");
      exit( EXIT_FAILURE );
    }

    /* create empty color image */
    if ( newColorImage( &cimg, red.nrows, red.ncols ) == NULL )
    {
      printf(">>error<< can't allocate memory for color image\n");
      exit( EXIT_FAILURE );
    }

    /* fill in color image */
    channelsToColor( cimg, red, green, blue );

    /* write the color image to disk */
    writePPMimage( cimg, argv[2]);
  }

  freeColorImage( &cimg );
  freeImage( &red );
  freeImage( &green );
  freeImage( &blue );
}




Comments: