示例#1
0
        /// <summary>
        /// Create a new Filter Bank Image.  The input image is run through the provided filter banks and their responses are concatenated together to form the channels of the image.
        /// </summary>
        /// <param name="input">The input image</param>
        /// <param name="filterBanks">The filter banks to apply</param>
        /// <returns>The image</returns>
        public static unsafe FilterBankImage Create(IMultichannelImage <float> input, params FilterBank[] filterBanks)
        {
            FilterBankImage image = new FilterBankImage();

            image.SetDimensions(input.Rows, input.Columns, filterBanks.Sum(o => o.DescriptorLength));
            fixed(float *dataSrc = image.RawArray)
            {
                float *dataPtr = dataSrc;

                for (short r = 0; r < input.Rows; r++)
                {
                    for (short c = 0; c < input.Columns; c++)
                    {
                        ImageDataPoint <float> point = new ImageDataPoint <float>(input, r, c, 0);
                        foreach (var fb in filterBanks)
                        {
                            float[] values = fb.Compute(point);
                            for (int i = 0; i < values.Length; i++, dataPtr++)
                            {
                                *dataPtr = values[i];
                            }
                        }
                    }
                }
            }

            return(image);
        }
示例#2
0
        /// <summary>
        /// Read a filter bank image from a stream.
        /// </summary>
        /// <param name="stream">The stream containing the filter bank image</param>
        /// <returns>The filter bank image</returns>
        public static unsafe FilterBankImage Read(Stream stream)
        {
            FilterBankImage image = new FilterBankImage();

            BinaryReader input    = new BinaryReader(stream);
            int          rows     = input.ReadInt32();
            int          columns  = input.ReadInt32();
            int          channels = input.ReadInt32();

            image.SetDimensions(rows, columns, channels);
            fixed(float *dataSrc = image.RawArray)
            {
                float *dataPtr = dataSrc;

                for (int r = 0; r < image.Rows; r++)
                {
                    for (int c = 0; c < image.Columns; c++)
                    {
                        for (int i = 0; i < image.Channels; i++, dataPtr++)
                        {
                            *dataPtr = input.ReadSingle();
                        }
                    }
                }
            }

            return(image);
        }
示例#3
0
        /// <summary>
        /// Write a FilterBankImage to a stream.
        /// </summary>
        /// <param name="stream">The stream to write to</param>
        /// <param name="image">The image to write</param>
        public static unsafe void Write(Stream stream, FilterBankImage image)
        {
            BinaryWriter output = new BinaryWriter(stream);

            output.Write(image.Rows);
            output.Write(image.Columns);
            output.Write(image.Channels);
            fixed(float *dataSrc = image.RawArray)
            {
                float *dataPtr = dataSrc;

                for (int r = 0; r < image.Rows; r++)
                {
                    for (int c = 0; c < image.Columns; c++)
                    {
                        for (int i = 0; i < image.Channels; i++, dataPtr++)
                        {
                            output.Write(*dataPtr);
                        }
                    }
                }
            }
        }