Source code for fmask.saturationcheck

"""
Module for doing checks of visible band and reporting
and saturation. Note that this works off the original 
radiance file, not the TOA reflectance.
"""

# This file is part of 'python-fmask' - a cloud masking module
# Copyright (C) 2015  Neil Flood
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
from __future__ import print_function, division

import numpy
from rios import applier, cuiprogress
from . import config


[docs]def makeSaturationMask(fmaskConfig, radiancefile, outMask): """ Checks the radianceFile and creates a mask with 1's where there is saturation in one of more visible bands. 0 otherwise. The fmaskConfig parameter should be an instance of :class:`fmask.config.FmaskConfig`. This is used to determine which bands are visible. This mask is advisible since the whiteness test Eqn 2. and Equation 6 are affected by saturated pixels and may determine a pixel is not cloud when it is. The format of outMask will be the current RIOS default format. It is assumed that the input radianceFile has values in the range 0-255 and saturated pixels are set to 255. """ inputs = applier.FilenameAssociations() inputs.radiance = radiancefile outputs = applier.FilenameAssociations() outputs.mask = outMask otherargs = applier.OtherInputs() otherargs.radianceBands = fmaskConfig.bands controls = applier.ApplierControls() controls.progress = cuiprogress.GDALProgressBar() applier.apply(riosSaturationMask, inputs, outputs, otherargs, controls=controls)
[docs]def riosSaturationMask(info, inputs, outputs, otherargs): """ Called from RIOS. Does the actual saturation test. Currently assumes that only 8-bit radiance inputs can be saturated, but if this turns out not to be true, we can come back to this. """ if inputs.radiance.dtype == numpy.uint8: blue = otherargs.radianceBands[config.BAND_BLUE] green = otherargs.radianceBands[config.BAND_GREEN] red = otherargs.radianceBands[config.BAND_RED] satMaskList = [] for band in [blue, green, red]: satMaskList.append(inputs.radiance[band] == 255) outputs.mask = numpy.array(satMaskList).astype(numpy.uint8) else: # Assume that anything larger than 8-bit is immune to saturation outShape = (3, ) + inputs.radiance[0].shape outputs.mask = numpy.zeros(outShape, dtype=numpy.uint8)