Example #1
0
        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();
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }