public static List <double[]> ReadFrameData(DirectoryInfo dataDir, string fileStem, TimeSpan startTime, TimeSpan maxDuration, SpectrogramZoomingConfig zoomingConfig, TimeSpan indexGenerationSegmentDuration)
        {
            TimeSpan endTime     = startTime + maxDuration;
            int      startMinute = (int)Math.Floor(startTime.TotalMinutes);
            int      endMinute   = (int)Math.Ceiling(endTime.TotalMinutes);

            int expectedDataDurationInSeconds = (int)indexGenerationSegmentDuration.TotalSeconds;
            int expectedFrameCount            = (int)Math.Round(expectedDataDurationInSeconds / zoomingConfig.SpectralFrameDuration);

            string name            = fileStem + "_" + startMinute + "min.csv";
            string csvPath         = Path.Combine(dataDir.FullName, name);
            bool   skipHeader      = true;
            bool   skipFirstColumn = true;

            List <double[]> frameData = CsvTools.ReadCSVFileOfDoubles(csvPath, skipHeader, skipFirstColumn);

            ZoomTiledSpectrograms.PadEndOfListOfFrames(frameData, expectedFrameCount);
            for (int i = startMinute + 1; i < endMinute; i++)
            {
                name    = fileStem + "_" + i + "min.csv";
                csvPath = Path.Combine(dataDir.FullName, name);

                List <double[]> data = CsvTools.ReadCSVFileOfDoubles(csvPath, skipHeader, skipFirstColumn);
                ZoomTiledSpectrograms.PadEndOfListOfFrames(data, expectedFrameCount);

                frameData.AddRange(data);
            }

            return(frameData);
        }
Ejemplo n.º 2
0
        public void TestGetPreviousTileBoundary(string startDate, int tileWidth, double scale, string expectedDate)
        {
            var start = DateTimeOffset.Parse(startDate);

            var actual = ZoomTiledSpectrograms.GetPreviousTileBoundary(tileWidth, scale, start);

            var expected = DateTimeOffset.Parse(expectedDate);

            Assert.AreEqual(expected, actual);
        }
Ejemplo n.º 3
0
        private static void TileOutput(DirectoryInfo outputDirectory, string fileStem, string analysisTag, FileSegment fileSegment, Image <Rgb24> image)
        {
            const int TileHeight = 256;
            const int TileWidth  = 60;

            // seconds per pixel
            const double Scale = 60.0;
            TimeSpan     scale = Scale.Seconds();

            if (image.Height != TileHeight)
            {
                throw new InvalidOperationException("Expecting images exactly the same height as the defined tile height");
            }

            // if recording does not start on an absolutely aligned hour of the day
            // align it, then adjust where the tiling starts from, and calculate the offset for the super tile (the gap)
            var recordingStartDate = fileSegment.TargetFileStartDate.Value;

            // TODO: begin remove duplicate code
            var timeOfDay            = recordingStartDate.TimeOfDay;
            var previousAbsoluteHour = TimeSpan.FromSeconds(Math.Floor(timeOfDay.TotalSeconds / (Scale * TileWidth)) * (Scale * TileWidth));
            var gap              = timeOfDay - previousAbsoluteHour;
            var tilingStartDate  = recordingStartDate - gap;
            var tilingStartDate2 = ZoomTiledSpectrograms.GetPreviousTileBoundary(TileWidth, Scale, recordingStartDate);
            var padding          = recordingStartDate - tilingStartDate2;

            Debug.Assert(tilingStartDate == tilingStartDate2, "tilingStartDate != tilingStartDate2: these methods should be equivalent");

            // TODO: end remove duplicate code

            var tilingProfile = new AbsoluteDateTilingProfile(fileStem, analysisTag, tilingStartDate, TileHeight, TileWidth);

            // pad out image so it produces a whole number of tiles
            // this solves the asymmetric right padding of short audio files
            var width = (int)(Math.Ceiling(image.Width / Scale) * Scale);
            var tiler = new Tiler(outputDirectory, tilingProfile, Scale, width, 1.0, image.Height);

            // prepare super tile
            var tile = new TimeOffsetSingleLayerSuperTile(
                padding,
                SpectrogramType.Index,
                scale,
                image.CloneAs <Rgba32>(),
                fileSegment.SegmentStartOffset ?? TimeSpan.Zero);

            tiler.Tile(tile);
        }
        public void TestLeftPaddingInLowerLayers()
        {
            const int TileWidth = 180;
            var       startDate = new DateTimeOffset(2014, 05, 29, 08, 13, 58, TimeSpan.FromHours(10));
            var       boundary  = ZoomTiledSpectrograms.GetPreviousTileBoundary(TileWidth, 0.1, startDate);
            var       padding   = startDate - boundary;

            var profile = new AbsoluteDateTilingProfile(
                "Filename",
                "Tile",
                boundary,
                256,
                TileWidth);

            var tiler = new Tiler(
                this.outputDirectory.ToDirectoryEntry(),
                profile,
                new SortedSet <double>()
            {
                60.0, 0.1
            },
                60.0,
                1440,
                new SortedSet <double>()
            {
                1, 1
            },
                1.0,
                256);

            var testBitmap = new Bitmap(1200, 256);

            using (var graphics = Graphics.FromImage(testBitmap))
            {
                var points = new[]
                {
                    new Point(0, 0), new Point(180, 256), new Point(360, 0), new Point(540, 256), new Point(720, 0),
                    new Point(900, 256), new Point(1080, 0), new Point(1260, 256),
                };
                graphics.DrawLines(
                    Pens.Red,
                    points);
            }

            var superTile = new TimeOffsetSingleLayerSuperTile(
                padding,
                SpectrogramType.Index,
                0.1.Seconds(),
                testBitmap,
                0.Seconds());

            tiler.Tile(superTile);

            ////Debug.WriteLine(this.outputDirectory.FullName);
            ////Debug.WriteLine(this.outputDirectory.GetFiles().Length);
            var actualFiles = this.outputDirectory.GetFiles().OrderBy(x => x.Name).ToArray();

            Assert.AreEqual(8, actualFiles.Length);

            var expectedFiles = new[]
            {
                "Filename__Tile_20140528T221348Z_0.1.png",
                "Filename__Tile_20140528T221406Z_0.1.png",
                "Filename__Tile_20140528T221424Z_0.1.png",
                "Filename__Tile_20140528T221442Z_0.1.png",
                "Filename__Tile_20140528T221500Z_0.1.png",
                "Filename__Tile_20140528T221518Z_0.1.png",
                "Filename__Tile_20140528T221536Z_0.1.png",
                "Filename__Tile_20140528T221554Z_0.1.png",
            };
            var expectedImages =
                expectedFiles
                .OrderBy(x => x)
                .Select((x, i) => testBitmap.Crop(new Rectangle((i * TileWidth) - 100, 0, TileWidth, 256)))
                .ToArray();

            for (var i = 0; i < expectedImages.Length; i++)
            {
                Assert.AreEqual(expectedFiles[i], actualFiles[i].Name);

                var expectedImage = expectedImages[i];
                var actualImage   = Image.FromFile(actualFiles[i].FullName);
                var areEqual      = TilerTests.BitmapEquals(expectedImage, (Bitmap)actualImage);
                Assert.IsTrue(areEqual, "Bitmaps were not equal {0}, {1}", expectedFiles[i], actualFiles[i]);
            }
        }
Ejemplo n.º 5
0
        public static void Execute(Arguments arguments)
        {
            if (arguments == null)
            {
                throw new NoDeveloperMethodException();
            }

            string description;

            switch (arguments.ZoomAction)
            {
            case Arguments.ZoomActionType.Focused:
                description =
                    "# DRAW STACK OF FOCUSED MULTI-SCALE LONG DURATION SPECTROGRAMS DERIVED FROM SPECTRAL INDICES.";
                break;

            case Arguments.ZoomActionType.Tile:
                description =
                    "# DRAW ZOOMING SPECTROGRAMS DERIVED FROM SPECTRAL INDICES OBTAINED FROM AN AUDIO RECORDING";
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            LoggedConsole.WriteLine(description);

            LoggedConsole.WriteLine("# Spectrogram Zooming config  : " + arguments.SpectrogramZoomingConfig);
            LoggedConsole.WriteLine("# Input Directory             : " + arguments.SourceDirectory);
            LoggedConsole.WriteLine("# Output Directory            : " + arguments.Output);

            var common = new ZoomParameters(
                arguments.SourceDirectory.ToDirectoryEntry(),
                arguments.SpectrogramZoomingConfig.ToFileEntry(),
                !string.IsNullOrEmpty(arguments.OutputFormat));

            LoggedConsole.WriteLine("# File name of recording      : " + common.OriginalBasename);

            // create file systems for reading input and writing output
            var io = FileSystemProvider.GetInputOutputFileSystems(
                arguments.SourceDirectory,
                FileSystemProvider.MakePath(arguments.Output, common.OriginalBasename, arguments.OutputFormat, "Tiles"))
                     .EnsureInputIsDirectory();

            switch (arguments.ZoomAction)
            {
            case Arguments.ZoomActionType.Focused:
                // draw a focused multi-resolution pyramid of images
                TimeSpan focalTime;
                if (arguments.FocusMinute.HasValue)
                {
                    focalTime = TimeSpan.FromMinutes(arguments.FocusMinute.Value);
                }
                else
                {
                    throw new ArgumentException("FocusMinute is null, cannot proceed");
                }

                const int ImageWidth = 1500;
                ZoomFocusedSpectrograms.DrawStackOfZoomedSpectrograms(
                    arguments.SourceDirectory.ToDirectoryInfo(),
                    arguments.Output.ToDirectoryInfo(),
                    common,
                    focalTime,
                    ImageWidth,
                    AcousticIndices.TowseyAcoustic);
                break;

            case Arguments.ZoomActionType.Tile:
                // Create the super tiles for a full set of recordings
                ZoomTiledSpectrograms.DrawTiles(
                    io,
                    common,
                    AcousticIndices.TowseyAcoustic);

                break;

            default:
                Log.Warn("Other ZoomAction results in standard LD Spectrogram to be drawn");

                // draw standard false color spectrograms - useful to check what spectrograms of the individual
                // indices are like.

                throw new NotImplementedException();

                /*LDSpectrogramRGB.DrawSpectrogramsFromSpectralIndices(
                 * arguments.SourceDirectory,
                 * arguments.Output,
                 * arguments.SpectrogramConfigPath,
                 * arguments.IndexPropertiesConfig);*/
                break;
            }
        }
Ejemplo n.º 6
0
        public void TestLeftPaddingInLowerLayers()
        {
            const int TileWidth = 180;
            var       startDate = new DateTimeOffset(2014, 05, 29, 08, 13, 58, TimeSpan.FromHours(10));
            var       boundary  = ZoomTiledSpectrograms.GetPreviousTileBoundary(TileWidth, 0.1, startDate);
            var       padding   = startDate - boundary;

            var profile = new AbsoluteDateTilingProfile(
                "Filename",
                "Tile",
                boundary,
                256,
                TileWidth);

            var tiler = new Tiler(
                this.outputDirectory,
                profile,
                new SortedSet <double>()
            {
                60.0, 0.1
            },
                60.0,
                1440,
                new SortedSet <double>()
            {
                1, 1
            },
                1.0,
                256);

            var testBitmap = new Image <Rgba32>(1200, 256);

            testBitmap.Mutate(graphics =>
            {
                var points = new[]
                {
                    new PointF(0, 0), new Point(180, 256), new Point(360, 0), new Point(540, 256), new Point(720, 0),
                    new PointF(900, 256), new Point(1080, 0), new Point(1260, 256),
                };
                graphics.DrawLines(
                    new GraphicsOptions(),
                    Brushes.Solid(Color.Red),
                    1,
                    points);
            });

            var superTile = new TimeOffsetSingleLayerSuperTile(
                padding,
                SpectrogramType.Index,
                0.1.Seconds(),
                testBitmap,
                0.Seconds());

            tiler.Tile(superTile);

            ////Trace.WriteLine(this.outputDirectory.FullName);
            ////Trace.WriteLine(this.outputDirectory.GetFiles().Length);
            var actualFiles = this.outputDirectory.GetFiles().OrderBy(x => x.Name).ToArray();

            Assert.AreEqual(8, actualFiles.Length);

            var expectedFiles = new[]
            {
                "Filename__Tile_20140528T221348Z_0.1.png",
                "Filename__Tile_20140528T221406Z_0.1.png",
                "Filename__Tile_20140528T221424Z_0.1.png",
                "Filename__Tile_20140528T221442Z_0.1.png",
                "Filename__Tile_20140528T221500Z_0.1.png",
                "Filename__Tile_20140528T221518Z_0.1.png",
                "Filename__Tile_20140528T221536Z_0.1.png",
                "Filename__Tile_20140528T221554Z_0.1.png",
            };
            var expectedImages =
                expectedFiles
                .OrderBy(x => x)
                .Select((x, i) => testBitmap.CropInverse(new Rectangle((i * TileWidth) - 100, 0, TileWidth, 256)))
                .ToArray();

            for (var i = 0; i < expectedImages.Length; i++)
            {
                Assert.AreEqual(expectedFiles[i], actualFiles[i].Name);

                var expectedImage = expectedImages[i];
                var actualImage   = Image.Load <Rgba32>(actualFiles[i].FullName);
                Assert.That.ImageMatches(expectedImages[i], actualImage, message: $"Bitmaps were not equal {expectedImages[i]}, {actualFiles[i]}");
            }
        }