/* * Copyright (c) 2011-2016, Peter Abeles. All Rights Reserved. * * This file is part of BoofCV (http://boofcv.org). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package boofcv.alg.transform.wavelet; import boofcv.alg.misc.GImageMiscOps; import boofcv.core.image.GeneralizedImageOps; import boofcv.core.image.border.BorderIndex1D_Reflect; import boofcv.core.image.border.BorderIndex1D_Wrap; import boofcv.core.image.border.BorderType; import boofcv.struct.image.GrayF32; import boofcv.struct.image.GrayS32; import boofcv.struct.image.ImageDimension; import boofcv.struct.image.ImageGray; import boofcv.struct.wavelet.WlCoef_F32; import org.junit.Test; import java.util.Random; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; /** * @author Peter Abeles */ public class TestUtilWavelet { Random rand = new Random(234); @Test public void checkShape_positive() { GrayF32 orig = new GrayF32(10,20); GrayF32 transformed = new GrayF32(10,20); UtilWavelet.checkShape(orig,transformed); orig = new GrayF32(9,19); UtilWavelet.checkShape(orig,transformed); } @Test public void checkShape_negative() { GrayF32 orig = new GrayF32(9,19); GrayF32 transformed = new GrayF32(19,19); try { UtilWavelet.checkShape(orig,transformed); fail("transformed image can't be odd"); } catch( IllegalArgumentException e ){} orig = new GrayF32(12,22); transformed = new GrayF32(10,20); try { UtilWavelet.checkShape(orig,transformed); fail("Image are not compatible shapes"); } catch( IllegalArgumentException e ){} } @Test public void computeEnergy_F32() { float[] a = new float[]{-2,3,4.67f,7,-10.2f}; assertEquals(187.8489f,UtilWavelet.computeEnergy(a),1e-4f); } @Test public void computeEnergy_I32() { int[] a = new int[]{-2,3,4,7,-10}; assertEquals(11.125f,UtilWavelet.computeEnergy(a,4),1e-4f); } @Test public void sumCoefficients_F32() { float[] a = new float[]{-2,3,4,7,-10}; assertEquals(2f,UtilWavelet.sumCoefficients(a),1e-4f); } @Test public void borderForwardUpper() { checkForwardUpper(0,0,2,2,10,0); checkForwardUpper(0,0,3,3,10,2); checkForwardUpper(0,0,4,4,10,2); checkForwardUpper(0,0,5,5,10,4); checkForwardUpper(-1,-1,5,5,10,2); checkForwardUpper(-1,-1,4,4,10,2); checkForwardUpper(-1,0,4,2,10,2); checkForwardUpper(0,0,2,2,11,1); checkForwardUpper(0,0,3,3,11,1); checkForwardUpper(0,0,4,4,11,3); } private void checkForwardUpper( int offsetA , int offsetB , int lengthA , int lengthB , int dataLength , int expected ) { WlCoef_F32 desc = new WlCoef_F32(); desc.offsetScaling = offsetA; desc.offsetWavelet = offsetB; desc.scaling = new float[lengthA]; desc.wavelet = new float[lengthB]; assertEquals(expected,UtilWavelet.borderForwardUpper(desc,dataLength)); } @Test public void borderForwardLower() { checkForwardLower(0,0,0); checkForwardLower(-1,0,2); checkForwardLower(0,-1,2); checkForwardLower(-2,0,2); checkForwardLower(0,-2,2); checkForwardLower(-3,0,4); checkForwardLower(0,-3,4); checkForwardLower(-3,0,4); checkForwardLower(-4,-4,4); } private void checkForwardLower( int offsetA , int offsetB , int expected ) { WlCoef_F32 desc = new WlCoef_F32(); desc.offsetScaling = offsetA; desc.offsetWavelet = offsetB; assertEquals(expected,UtilWavelet.borderForwardLower(desc)); } @Test public void convertToType() { assertEquals(BorderType.REFLECT,UtilWavelet.convertToType(new BorderIndex1D_Reflect())); assertEquals(BorderType.WRAP,UtilWavelet.convertToType(new BorderIndex1D_Wrap())); } /** * Just see if it blows up */ @Test public void adjustForDisplay() { adjustForDisplay(GrayF32.class); adjustForDisplay(GrayS32.class); } public <T extends ImageGray> void adjustForDisplay( Class<T> imageType ) { ImageDimension d = UtilWavelet.transformDimension(320, 240, 3); T b = GeneralizedImageOps.createSingleBand(imageType,d.width,d.height); GImageMiscOps.fillUniform(b, rand, 0, 200); UtilWavelet.adjustForDisplay(b,3,255); } }