next up previous contents
Next: Grey Scaling. Up: Image Processing using GTK. Previous: Colour Inverting:   Contents

Colour Masking.

Following similar precept we can do color masking by removing the effect of that particular colour. I will show you the masking for red as the masking for other colours is obvious.

   	      pixel.red   =0x00;		//mask red.
	      pixel.green |=0;			//no change.
	      pixel.blue  |=0;			//no change.

The routine below modifies the image removing the said component [color takes values of either [r/R] or [g/G] or [b/B]] and processes it.[ see [*]] . This code yielded figures like this.

Figure: Kathakali, Red masked.
Image kathakali_rmask

Figure: Kathakali, Green masked.
Image kathakali_gmask

Figure: Kathakali, Blue masked.
Image kathakali_bmask

#include<gtk/gtk.h>

void colormask_picture(GdkPixbuf *pb,gchar color)
{

  int ht,wt;
  int i=0,j=0;
  int rowstride=0;  
  int bpp=0;
  gchar *pixel;


  if(gdk_pixbuf_get_bits_per_sample(pb)!=8)   //we handle only 24 bit images.
  	return;                               //look at 3 bytes per pixel.

  bpp=3;	         	  //getting attributes of height,
  ht=gdk_pixbuf_get_height(pb);   //width, and bpp.Also get pointer
  wt=gdk_pixbuf_get_width(pb);	  //to pixels.
  pixel=gdk_pixbuf_get_pixels(pb);
  rowstride=wt*bpp;

  for(i=0;i<ht;i++)		//iterate over the height of image.
    for(j=0;j<rowstride;j+=bpp)   //read every pixel in the row.skip
				//bpp bytes 
      {	
      
      //access pixel[i][j] as
      // pixel[i*rowstride + j]

      //access red,green and blue as
	switch(color)
	  {
	  case 'r':
	  case 'R':
	    pixel[i*rowstride + j+0]=0x00;//mask red;
	    break;
	  case 'g':
	  case 'G':
	    pixel[i*rowstride + j+1]=0x00;//mask green
	    break;
	  case 'b':
	  case 'B':
	    pixel[i*rowstride + j+2]=0x00;//mask blue;
	  default:
	    pixel[i*rowstride + j+2]=0x00;//mask blue;
	  }	    
      }
  return;
}

% <!-- provide link here-->
% complete working example with glue code in example_colormask.c



Muthiah 2004-06-04