topical media & game development

talk show tell print

graphic-processing-learning-15-example-15-13-example-15-13.pde / pde



  // Learning Processing
  // Daniel Shiffman
  // http://www.learningprocessing.com
  
  // Example 15-13: Sharpen with convolution
  
  PImage img;
  int w = 80;
  // The convolution matrix for a "sharpen" effect stored as a 3 x 3 two-dimensional array.
  float[][] matrix = { { -1, -1, -1 } , 
                       { -1, 9, -1 } ,
                       { -1, -1, -1 } } ;
  
  void setup() {
    size(200,200);
    img = loadImage( "sunflower.jpg" );
  }
  
  void draw() {
    
    // We're only going to process a portion of the image
    // so let's set the whole image as the background first
    image(img,0,0);
    
    // In this example we are only processing a section of the image-an 80 x 80 rectangle around the mouse location.  
    int xstart = constrain(mouseX-w/2,0,img.width); 
    int ystart = constrain(mouseY-w/2,0,img.height);
    int xend = constrain(mouseX + w/2,0,img.width);
    int yend = constrain(mouseY + w/2,0,img.height);
    int matrixsize = 3;
    
    loadPixels();
    // Begin our loop for every pixel
    for (int x = xstart; x < xend; x++ ) {
      for (int y = ystart; y < yend; y++ ) {
        // Each pixel location (x,y) gets passed into a function called convolution()
        // The convolution() function returns a new color to be displayed.
        color c = convolution(x,y,matrix,matrixsize,img); 
        int loc = x + y*img.width;
        pixels[loc] = c;
      }
    }
    updatePixels();
    stroke(0);
    noFill();
    rect(xstart,ystart,w,w);
  }
  
  color convolution(int x, int y, float[][] matrix, int matrixsize, PImage img) {
    float rtotal = 0.0;
    float gtotal = 0.0;
    float btotal = 0.0;
    int offset = matrixsize / 2;
    
    // Loop through convolution matrix
    for (int i = 0; i < matrixsize; i++ ) {
      for (int j = 0; j < matrixsize; j++ ) {
        
        // What pixel are we testing
        int xloc = x + i-offset;
        int yloc = y + j-offset;
        int loc = xloc + img.width*yloc;
        
        // Make sure we haven't walked off the edge of the pixel array
        // It is often good when looking at neighboring pixels to make sure we have not gone off the edge of the pixel array by accident.
        loc = constrain(loc,0,img.pixels.length-1);
        
        // Calculate the convolution
        // We sum all the neighboring pixels multiplied by the values in the convolution matrix.
        rtotal += (red(img.pixels[loc]) * matrix[i][j]);
        gtotal += (green(img.pixels[loc]) * matrix[i][j]);
        btotal += (blue(img.pixels[loc]) * matrix[i][j]);
      }
    }
    
    // Make sure RGB is within range
    rtotal = constrain(rtotal,0,255);
    gtotal = constrain(gtotal,0,255);
    btotal = constrain(btotal,0,255);
    
    // Return the resulting color
    return color(rtotal,gtotal,btotal); 
  }
  


(C) Æliens 20/2/2008

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.