/// <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]); } } } }
/// <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]); }
/// <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); }