package fr.unistra.pelican.algorithms.morphology.fuzzy;
import fr.unistra.pelican.Algorithm;
import fr.unistra.pelican.AlgorithmException;
import fr.unistra.pelican.Image;
import fr.unistra.pelican.util.morphology.GrayStructuringElement;
import fr.unistra.pelican.util.morphology.complements.FuzzyComplement;
import fr.unistra.pelican.util.morphology.fuzzyNorms.FuzzyNorm;
import fr.unistra.pelican.util.morphology.fuzzyNorms.FuzzyTCoNorm;
import fr.unistra.pelican.util.morphology.fuzzyNorms.FuzzyTNorm;
/**
* Fuzzy closing as defined by Bloch and Maitre
* Works with double image with values in [0;1]
* @author Benjamin Perret
*/
public class FuzzyClosing extends Algorithm {
/**
* Input image
*/
public Image inputImage;
/**
* Structuring function
*/
public GrayStructuringElement se;
/**
* Fuzzy norm
*/
public FuzzyNorm n;
private FuzzyTNorm t;
private FuzzyTCoNorm s;
/**
* Complementing function
*/
public FuzzyComplement c;
/**
* Result of closing
*/
public Image outputImage;
/**
* Constructor
*
*/
public FuzzyClosing() {
super();
super.inputs = "inputImage,se,n,c";
super.outputs = "outputImage";
}
/*
* (non-Javadoc)
*
* @see fr.unistra.pelican.Algorithm#launch()
*/
public void launch() throws AlgorithmException {
s=n;
t=n;
outputImage = (Image) new FuzzyDilation().process(inputImage, se, t);
outputImage = (Image) new FuzzyErosion().process(outputImage, se, s, c);
}
/*
public static void main(String[] args) {
GrayStructuringElement se = new GrayStructuringElement(7, 7, new Point(
3, 3));
double vals[] = GaussianMask.createLinearMask(11, 0.05);
double vals2[] = { 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0 };
se.setPixels(vals);
FuzzyStandardNorm t = new FuzzyStandardNorm();
FuzzyComplement c = new FuzzyStandardComplement();
Image im = (Image) new ImageLoader().process("samples/lennaGray256.png");
new Viewer2D().process(im, "op");
im = (Image) new FuzzyClosing().process(im, se, t, c);
new Viewer2D().process(im, "la");
new ImageSave().process(im, "res.jpg");
}*/
/**
* Fuzzy closing as defined by Bloch and Maitre
* Works with double image with values in [0;1]
* @param inputImage Input image
* @param se Structuring function
* @param n Fuzzy Norm
* @param c Complement function
* @return Closed image
*/
public static Image exec(Image inputImage, GrayStructuringElement se, FuzzyNorm n, FuzzyComplement c)
{
return (Image) new FuzzyClosing().process(inputImage,se,n,c);
}
}