/*
* This file is part of JGrasstools (http://www.jgrasstools.org)
*
* JGrasstools is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.jgrasstools.gears.modules.r.morpher;
/**
* Some help methods.
*
* @author Andrea Antonello (www.hydrologis.com)
*/
public class MorpherHelp {
public static int[] DEFAULT3X3KERNEL = new int[]{//
/* */1, 1, 1, //
1, 1, 1, //
1, 1, 1//
};
/**
* See: http://www.imagemagick.org/Usage/morphology/#skeleton1
*/
public static int[][] SKELETON1_KERNEL = new int[][]{//
/* */{0, 2, 1, //
0, 1, 1, //
0, 2, 1}, //
/* */{0, 0, 2, //
0, 1, 1, //
2, 1, 1},
//
/* */{0, 0, 0, //
2, 1, 2, //
1, 1, 1}, //
/* */{2, 0, 0, //
1, 1, 0, //
1, 1, 2}, //
/* */{1, 2, 0, //
1, 1, 0, //
1, 2, 0}, //
/* */{1, 1, 2, //
1, 1, 0, //
2, 0, 0}, //
/* */{1, 1, 1, //
2, 1, 2, //
0, 0, 0}, //
/* */{2, 1, 1,//
0, 1, 1, //
0, 0, 2} //
};
/**
* See: http://www.imagemagick.org/Usage/morphology/#skeleton2
*/
public static int[][] SKELETON2_KERNEL = new int[][]{//
/* */{0, 2, 1, //
0, 1, 1, //
0, 2, 1}, //
/* */{0, 0, 2, //
0, 1, 1, //
2, 1, 2}, //
/* */{0, 0, 0, //
2, 1, 2, //
1, 1, 1}, //
/* */{2, 0, 0, //
1, 1, 0, //
2, 1, 2}, //
/* */{1, 2, 0, //
1, 1, 0, //
1, 2, 0}, //
/* */{2, 1, 2, //
1, 1, 0, //
2, 0, 0}, //
/* */{1, 1, 1, //
2, 1, 2, //
0, 0, 0}, //
/* */{2, 1, 2,//
0, 1, 1, //
0, 0, 2} //
};
/**
* See: http://www.imagemagick.org/Usage/morphology/#skeleton2
*/
public static int[][] SKELETON2VARIANT_KERNEL = new int[][]{//
/* */{0, 2, 1, //
0, 1, 1, //
0, 2, 1}, //
/* */{1, 2, 0, //
1, 1, 0, //
1, 2, 0}, //
/* */{1, 1, 1, //
2, 1, 2, //
0, 0, 0}, //
/* */{0, 0, 0, //
2, 1, 2, //
1, 1, 1}, //
// corners
/* */{2, 1, 2,//
0, 1, 1, //
0, 0, 2}, //
/* */{0, 0, 2, //
0, 1, 1, //
2, 1, 2}, //
/* */{2, 0, 0, //
1, 1, 0, //
2, 1, 2}, //
/* */{2, 1, 2, //
1, 1, 0, //
2, 0, 0} //
};
/**
* See: http://www.imagemagick.org/Usage/morphology/#skeleton3
*/
public static int[][] SKELETON3_KERNEL = new int[][]{//
/* */{2, 2, 1, //
0, 1, 1, //
2, 2, 1}, //
/* */{2, 0, 1, //
0, 1, 1, //
2, 0, 2}, //
/* */{2, 0, 0, //
0, 1, 1, //
2, 2, 1}, //
/* */{1, 2, 2, //
1, 1, 0, //
1, 2, 2}, //
/* */{2, 0, 2, //
1, 1, 0, //
1, 2, 2}, //
/* */{1, 2, 2, //
1, 1, 0, //
2, 0, 2}, //
/* */{1, 1, 1, //
2, 1, 2, //
2, 0, 2}, //
/* */{1, 1, 2,//
2, 1, 0, //
2, 0, 2}, //
/* */{2, 1, 1,//
0, 1, 2, //
2, 0, 2}, //
/* */{2, 0, 2,//
2, 1, 2, //
1, 1, 1}, //
/* */{2, 0, 2,//
0, 1, 2, //
2, 1, 1}, //
/* */{2, 0, 2,//
2, 1, 0, //
1, 1, 2} //
};
public static int[][] DEFAULT_PRUNE_KERNEL = new int[][]{//
/* */{0, 0, 0, //
0, 1, 0, //
0, 2, 2}, //
/* */{0, 0, 0, //
2, 1, 0, //
2, 0, 0}, //
/* */{2, 2, 0, //
0, 1, 0, //
0, 0, 0}, //
/* */{0, 0, 2, //
0, 1, 2, //
0, 0, 0}, //
// and reverse way
/* */{0, 0, 0, //
0, 1, 0, //
2, 2, 0}, //
/* */{2, 0, 0, //
2, 1, 0, //
0, 0, 0}, //
/* */{0, 2, 2, //
0, 1, 0, //
0, 0, 0}, //
/* */{0, 0, 0, //
0, 1, 2, //
0, 0, 2} //
};
public static int[][] LINEEND_KERNEL = new int[][]{//
/* */{0, 0, 2, //
0, 1, 1, //
0, 0, 2}, //
/* */{0, 0, 0, //
0, 1, 0, //
2, 1, 2}, //
/* */{2, 0, 0, //
1, 1, 0, //
2, 0, 0}, //
/* */{2, 1, 2, //
0, 1, 0, //
0, 0, 0}, //
/* */{0, 0, 0, //
0, 1, 0, //
0, 0, 1}, //
/* */{0, 0, 0, //
0, 1, 0, //
1, 0, 0}, //
/* */{1, 0, 0, //
0, 1, 0, //
0, 0, 0}, //
/* */{0, 0, 1, //
0, 1, 0, //
0, 0, 0}, //
};
public static int[][] LINEJUNCTIONS_KERNEL = new int[][]{//
/* */{1, 2, 1, //
2, 1, 2, //
2, 1, 2}, //
/* */{2, 1, 2, //
2, 1, 1, //
1, 2, 2}, //
/* */{2, 2, 1, //
1, 1, 2, //
2, 2, 1}, //
/* */{1, 2, 2, //
2, 1, 1, //
2, 1, 2}, //
/* */{2, 1, 2, //
2, 1, 2, //
1, 2, 1}, //
/* */{2, 2, 1, //
1, 1, 2, //
2, 1, 2}, //
/* */{1, 2, 2, //
2, 1, 1, //
1, 2, 2}, //
/* */{2, 1, 2, //
1, 1, 2, //
2, 2, 1}, //
/* */{1, 2, 2, //
2, 1, 2, //
1, 2, 1}, //
/* */{1, 2, 1, //
2, 1, 2, //
1, 2, 2}, //
/* */{1, 2, 1, //
2, 1, 2, //
2, 2, 1}, //
/* */{2, 2, 1, //
2, 1, 2, //
1, 2, 1} //
};
public static int getSquareKernelSide( int[] kernel ) {
double side = Math.sqrt(kernel.length);
if (side % (int) side != 0) {
throw new IllegalArgumentException("The kernel has to be square.");
}
return (int) side;
}
public static int getArrayCenterIndex( int[] kernel ) {
return (int) Math.floor(kernel.length / 2.0);
}
public static int getMatrixCenterIndex( int[][] kernel ) {
return (int) Math.floor(kernel.length / 2.0);
}
public static int[][] getSquareKernelMatrix( int[] squareKernelArray ) {
int squareKernelSide = getSquareKernelSide(squareKernelArray);
int index = 0;
int[][] kernelMatrix = new int[squareKernelSide][squareKernelSide];
for( int r = 0; r < squareKernelSide; r++ ) {
for( int c = 0; c < squareKernelSide; c++ ) {
kernelMatrix[r][c] = squareKernelArray[index++];
}
}
return kernelMatrix;
}
}