package fr.unistra.pelican.algorithms.segmentation;
import fr.unistra.pelican.Algorithm;
import fr.unistra.pelican.AlgorithmException;
import fr.unistra.pelican.DoubleImage;
import fr.unistra.pelican.Image;
import fr.unistra.pelican.algorithms.morphology.generalGray.GeneralGrayDilation;
import fr.unistra.pelican.algorithms.morphology.generalGray.GeneralGrayErosion;
import fr.unistra.pelican.util.Tools;
import fr.unistra.pelican.util.morphology.GrayStructuringElement;
/**
* Implementation of the LipschitzConnexity presented in J. Serra
* A Lattice Approach to Image Segmentation, Journal of Mathematical
* Imaging and Vision, Volume 24 , Issue 1, (January 2006)
* Pages: 83 - 130
* @author Jonathan Weber, Benjamin Perret (Universal Brocking-Class Heroe)
*/
public class LipschitzConnexity extends Algorithm {
/**
* Image to be processed
*/
public Image inputImage;
/**
* Slope of the cone
*/
public double slope;
/**
* Radius of the cone
*/
public int radius;
/**
* Type of the Lipschitz connexity
*/
public int type=byErosion;
/**
* LipschitzConnexity Image
*/
public Image outputImage;
public static final int byErosion = 0;
public static final int byOpening = 1;
public LipschitzConnexity()
{
super.inputs = "inputImage,slope,radius";
super.options = "type";
super.outputs = "outputImage";
}
@Override
public void launch() throws AlgorithmException {
//Constructing the SE
GrayStructuringElement gse = GrayStructuringElement.createConeToZeroStructuringElement(radius, slope);
outputImage = inputImage.copyImage(false);
outputImage.fill(0);
switch(type)
{
case byErosion: Image erosion = GeneralGrayErosion.exec(inputImage,gse);
Image dilation = GeneralGrayDilation.exec(inputImage,gse);
//Viewer2D.exec(erosion,"Erosion");
//Viewer2D.exec(dilation,"Dilation");
for(int i=0;i<inputImage.size();i++)
{
if(Tools.relativeDoubleEquality(inputImage.getPixelDouble(i),erosion.getPixelDouble(i))&&Tools.relativeDoubleEquality(inputImage.getPixelDouble(i),dilation.getPixelDouble(i)))
{
outputImage.setPixelDouble(i, 1.);
}
}
break;
}
}
/**
*
* @param inputImage Image to be processed
* @param slope Slope of the cone (assumed to be given as byte value in [0;255])
* @param radius Radius of the cone
* @return LipschitzConnexity Image
*/
public static Image exec(Image inputImage, int slope, int radius)
{
return (Image) new LipschitzConnexity().process(inputImage, slope*DoubleImage.byteToDouble, radius);
}
/**
*
* @param inputImage Image to be processed
* @param slope Slope of the cone
* @param radius Radius of the cone
* @return LipschitzConnexity Image
*/
public static Image exec(Image inputImage, double slope, int radius)
{
return (Image) new LipschitzConnexity().process(inputImage, slope, radius);
}
}