public static void TestHaarWaveletDecomposition() { Console.WriteLine(); Console.WriteLine("The Standard 2D HaarWaveletDecomposition method (Tensor)"); var haar = new StandardHaarWaveletDecomposition(); double[][] mat = Get2DTestData(); haar.DecomposeImageInPlace(mat); var result = new Matrix(mat); result.PrintPretty(); Console.WriteLine(); Console.WriteLine("The Non Standard 2D HaarWaveletDecomposition method (JPEG 2000)"); var haarNonStandard = new NonStandardHaarWaveletDecomposition(); mat = Get2DTestData(); haarNonStandard.DecomposeImageInPlace(mat); var resultNonStandard = new Matrix(mat); resultNonStandard.PrintPretty(); }
public void ShouldDecomposeAsExpected() { var wd = new StandardHaarWaveletDecomposition(); var floats = new[] { 8f, 4, 1, 3 }; wd.DecomposeImageInPlace(floats, 1, 4, 2d); // Let's use 2 as norm, to reconstruct the result more easily CollectionAssert.AreEqual(new[] { 4, 2, 2, -1 }, floats); }
public void StandardDecompositionTest() { const int rows = 128; const int cols = 32; float[][] frames = new float[rows][]; float[] concatenated = new float[rows * cols]; for (int i = 0; i < rows; i++) { frames[i] = TestUtilities.GenerateRandomSingleArray(cols, i); Buffer.BlockCopy(frames[i], 0, concatenated, sizeof(float) * i * cols, sizeof(float) * cols); } AssertAreSame(rows, cols, frames, concatenated); var waveletDecomposition = new StandardHaarWaveletDecomposition(); waveletDecomposition.DecomposeImageInPlace(concatenated, rows, cols, 1d); DecomposeImageLocal(frames); AssertAreSame(rows, cols, frames, concatenated); }
public static Matrix GetWaveletTransformedMatrix(double[][] image, WaveletMethod waveletMethod) { int width = image[0].Length; int height = image.Length; Matrix dwtMatrix = null; Stopwatch stopWatch = Stopwatch.StartNew(); long startS = stopWatch.ElapsedTicks; switch (waveletMethod) { case WaveletMethod.Haar: Haar.Haar2D(image, height, width); dwtMatrix = new Matrix(image); break; case WaveletMethod.HaarTransformTensor: // This is using the tensor product layout dwtMatrix = WaveletUtils.HaarWaveletTransform2D(image); break; case WaveletMethod.HaarWaveletDecompositionTensor: // This is using the tensor product layout var haar = new StandardHaarWaveletDecomposition(); haar.DecomposeImageInPlace(image); dwtMatrix = new Matrix(image); break; case WaveletMethod.NonStandardHaarWaveletDecomposition: // JPEG 2000 var haarNonStandard = new NonStandardHaarWaveletDecomposition(); haarNonStandard.DecomposeImageInPlace(image); dwtMatrix = new Matrix(image); break; case WaveletMethod.HaarCSharp: ForwardWaveletTransform.Transform2D(image, false, 2); dwtMatrix = new Matrix(image); break; case WaveletMethod.HaarWaveletCompress: int lastHeight = 0; int lastWidth = 0; WaveletCompress.HaarTransform2D(image, 10000, out lastHeight, out lastWidth); dwtMatrix = new Matrix(image); break; default: break; } long endS = stopWatch.ElapsedTicks; Console.WriteLine("WaveletMethod: {0} Time in ticks: {1}", Enum.GetName(typeof(WaveletMethod), waveletMethod), (endS - startS)); // increase all values const int mul = 50; double[][] haarImageNormalized5k = dwtMatrix.MatrixData.Select(i => i.Select(j => j * mul).ToArray()).ToArray(); // convert to byte values (0 - 255) // duplicate the octave/ matlab method uint8 var uint8 = new double[haarImageNormalized5k.Length][]; for (int i = 0; i < haarImageNormalized5k.Length; i++) { uint8[i] = new double[haarImageNormalized5k.Length]; for (int j = 0; j < haarImageNormalized5k[i].Length; j++) { double v = haarImageNormalized5k[i][j]; if (v > 255) { uint8[i][j] = 255; } else if (v < 0) { uint8[i][j] = 0; } else { uint8[i][j] = (byte)haarImageNormalized5k[i][j]; } } } var uint8Matrix = new Matrix(uint8); return(uint8Matrix); }