public NormalizedImage(MNistImage srcImage)
        {
            Debug.Assert(srcImage != null);
            Debug.Assert(srcImage.Label != null);
            Debug.AssertNotNull(srcImage.RawData);

            InitializeCanvas(srcImage.Width, srcImage.Height);
            Label = srcImage.Label;

            // каждый пиксел исходного изображения:
            // сужаем цветовой спектр до 0-2 и смещаем фон
            for (var y = 0; y < RawData.Length; y++)
            {
                for (var x = 0; x < RawData[y].Length; x++)
                {
                    RawData[y][x] = srcImage.RawData[y][x] / 127.5 - 1.0;
                }
            }
        }
Example #2
0
        public static MNistImage[] GetImageSet(string labelsPath, string imagesPath)
        {
            Debug.Assert(labelsPath != null && imagesPath != null);

            var imagesBytes = File.ReadAllBytes(imagesPath);

            if (ConvertFromBigEndian(imagesBytes, 0) != Idx3MagicNumber)
            {
                throw new FormatException("Неверный формат файла изображений");
            }

            var imagesCount = ConvertFromBigEndian(imagesBytes, sizeof(int));
            var imageHeight = ConvertFromBigEndian(imagesBytes, sizeof(int) * 2);
            var imageWidth  = ConvertFromBigEndian(imagesBytes, sizeof(int) * 3);
            var imageLength = imageWidth * imageHeight;

            if (imagesCount != (imagesBytes.Length - Idx3DataOffset) / imageLength)
            {
                throw new FormatException("Файл изображений поврежден");
            }

            var labelsBytes = File.ReadAllBytes(labelsPath);

            if (ConvertFromBigEndian(labelsBytes, 0) != Idx1MagicNumber)
            {
                throw new FormatException("Неверный формат файла подписей");
            }

            var labelsCount = ConvertFromBigEndian(labelsBytes, sizeof(int));

            if (labelsCount != labelsBytes.Length - Idx1DataOffset)
            {
                throw new FormatException("Файл подписей поврежден");
            }

            if (imagesCount != labelsCount)
            {
                throw new Exception("Количество изображений не совпадает с количеством подписей");
            }

            // получаем все изображения
            var images = new MNistImage[imagesCount];

            for (var i = 0; i < images.Length; i++)
            {
                var label = (int)labelsBytes[Idx1DataOffset + i];
                Debug.Assert(label < 10, label.ToString());

                var imageBytes = new byte[imageWidth][];
                for (var r = 0; r < imageHeight; r++)
                {
                    imageBytes[r] = new byte[imageHeight];
                    Buffer.BlockCopy(imagesBytes, Idx3DataOffset + i * imageLength + r * imageWidth,
                                     imageBytes[r], 0, imageWidth);
                }

                images[i] = new MNistImage(label, imageBytes);
            }

            return(images);
        }