/*
* GridSobelOperator.java
*
* Created on February 6, 2006, 8:56 AM
*
*/
package ika.geo.grid;
import ika.geo.*;
/**
* Sobel edge detection filter.
* @author jenny
*/
public class GridSobelOperator implements GridOperator{
/** Creates a new instance of GridSobelOperator */
public GridSobelOperator() {
}
public String getName() {
return "Sobel";
}
public GeoGrid operate(GeoGrid geoGrid) {
if (geoGrid == null) {
throw new IllegalArgumentException();
}
final int newCols = geoGrid.getCols() - 2;
final int newRows = geoGrid.getRows() - 2;
final double meshSize = geoGrid.getCellSize();
GeoGrid newGrid = new GeoGrid(newCols, newRows, meshSize);
newGrid.setWest(geoGrid.getWest() + meshSize);
newGrid.setNorth(geoGrid.getNorth() + meshSize);
float[][] srcGrid = geoGrid.getGrid();
float[][] dstGrid = newGrid.getGrid();
final int srcRows = geoGrid.getRows();
final int srcCols = geoGrid.getCols();
for (int row = 1; row < srcRows - 1; row++) {
for (int col = 1; col < srcCols - 1; col++) {
/*
* |A B C|
* |D 0 E|
* |F G H|
*/
final float a = srcGrid[row-1][col-1];
final float b = srcGrid[row-1][col];
final float c = srcGrid[row-1][col+1];
final float d = srcGrid[row][col-1];
final float e = srcGrid[row][col+1];
final float f = srcGrid[row+1][col-1];
final float g = srcGrid[row+1][col];
final float h = srcGrid[row+1][col+1];
final float val = (Math.abs(-a-2*b-c+f+2*g+h) +
Math.abs(-c-2*e-h+a+2*d+f)) / 8;
dstGrid[row-1][col-1] = val;
}
}
return newGrid;
}
}