123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- // Mike Scott
- // 2d array manipulation examples
-
- //import
- import java.awt.Color;
-
-
- public class FilterExample
- {
- /*
- *pre: image != null, image.length > 1, image[0].length > 1
- * image is a rectangular matrix, neighberhoodSize > 0
- *post: return a smoothed version of image
- */
- public Color[][] smooth(Color[][] image, int neighberhoodSize)
- { //check precondition
- assert image != null && image.length > 1 && image[0].length > 1
- && ( neighberhoodSize > 0 ) && rectangularMatrix( image )
- : "Violation of precondition: smooth";
-
- Color[][] result = new Color[image.length][image[0].length];
-
- for(int row = 0; row < image.length; row++)
- { for(int col = 0; col < image[0].length; col++)
- { result[row][col] = aveOfNeighbors(image, row, col, neighberhoodSize);
- }
- }
-
- return result;
- }
-
-
- // helper method that determines the average color of a neighberhood
- // around a particular cell.
- private Color aveOfNeighbors(Color[][] image, int row, int col, int neighberhoodSize)
- { int numNeighbors = 0;
- int red = 0;
- int green = 0;
- int blue = 0;
-
- for(int r = row - neighberhoodSize; r <= row + neighberhoodSize; r++)
- { for(int c = col - neighberhoodSize; c <= col + neighberhoodSize; c++)
- { if( inBounds( image, r, c ) )
- { numNeighbors++;
- red += image[r][c].getRed();
- green += image[r][c].getGreen();
- blue += image[r][c].getBlue();
- }
- }
- }
-
- assert numNeighbors > 0;
- return new Color( red / numNeighbors, green / numNeighbors, blue / numNeighbors );
- }
-
- //helper method to determine if given coordinates are in bounds
- private boolean inBounds(Color[][] image, int row, int col)
- { return (row >= 0) && (row <= image.length) && (col >= 0)
- && (col < image[0].length);
- }
-
- //private method to ensure mat is rectangular
- private boolean rectangularMatrix( Color[][] mat )
- { boolean isRectangular = true;
- int row = 1;
- final int COLUMNS = mat[0].length;
-
- while( isRectangular && row < mat.length )
- { isRectangular = ( mat[row].length == COLUMNS );
- row++;
- }
-
- return isRectangular;
- }
- }
|