コード例 #1
0
        /// <summary>
        /// Haar Wavelet Transform and Compress
        /// </summary>
        /// <param name="m">matrix (logSpectrogram)</param>
        /// <returns>matrix wavelet'ed</returns>
        public Matrix ApplyWaveletCompression(ref Matrix m, out int lastHeight, out int lastWidth)
        {
            using (new DebugTimer("ApplyWaveletCompression(matrix)")) {
                // Wavelet Transform
                Matrix wavelet = m.Copy();
                WaveletCompress.HaarTransform2D(wavelet.MatrixData, numberWaveletTransforms, out lastHeight, out lastWidth);

                // Compress
                Matrix waveletCompressed = wavelet.Resize(numberCoefficients, wavelet.Columns);

                return(waveletCompressed);
            }
        }
コード例 #2
0
ファイル: WaveletTest.cs プロジェクト: superowner/CommonUtils
        public static void TestHaarInputOutput(string imageInPath)
        {
            var image = ReadImageGrayscale(imageInPath);

            #region Wavelet Compress Methods
            // Test HaarWaveletTransform
            var inputMatrix = new Matrix(image);
            inputMatrix.WriteCSV("haar-before.csv");
            HaarWaveletTransform.HaarTransform2D(image, inputMatrix.Rows, inputMatrix.Columns);

            Matrix haarMatrixInverse = inputMatrix.Copy();
            HaarWaveletTransform.InverseHaarTransform2D(haarMatrixInverse.MatrixData, haarMatrixInverse.Rows, haarMatrixInverse.Columns);
            haarMatrixInverse.WriteCSV("haar-after.csv");
            haarMatrixInverse.DrawMatrixImage("haar-transform-forward-and-backward.png", -1, -1, false);

            // Test Wavelet Compress and Decompress in one step
            const int compLevels   = 8;
            const int compTreshold = 150;

            Matrix haarMatrixCompDecomp = haarMatrixInverse.Copy();
            WaveletComDec.CompressDecompress2D(haarMatrixCompDecomp.MatrixData, compLevels, compTreshold);
            haarMatrixCompDecomp.DrawMatrixImage("haar-compress-and-decompress-combined.png", -1, -1, false);

            // Test Compress and Decompress in two steps
            int    lastHeight     = 0;
            int    lastWidth      = 0;
            Matrix haarMatrixComp = haarMatrixInverse.Copy();
            WaveletCompress.Compress2D(haarMatrixComp.MatrixData, compLevels, compTreshold, out lastHeight, out lastWidth);
            WaveletDecompress.Decompress2D(haarMatrixComp.MatrixData, compLevels, lastHeight, lastWidth);
            haarMatrixComp.DrawMatrixImage("haar-compress-and-decompress.png", -1, -1, false);
            #endregion

            #region Test using HaarCSharp

            // Test HaarCSharp using iterations
            const int haarCSharpIterations = 3;
            Matrix    haarMatrixCSharp     = haarMatrixInverse.Copy();
            ForwardWaveletTransform.Transform2D(haarMatrixCSharp.MatrixData, false, haarCSharpIterations);
            haarMatrixCSharp.DrawMatrixImage("haar-forward.png", -1, -1, false);
            InverseWaveletTransform.Transform2D(haarMatrixCSharp.MatrixData, false, haarCSharpIterations);
            haarMatrixCSharp.DrawMatrixImage("haar-inverse.png", -1, -1, false);

            // Test HaarCSharp using all levels and only 1 iteration
            Matrix haarMatrixCSharpAll = haarMatrixInverse.Copy();
            ForwardWaveletTransform.Transform2D(haarMatrixCSharpAll.MatrixData, true, 1);
            haarMatrixCSharpAll.DrawMatrixImage("haar-forward-all.png", -1, -1, false);
            InverseWaveletTransform.Transform2D(haarMatrixCSharpAll.MatrixData, true, 1);
            haarMatrixCSharpAll.DrawMatrixImage("haar-inverse-all.png", -1, -1, false);
            #endregion
        }
コード例 #3
0
ファイル: TileCanvas.cs プロジェクト: i-e-b/Slick
        private void WriteTileToBackingStoreSync(PositionKey key, CachedTile tile)
        {
            if (key == null)
            {
                return;
            }

            if (tile == null)
            {
                return;
            }
            if (tile.State == TileState.Locked)
            {
                return;
            }


            var red   = RawDataPool.Capture();
            var green = RawDataPool.Capture();
            var blue  = RawDataPool.Capture();

            try
            {
                var name = key.ToString();

                if (tile.ImageIsBlank())
                {
                    _tileStore.Delete(name, "img");
                    tile.SetState(TileState.Empty);
                }
                else
                {
                    var packed = tile.GetTileData();
                    if (packed == null)
                    {
                        return;
                    }

                    var end = TileImageSize * TileImageSize;
                    for (int i = 0; i < end; i++)
                    {
                        blue[i]  = packed[4 * i + 0];
                        green[i] = packed[4 * i + 1];
                        red[i]   = packed[4 * i + 2];
                    }

                    using (var ms = new MemoryStream())
                    {
                        WaveletCompress.Compress(red, green, blue, tile.Width, tile.Height).WriteToStream(ms);
                        ms.Seek(0, SeekOrigin.Begin);
                        var ok = _tileStore.Store(name, "img", ms);

                        if (ok.IsFailure)
                        {
                            throw new Exception("Storage error: DB might be corrupt.", ok.FailureCause);
                        }
                    }
                }
            }
            finally
            {
                RawDataPool.Release(red);
                RawDataPool.Release(green);
                RawDataPool.Release(blue);
            }
        }
コード例 #4
0
ファイル: TileCanvas.cs プロジェクト: i-e-b/Slick
        private void LoadTileDataSync(PositionKey key, ICachedTile tile)
        {
            var red   = RawDataPool.Capture();
            var green = RawDataPool.Capture();
            var blue  = RawDataPool.Capture();

            try
            {
                if (key == null || tile == null)
                {
                    return;
                }

                var name = key.ToString();
                var res  = _tileStore.Exists(name);
                if (res.IsFailure)
                {
                    tile.SetState(TileState.Empty);
                    return;
                }

                var version = res.ResultData?.CurrentVersion ?? 1;
                var img     = _tileStore.Read(name, "img", version);

                if (img.IsFailure || img.ResultData == null)
                {
                    tile.SetState(TileState.Empty);
                    return;
                }

                var fileData = InterleavedFile.ReadFromStream(img.ResultData);
                if (fileData != null)
                {
                    WaveletCompress.Decompress(fileData, red, green, blue, 1);
                }

                tile.EnsureDataReady();
                var packed = tile.GetTileData() ?? throw new Exception("Byte pool allocation failed");

                var end = TileImageSize * TileImageSize;
                for (int i = 0; i < end; i++)
                {
                    packed[4 * i + 0] = blue[i];
                    packed[4 * i + 1] = green[i];
                    packed[4 * i + 2] = red[i];

                    if (blue[i] >= 254 && green[i] >= 254 && red[i] >= 254)
                    {
                        packed[4 * i + 3] = 0;
                    }
                    else
                    {
                        packed[4 * i + 3] = 255;
                    }
                }

                tile.SetState(TileState.Ready);
            }
            catch (Exception ex)
            {
                Logging.WriteLogMessage("Failed to load tile data\r\n" + ex);
                tile?.MarkCorrupted();
            }
            finally {
                RawDataPool.Release(red);
                RawDataPool.Release(green);
                RawDataPool.Release(blue);
            }
        }
コード例 #5
0
ファイル: WaveletTest.cs プロジェクト: superowner/CommonUtils
        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);
        }