package org.geotools.gce.imagemosaic.processing;
import it.geosolutions.imageioimpl.plugins.tiff.TIFFImageReaderSpi;
import java.awt.Rectangle;
import java.awt.image.RenderedImage;
import java.awt.image.renderable.RenderedImageFactory;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageReader;
import javax.imageio.stream.FileImageInputStream;
import javax.media.jai.Histogram;
import javax.media.jai.JAI;
import javax.media.jai.OperationDescriptor;
import javax.media.jai.OperationRegistry;
import javax.media.jai.ROI;
import javax.media.jai.ROIShape;
import javax.media.jai.RenderedOp;
import javax.media.jai.operator.HistogramDescriptor;
import javax.media.jai.registry.RenderedRegistryMode;
import org.geotools.test.TestData;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class ArtifactsFilterTest extends Assert {
@Before
public void setup() throws IOException {
OperationRegistry registry = JAI.getDefaultInstance().getOperationRegistry();
try {
final OperationDescriptor op = new ArtifactsFilterDescriptor();
registry.registerDescriptor(op);
final String descName = op.getName();
final RenderedImageFactory rif = new ArtifactsFilterRIF();
registry.registerFactory(RenderedRegistryMode.MODE_NAME, descName, "org.geotools.gce.imagemosaic.processing", rif);
} catch (Exception e) {
}
}
@Test
public void testArtifact() throws IOException{
TIFFImageReaderSpi spi = new TIFFImageReaderSpi();
File file = TestData.file(this, "filter.tif");
ImageReader reader = null;
FileImageInputStream fis = null;
try {
fis = new FileImageInputStream(file);
reader = spi.createReaderInstance();
reader.setInput(fis);
RenderedImage image = reader.read(0);
RenderedOp histogramOp = HistogramDescriptor.create(image, null, Integer.valueOf(1), Integer.valueOf(1), new int[]{256}, null, null, null);
Histogram histogram = (Histogram) histogramOp.getProperty("histogram");
int[][] bins = histogram.getBins();
assertEquals(bins[0][0],4261);
assertEquals(bins[1][0],4261);
assertEquals(bins[2][0],4832);
assertEquals(bins[0][20],127); // This bin will disappear in the Histogram of the filtered image
assertEquals(bins[1][20],127); // This bin will disappear in the Histogram of the filtered image
assertEquals(bins[2][20],127); // This bin will disappear in the Histogram of the filtered image
assertEquals(bins[0][180],571);
assertEquals(bins[0][200],5041);
assertEquals(bins[2][200],5041);
assertEquals(bins[1][255],5612);
assertEquals(bins[0][0]+bins[1][0]+bins[2][0]+bins[0][20]+bins[1][20]+bins[2][20]+bins[0][180]+bins[0][200]+bins[2][200]+bins[1][255], 100*100*3);
// Image filtering
ROI roi = new ROIShape(new Rectangle(14, 11, 75, 75));
double [] backgroundValues = new double[]{0.0d, 0.0d, 0.0d};
RenderedImage filtered = ArtifactsFilterDescriptor.create(image, roi, backgroundValues, 30, 3, null);
histogramOp = HistogramDescriptor.create(filtered, null, Integer.valueOf(1), Integer.valueOf(1), new int[]{256}, null, null, null);
histogram = (Histogram) histogramOp.getProperty("histogram");
bins = histogram.getBins();
assertEquals(bins[0][0],4375);
assertEquals(bins[1][0],4375);
assertEquals(bins[2][0],4959);
assertEquals(bins[0][180],584);
assertEquals(bins[0][200],5041);
assertEquals(bins[2][200],5041);
assertEquals(bins[1][255],5625);
assertEquals(bins[0][0]+bins[1][0]+bins[2][0]+bins[0][180]+bins[0][200]+bins[2][200]+bins[1][255], 100*100*3);
} finally {
if (fis != null){
try {
fis.close();
} catch (Throwable t){
}
}
if (reader != null){
try {
reader.dispose();
} catch (Throwable t){
}
}
}
}
}