Exemplo n.º 1
0
        /// <summary>
        /// Computes the parameters of the tiles.
        /// </summary>
        private void ComputeParametersOfTiles()
        {
            for (Int32 i = 0; i < _tileNumberVertically; ++i)
            {
                Int32 numberOfRowsInTile = (i < _tileNumberVertically - 1) ?
                                           _numberOfPixelRowsOfNormalTile :
                                           _numberOfPixelRowsOfNormalTile + Source.Raster.NumberOfRows % _tileNumberVertically;

                for (Int32 j = 0; j < _tileNumberHorizontally; ++j)
                {
                    Int32 numberOfColumnsInTile = (j < _tileNumberHorizontally - 1) ? _numberOfPixelColumnsOfNormalTile : _numberOfPixelColumnsOfNormalTile + Source.Raster.NumberOfColumns % _tileNumberHorizontally;

                    MaskedRaster tile = new MaskedRaster(null, Source.Raster, i * _numberOfPixelRowsOfNormalTile, j * _numberOfPixelColumnsOfNormalTile, numberOfRowsInTile, numberOfColumnsInTile);

                    _allTilesParameters[i, j] = new TileHistogramEqualizationParameters();
                    _allTilesParameters[i, j].CumulativeDistributionValues   = new Double[Source.Raster.NumberOfBands][];
                    _allTilesParameters[i, j].CumulativeDistributionMinimums = new Double[Source.Raster.NumberOfBands];
                    _allTilesParameters[i, j].CumulativeDistributionMaximums = new Double[Source.Raster.NumberOfBands];
                    _allTilesParameters[i, j].RadiometricResolutionExponents = new Double[Source.Raster.NumberOfBands];

                    for (Int32 bandIndex = 0; bandIndex < Source.Raster.NumberOfBands; bandIndex++)
                    {
                        ComputeParametersOfActualTile(bandIndex, i, j, tile, _allTilesParameters[i, j]);
                    }
                }
            }
        }
Exemplo n.º 2
0
 /// <summary>
 /// Computes the transformed pixel value of a specified band based on the transformation function of a specified tile.
 /// </summary>
 /// <param name="value">The value of the specified pixel of the specified band.</param>
 /// <param name="bandIndex">The band index.</param>
 /// <param name="tileParameters">The actual tile's data.</param>
 private Double PixelValueTransformation(UInt32 value, Int32 bandIndex, TileHistogramEqualizationParameters tileParameters)
 {
     return((tileParameters.CumulativeDistributionValues[bandIndex][value] - tileParameters.CumulativeDistributionMinimums[bandIndex]) / ((tileParameters.CumulativeDistributionMaximums[bandIndex] - tileParameters.CumulativeDistributionMinimums[bandIndex])) * tileParameters.RadiometricResolutionExponents[bandIndex]);
 }
Exemplo n.º 3
0
        /// <summary>
        /// Computes the parameters of the specified band of the actual tile.
        /// </summary>
        /// <param name="bandIndex">The band index.</param>
        /// <param name="tileRowIndex">The row index.</param>
        /// <param name="tileColumnIndex">The column index.</param>
        /// <param name="actualTile">The actual tile.</param>
        private void ComputeParametersOfActualTile(Int32 bandIndex, Int32 tileRowIndex, Int32 tileColumnIndex, MaskedRaster actualTile, TileHistogramEqualizationParameters actualTileParameters)
        {
            IReadOnlyList <Int32> histogram = actualTile.HistogramValues[bandIndex];

            actualTileParameters.CumulativeDistributionValues[bandIndex] = new Double[histogram.Count];

            // setting values
            actualTileParameters.CumulativeDistributionValues[bandIndex][0] = Convert.ToDouble(histogram[0]) / (actualTile.NumberOfRows * actualTile.NumberOfColumns);
            for (Int32 k = 1; k < histogram.Count; k++)
            {
                actualTileParameters.CumulativeDistributionValues[bandIndex][k] = actualTileParameters.CumulativeDistributionValues[bandIndex][k - 1] + Convert.ToDouble(histogram[k]) / (actualTile.NumberOfRows * actualTile.NumberOfColumns);
            }

            // setting minimum
            Int32 minIndex = 0;

            for (Int32 k = 0; k < histogram.Count; k++)
            {
                if (histogram[k] != 0)
                {
                    minIndex = k;
                    break;
                }
            }

            actualTileParameters.CumulativeDistributionMinimums[bandIndex] = actualTileParameters.CumulativeDistributionValues[bandIndex][minIndex];

            // setting maximum
            Int32 maxIndex = histogram.Count - 1;

            for (Int32 k = histogram.Count - 1; k >= 0; k--)
            {
                if (histogram[k] != 0)
                {
                    maxIndex = k;
                    break;
                }
            }

            actualTileParameters.CumulativeDistributionMaximums[bandIndex] = actualTileParameters.CumulativeDistributionValues[bandIndex][maxIndex];

            // exponent
            actualTileParameters.RadiometricResolutionExponents[bandIndex] = Calculator.Pow(2, actualTile.RadiometricResolution);
        }