/* * Geotoolkit.org - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2012, Geomatys * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library 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 * Lesser General Public License for more details. */ package org.geotoolkit.image.interpolation; import java.awt.Rectangle; import java.awt.image.Raster; import javax.media.jai.InterpolationBilinear; import org.junit.Assert; import static org.junit.Assert.*; import org.junit.Test; /** * Bilinear Interpolation test. * * @author Remi Marechal (Geomatys). */ public class BilinearTest extends InterpolationTest { Raster raster; public BilinearTest() { super(); interpol = new BilinearInterpolation(pixIterator, ResampleBorderComportement.EXTRAPOLATION, null); } /** * <p>Test interpolate method from biLinear class.<br/><br/> * * Verify that interpolation at Integer pixel position equal pixel position.<br/> * Verify that none-integer pixels position interpolation is between minimum and maximum interpolation values.<br/><br/> * * To find minimum and maximum values :<br/> * - Compute pixels interpolation at nearest integer pixel position and get maximum and minimum values.<br/> * - Find interpolation roots, get roots interpolation values if its possible,<br/> * and get maximum and minimum values from previous maximum and minimum.</p> */ @Test public void globalTest() { InterpolationBilinear jaiInterpol = new InterpolationBilinear(64); raster = renderedImage.getTile(renderedImage.getMinTileX(), renderedImage.getMinTileY()); int minpx = raster.getMinX(); int minpy = raster.getMinY(); int rw = raster.getWidth(); int rh = raster.getHeight(); double min, max, v00, v01, v10, v11, vInter, jaiInter; double[] geotkInter; for (int mpy = minpy; mpy < minpy + rh - 1; mpy++) { for (int mpx = minpx; mpx < minpx +rw - 1; mpx++) { v00 = raster.getSampleDouble(mpx, mpy, 0); v01 = raster.getSampleDouble(mpx+1, mpy, 0); v10 = raster.getSampleDouble(mpx, mpy+1, 0); v11 = raster.getSampleDouble(mpx+1, mpy+1, 0); min = Math.min(Math.min(v00 , v01), Math.min(v10, v11)); max = Math.max(Math.max(v00 , v01), Math.max(v10, v11)); for (double y = mpy; y < mpy + 1; y += 0.1) { for (double x = mpx; x < mpx + 1; x += 0.1) { jaiInter = jaiInterpol.interpolate(v00, v01, v10, v11, (float)(x - mpx), (float)(y - mpy)); //-- Interpolation per sample vInter = interpol.interpolate(x, y, 0); assertTrue("Interpolate value : "+vInter+" should be smaller than maximum : "+max, vInter <= max + 1E-15); assertTrue("Interpolate value : "+vInter+" should be greater than minimum : "+min, vInter >= (min - 1E-15)); assertEquals("Bilinear global test at ("+x+", "+y+") position : ", vInter, jaiInter, 1E-7); //-- Interpolation per pixel geotkInter = interpol.interpolate(x, y); assertTrue("Interpolate value : "+geotkInter[0]+" should be smaller than maximum : "+max, geotkInter[0] <= max + 1E-15); assertTrue("Interpolate value : "+geotkInter[0]+" should be greater than minimum : "+min, geotkInter[0] >= (min - 1E-15)); assertEquals("Bilinear global test at ("+x+", "+y+") position : ", geotkInter[0], jaiInter, 1E-7); } } } } } /** * Test 4 interpolation results near raster lower corner. * X direction coordinate min. * Y direction coordinate min. */ @Test public void lowLCornerTest() { // Interpolation per sample double resulTest = interpol.interpolate(-1, -1.5, 0); assertEquals("lowLCornerTest : at coordinate : (-1, -1.5)", -1.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(-0.5, -1, 0); assertEquals("lowLCornerTest : at coordinate : (-0.5, -1)", 0.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(-1.5, -1, 0); assertEquals("lowLCornerTest : at coordinate : (-1.5, -1)", -0.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(-1, -0.5, 0); assertEquals("lowLCornerTest : at coordinate : (-1, -0.5)", 1.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(-1, -1, 0); assertEquals("lowLCornerTest : at coordinate : (-1, -1)", 0, resulTest, TOLERANCE); // Interpolation per pixel resulTest = interpol.interpolate(-1, -1.5)[0]; assertEquals("lowLCornerTest : at coordinate : (-1, -1.5)", -1.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(-0.5, -1)[0]; assertEquals("lowLCornerTest : at coordinate : (-0.5, -1)", 0.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(-1.5, -1)[0]; assertEquals("lowLCornerTest : at coordinate : (-1.5, -1)", -0.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(-1, -0.5)[0]; assertEquals("lowLCornerTest : at coordinate : (-1, -0.5)", 1.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(-1, -1)[0]; assertEquals("lowLCornerTest : at coordinate : (-1, -1)", 0, resulTest, TOLERANCE); } /** * Test 4 interpolation results near raster lower right corner. * X direction coordinate max. * Y direction coordinate min. */ @Test public void lowRCornerTest() { // Interpolation per sample double resulTest = interpol.interpolate(0, -1.5, 0); assertEquals("lowRCornerTest : at coordinate : (0, -1.5)", -0.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(1, -1.5, 0); assertEquals("lowRCornerTest : at coordinate : (1, -1.5)", 0.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(0.5, 0, 0); assertEquals("lowRCornerTest : at coordinate : (0.5, 0)", 4.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(0, -1, 0); assertEquals("lowRCornerTest : at coordinate : (0, -1)", 1, resulTest, TOLERANCE); // Interpolation per pixel resulTest = interpol.interpolate(0, -1.5)[0]; assertEquals("lowRCornerTest : at coordinate : (0, -1.5)", -0.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(1, -1.5)[0]; assertEquals("lowRCornerTest : at coordinate : (1, -1.5)", 0.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(0.5, 0)[0]; assertEquals("lowRCornerTest : at coordinate : (0.5, 0)", 4.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(0, -1)[0]; assertEquals("lowRCornerTest : at coordinate : (0, -1)", 1, resulTest, TOLERANCE); } /** * Test 4 interpolation results near raster upper left corner. * X direction coordinate min. * Y direction coordinate max. */ @Test public void uppLCornerTest() { // Interpolation per sample double resulTest = interpol.interpolate(-1, 0.5, 0); assertEquals("uppLCornerTest : at coordinate : (-1, 0.5)", 4.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(-1.5, 0, 0); assertEquals("uppLCornerTest : at coordinate : (-1.5, 0)", 2.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(0, 0.5, 0); assertEquals("uppLCornerTest : at coordinate : (0, 0.5)", 5.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(-1.5, 1, 0); assertEquals("uppLCornerTest : at coordinate : (-1.5, 1)", 5.5, resulTest, TOLERANCE); // Interpolation per pixel resulTest = interpol.interpolate(-1, 0.5)[0]; assertEquals("uppLCornerTest : at coordinate : (-1, 0.5)", 4.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(-1.5, 0)[0]; assertEquals("uppLCornerTest : at coordinate : (-1.5, 0)", 2.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(0, 0.5)[0]; assertEquals("uppLCornerTest : at coordinate : (0, 0.5)", 5.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(-1.5, 1)[0]; assertEquals("uppLCornerTest : at coordinate : (-1.5, 1)", 5.5, resulTest, TOLERANCE); } /** * Test 4 interpolation results near raster upper corner. * X direction coordinate max. * Y direction coordinate max. */ @Test public void uppRCornerTest() { // Interpolation per sample double resulTest = interpol.interpolate(0, -0.5, 0); assertEquals("uppRCornerTest : at coordinate : (0, -0.5)", 2.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(0.5, 0, 0); assertEquals("uppRCornerTest : at coordinate : (0.5, 0)", 4.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(1, 0.5, 0); assertEquals("uppRCornerTest : at coordinate : (1, 0.5)", 6.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(0.5, 1, 0); assertEquals("uppRCornerTest : at coordinate : (0.5, 1)", 7.5, resulTest, TOLERANCE); // Interpolation per pixel resulTest = interpol.interpolate(0, -0.5)[0]; assertEquals("uppRCornerTest : at coordinate : (0, -0.5)", 2.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(0.5, 0)[0]; assertEquals("uppRCornerTest : at coordinate : (0.5, 0)", 4.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(1, 0.5)[0]; assertEquals("uppRCornerTest : at coordinate : (1, 0.5)", 6.5, resulTest, TOLERANCE); resulTest = interpol.interpolate(0.5, 1)[0]; assertEquals("uppRCornerTest : at coordinate : (0.5, 1)", 7.5, resulTest, TOLERANCE); } /** * Test about interpolation coordinate out of iterate object boundary. */ @Test public void minMaxTest() { double[] minMax = interpol.getMinMaxValue(null); assertTrue(minMax[0] == 0); assertTrue(minMax[1] == -1);//x coordinate assertTrue(minMax[2] == -1);//y coordinate assertTrue(minMax[3] == 8); assertTrue(minMax[4] == 1);//x coordinate assertTrue(minMax[5] == 1);//y coordinate assertTrue(minMax == interpol.getMinMaxValue(null)); try { interpol.getMinMaxValue(new Rectangle(-2, -1, 3, 3)); Assert.fail("test should had failed"); } catch(Exception e) { //ok } } }