Beispiel #1
0
def noUnit(field):
  """ remove the units from a grid """
  import visad
  from visad import CommonUnit
  newunit = CommonUnit.promiscuous
  rt = GridUtil.getParamType(field).getRealComponents()[0]
  newType = Util.makeRealType(rt.getName(), visad.CommonUnit.promiscuous)
  return GridUtil.setParamType(field, newType,0)
Beispiel #2
0
def mycombineRGB(red, green, blue):
    """Three Color (RGB) Image (Auto-scale) formula."""
    global uniqueID
    uniqueID += 1
    red = GridUtil.setParamType(red, makeRealType("redimage%d" % uniqueID), 0)
    green = GridUtil.setParamType(green, makeRealType("greenimage%d" % uniqueID), 0)
    blue = GridUtil.setParamType(blue, makeRealType("blueimage%d" % uniqueID), 0)
    return DerivedGridFactory.combineGrids([red, green, blue], 1)
Beispiel #3
0
def noUnit(field):
    """ remove the units from a grid """
    import visad
    from visad import CommonUnit
    newunit = CommonUnit.promiscuous
    rt = GridUtil.getParamType(field).getRealComponents()[0]
    newType = Util.makeRealType(rt.getName(), visad.CommonUnit.promiscuous)
    return GridUtil.setParamType(field, newType, 0)
Beispiel #4
0
def mycombineRGB(red, green, blue):
    """Three Color (RGB) Image (Auto-scale) formula."""
    global uniqueID
    uniqueID += 1
    red = GridUtil.setParamType(red, makeRealType("redimage%d" % uniqueID), 0)
    green = GridUtil.setParamType(green,
                                  makeRealType("greenimage%d" % uniqueID), 0)
    blue = GridUtil.setParamType(blue, makeRealType("blueimage%d" % uniqueID),
                                 0)
    return DerivedGridFactory.combineGrids([red, green, blue], 1)
Beispiel #5
0
def holeFilter(sdataset, user_brkpoint1=0, user_brkpoint2=1, user_stretchval='Contrast', user_britlo=0, user_brithi=255):
    """ hole filter from McIDAS-X - searches for missing data and fills the holes
          using the surrounding element values
        brkpoint1 - low end breakpoint value (default = minimum sdataset value)
        brkpoint2 - high end breakpoint value (default = maximum sdataset value)
        user_britlo    - minimum brightness value for the calibration
        user_brithi    - maximum brightness value for the calibration
    """
    
    data = sdataset.clone()
    brkpoint1 = int(user_brkpoint1)
    brkpoint2 = int(user_brkpoint2)
    stretch = user_stretchval
    britlo = int(user_britlo)
    brithi = int(user_brithi)
    
    for t in xrange(data.getDomainSet().getLength()):
        rangeObject = data.getSample(t)
        vals = rangeObject.getFloats(0)
        in_low = min(vals[0])
        in_hi = max(vals[0])
        minVal = min([brkpoint1, brkpoint2])
        maxVal = max([brkpoint1, brkpoint2])
        domain = GridUtil.getSpatialDomain(rangeObject)
        [element_size, line_size] = domain.getLengths()
        
        for i in range(line_size):
            for j in range(element_size)[1:-1]:
                curVal = vals[0][i * element_size + j]
                """ search line for bad values """
                if curVal >= minVal and curVal <= maxVal:
                    """ look for the next good value """
                    doFill = 0
                    for k in range(element_size)[j:]:
                        nextVal = vals[0][i * element_size + k]
                        if nextVal < minVal or nextVal > maxVal:
                            doFill = 1
                            break
                            
                    if doFill == 1:
                        for fill in range(element_size)[j:k]:
                            vals[0][i * element_size + fill] = (vals[0][i * element_size + j - 1] + vals[0][i * element_size + k]) / 2
                            
        for i in range(line_size):
            for j in range(element_size):
                vals[0][i * element_size + j] = scaleOutsideVal(vals[0][i * element_size + j], britlo, brithi)
                   
        filt_low = int(min(vals[0]))
        filt_hi = int(max(vals[0]))
        
        if stretch == 'Contrast':
            lookup = contrast(filt_low, filt_hi, britlo, brithi, filt_low, filt_hi)
        elif stretch == 'Histogram':
            h = makeHistogram(vals, element_size, line_size, filt_low, brithi - britlo)
            lookup = histoStretch(filt_low, filt_hi, in_low, in_hi, h)
            
        vals = modify(vals, element_size, line_size, filt_low, lookup)
        rangeObject.setSamples(vals)
        
    return data
Beispiel #6
0
 def wrapper(*args, **kwargs):
     wrappedArgs = []
     returnFlatField = False
     for i, arg in enumerate(args):
         # print '%s: %s' % (i, arg)
         if isinstance(arg, FlatField):
             returnFlatField = True
             arg = makeFlatFieldSequence([arg])
         wrappedArgs.append(arg)
     # print [type(a) for a in wrappedArgs]
     wrappedKwargs = {}
     for keyword in kwargs:
         keywordValue = kwargs[keyword]
         if isinstance(keywordValue, FlatField):
             returnFlatField = True  # ??? not sure about kwarg case
             keywordValue = makeFlatFieldSequence([keywordValue])
         wrappedKwargs[keyword] = keywordValue
     # print [type(wrappedKwargs[a]) for a in wrappedKwargs]
     result = func(*wrappedArgs, **wrappedKwargs)
     # print 'result type=%s' % (type(result))
     if GridUtil.isTimeSequence(result) and len(
             result) == 1 and returnFlatField:
         # print 'attempting conversion...'
         result = result.getSample(0)
     # else:
     # print 'not a time sequence! isseq=%s seqtype=%s' % (GridUtil.isSequence(result), GridUtil.getSequenceType(result))
     # print 'returning type=%s' % (type(result))
     return result
Beispiel #7
0
def shotFilter(sdataset, user_bline='Default', user_eline='Default', user_pdiff=15, user_stretchval='Contrast', user_britlo=0, user_brithi=255):
    """ shot noise filter from McIDAS-X
        bline - beginning line in the source image to clean (default=first line)
        eline - ending line in the source image to clean (default = last line)
        pdiff - maximum percentage of the product range to allow before a new value for the pixel is derived using the
                average of two adjacent pixels
        user_britlo    - minimum brightness value for the calibration
        user_brithi    - maximum brightness value for the calibration
    """
    newData = sdataset.clone()
    bline = user_bline
    eline = user_eline
    britlo = int(user_britlo)
    brithi = int(user_brithi)
       
    if bline != 'Default':
        bline = int(bline)
    else:
        bline = 0
        
    if eline != 'Default':
        eline = int(eline)
      
    filter_diff = int(user_pdiff)
    stretch = user_stretchval
    
    for t in range(newData.getDomainSet().getLength()):
        rangeObject = newData.getSample(t)
        vals = rangeObject.getFloats(0)
        in_hi = int(max(vals[0]))
        in_low = int(min(vals[0]))
        """ the next four lines are to make sure the point_diff value is floored """
        p = (in_hi - in_low + 1) * (filter_diff / 100.0)
        a = field((p,))
        b = a.floor().getValues(0)
        point_diff = b[0]
        
        domain = GridUtil.getSpatialDomain(rangeObject)
        [element_size, line_size] = domain.getLengths()
        if (eline == 'Default'):
            eline = line_size
            
        vals = shotMain(vals, bline, eline, element_size, line_size, point_diff)
        
        for i in range(line_size):
            for j in range(element_size):
                vals[0][i * element_size + j] = scaleOutsideVal(vals[0][i * element_size + j], britlo, brithi)
                
        filt_low = int(min(vals[0]))
        filt_hi = int(max(vals[0]))
        if stretch == 'Contrast':
            lookup = contrast(filt_low, filt_hi, britlo, brithi, filt_low, filt_hi)
        elif stretch == 'Histogram':
            h = makeHistogram(vals, element_size, line_size, filt_low, brithi - britlo)
            lookup = histoStretch(filt_low, filt_hi, britlo, brithi, h)
            
        vals = modify(vals, element_size, line_size, filt_low, lookup)
        rangeObject.setSamples(vals)
        
    return newData
Beispiel #8
0
def highPass2DFilter(sdataset, user_stretchval='Contrast', user_britlo=0, user_brithi=255):
    """Two dimensional high pass filter from McIDAS-X.
    
    Equation for each sdataset element is 
    (sdataset - (sample average) + (sample midpoint))
    
    Args:
        user_britlo: Minimum brightness value for the calibration.
        user_brithi: Maximum brightness value for the calibration.
    """
    newData = sdataset.clone()
    stretch = user_stretchval
    britlo = int(user_britlo)
    brithi = int(user_brithi)
    
    for t in xrange(newData.getDomainSet().getLength()):
        rangeObject = newData.getSample(t)
        vals = rangeObject.getFloats(0)
        in_hi = max(vals[0])
        in_low = min(vals[0])
        domain = GridUtil.getSpatialDomain(rangeObject)
        [element_size, line_size] = domain.getLengths()
        
        # first and last 2 lines of the image do not change
        firstLine = vals[0][0:element_size]
        last2Lines = vals[0][(line_size - 2) * element_size:line_size * element_size]
        
        # do the filter using 3 lines at a time
        for i in range(line_size)[:-3]:
            for j in range(element_size)[1:-1]:
                midValue = vals[0][(i + 1) * element_size + j]
                
                val = (vals[0][(i + 2) * element_size + j] + vals[0][i * element_size + j] + \
                      vals[0][(i + 1) * element_size + j + 1] + vals[0][(i + 1) * element_size + j - 1]) - \
                      4 * midValue
                
                if (val < midValue):
                    vals[0][i * element_size + j] = scaleOutsideVal(midValue - val, britlo, brithi)
                else:
                    vals[0][i * element_size + j] = 0
                    
        vals[0][0:line_size * element_size] = firstLine + vals[0][0:(line_size - 3) * element_size] + last2Lines
        
        for i in range(line_size):
            for j in range(element_size):
                vals[0][i * element_size + j] = scaleOutsideVal(vals[0][i * element_size + j], britlo, brithi)
                
        filt_low = int(min(vals[0]))
        filt_hi = int(max(vals[0]))
        
        if stretch == 'Contrast':
            lookup = contrast(filt_low, filt_hi, britlo, brithi, filt_low, filt_hi)
        elif stretch == 'Histogram':
            h = makeHistogram(vals, element_size, line_size, filt_low, brithi - britlo)
            lookup = histoStretch(filt_low, filt_hi, in_low, in_hi, h)
            
        vals = modify(vals, element_size, line_size, filt_low, lookup)
        rangeObject.setSamples(vals)
        
    return newData
Beispiel #9
0
def getSliceAtLevel(fieldimpl, level):
    """Extract a 2D horizontal slice from a 3D grid at "Level."
     level is a real number; must be appropriate for the grid.
     param fieldimpl is a grid which may have one or more time steps.  """
    level = float(level)
    ff = GridUtil.sliceAtLevel(fieldimpl, level)
    return ff
Beispiel #10
0
 def wrapper(*args, **kwargs):
     wrappedArgs = []
     returnFlatField = False
     for i, arg in enumerate(args):
         # print '%s: %s' % (i, arg)
         if isinstance(arg, FlatField):
             returnFlatField = True
             arg = makeFlatFieldSequence([arg])
         wrappedArgs.append(arg)
     # print [type(a) for a in wrappedArgs]
     wrappedKwargs = {}
     for keyword in kwargs:
         keywordValue = kwargs[keyword]
         if isinstance(keywordValue, FlatField):
             returnFlatField = True # ??? not sure about kwarg case
             keywordValue = makeFlatFieldSequence([keywordValue])
         wrappedKwargs[keyword] = keywordValue
     # print [type(wrappedKwargs[a]) for a in wrappedKwargs]
     result = func(*wrappedArgs, **wrappedKwargs)
     # print 'result type=%s' % (type(result))
     if GridUtil.isTimeSequence(result) and len(result) == 1 and returnFlatField:
         # print 'attempting conversion...'
         result = result.getSample(0)
     # else:
         # print 'not a time sequence! isseq=%s seqtype=%s' % (GridUtil.isSequence(result), GridUtil.getSequenceType(result))
     # print 'returning type=%s' % (type(result))
     return result
Beispiel #11
0
def highPass2DFilter(sdataset, user_stretchval='Contrast', user_britlo=0, user_brithi=255):
    """Two dimensional high pass filter from McIDAS-X.
    
    Equation for each sdataset element is 
    (sdataset - (sample average) + (sample midpoint))
    
    Args:
        user_britlo: Minimum brightness value for the calibration.
        user_brithi: Maximum brightness value for the calibration.
    """
    newData = sdataset.clone()
    stretch = user_stretchval
    britlo = int(user_britlo)
    brithi = int(user_brithi)
    
    for t in xrange(newData.getDomainSet().getLength()):
        rangeObject = newData.getSample(t)
        vals = rangeObject.getFloats(0)
        in_hi = max(vals[0])
        in_low = min(vals[0])
        domain = GridUtil.getSpatialDomain(rangeObject)
        [element_size, line_size] = domain.getLengths()
        
        # first and last 2 lines of the image do not change
        firstLine = vals[0][0:element_size]
        last2Lines = vals[0][(line_size - 2) * element_size:line_size * element_size]
        
        # do the filter using 3 lines at a time
        for i in range(line_size)[:-3]:
            for j in range(element_size)[1:-1]:
                midValue = vals[0][(i + 1) * element_size + j]
                
                val = (vals[0][(i + 2) * element_size + j] + vals[0][i * element_size + j] + \
                      vals[0][(i + 1) * element_size + j + 1] + vals[0][(i + 1) * element_size + j - 1]) - \
                      4 * midValue
                
                if (val < midValue):
                    vals[0][i * element_size + j] = scaleOutsideVal(midValue - val, britlo, brithi)
                else:
                    vals[0][i * element_size + j] = 0
                    
        vals[0][0:line_size * element_size] = firstLine + vals[0][0:(line_size - 3) * element_size] + last2Lines
        
        for i in range(line_size):
            for j in range(element_size):
                vals[0][i * element_size + j] = scaleOutsideVal(vals[0][i * element_size + j], britlo, brithi)
                
        filt_low = int(min(vals[0]))
        filt_hi = int(max(vals[0]))
        
        if stretch == 'Contrast':
            lookup = contrast(filt_low, filt_hi, britlo, brithi, filt_low, filt_hi)
        elif stretch == 'Histogram':
            h = makeHistogram(vals, element_size, line_size, filt_low, brithi - britlo)
            lookup = histoStretch(filt_low, filt_hi, in_low, in_hi, h)
            
        vals = modify(vals, element_size, line_size, filt_low, lookup)
        rangeObject.setSamples(vals)
        
    return newData
Beispiel #12
0
def getSliceAtLevel(fieldimpl, level) :
  """Extract a 2D horizontal slice from a 3D grid at "Level."
     level is a real number; must be appropriate for the grid.
     param fieldimpl is a grid which may have one or more time steps.  """
  level = float(level)
  ff = GridUtil.sliceAtLevel(fieldimpl, level)
  return ff
Beispiel #13
0
def getAltitude(z):
   """ Change units from geopotential meters to meters """
   import ucar.visad.quantities.GeopotentialAltitude as ga
   import ucar.visad.quantities.Gravity as gr
   zUnit = GridUtil.getParamType(z).getRealComponents()[0].getDefaultUnit()
   if zUnit.equals(ga.getGeopotentialMeter()):
      z = z.divide(gr.newReal())
   return z
Beispiel #14
0
def getAltitude(z):
    """ Change units from geopotential meters to meters """
    import ucar.visad.quantities.GeopotentialAltitude as ga
    import ucar.visad.quantities.Gravity as gr
    zUnit = GridUtil.getParamType(z).getRealComponents()[0].getDefaultUnit()
    if zUnit.equals(ga.getGeopotentialMeter()):
        z = z.divide(gr.newReal())
    return z
Beispiel #15
0
def unpackage(fieldImpl):
    """ Return the first FlatField contained by this FieldImpl.
  
    Args:  
      fieldImpl: the original argument to the VIIRS formula being called

    Returns:  FlatField suitable for sending into MultiSpectralDataSource methods
    """
    if GridUtil.isTimeSequence(fieldImpl):
        return fieldImpl.getSample(0)
    else:
        return fieldImpl
Beispiel #16
0
def printVals(sdataset):
    data = sdataset.clone()
    
    for t in xrange(data.getDomainSet().getLength()):
        rangeObj = data.getSample(t)
        vals = rangeObj.getFloats(0)
        domain = GridUtil.getSpatialDomain(rangeObj)
        [element_size, line_size] = domain.getLengths()
        
        for i in range(line_size):
            for j in range(element_size):
                print i, j, vals[0][i * element_size + j]
Beispiel #17
0
def gradientFilter(sdataset,
                   user_stretchval='Contrast',
                   user_britlo=0,
                   user_brithi=255):
    """Gradient filter from McIDAS-X.
    
    Args:
        user_britlo: Minimum brightness value for the calibration.
        user_brithi: Maximum brightness value for the calibration.
    """
    newData = sdataset.clone()
    stretch = user_stretchval
    britlo = int(user_britlo)
    brithi = int(user_brithi)

    for t in range(newData.getDomainSet().getLength()):
        rangeObject = newData.getSample(t)
        vals = rangeObject.getFloats(0)
        in_hi = max(vals[0])
        in_low = min(vals[0])
        domain = GridUtil.getSpatialDomain(rangeObject)

        [element_size, line_size] = domain.getLengths()

        for i in range(line_size):
            for j in range(element_size)[:-1]:
                vals[0][i * element_size + j] = int(
                    abs(vals[0][i * element_size + j] -
                        vals[0][i * element_size + j + 1]))

            # set last value to zero
            vals[0][i * element_size + j + 1] = 0

        for i in range(line_size):
            for j in range(element_size):
                vals[0][i * element_size + j] = scaleOutsideVal(
                    vals[0][i * element_size + j], britlo, brithi)

        filt_low = int(min(vals[0]))
        filt_hi = int(max(vals[0]))
        if stretch == 'Contrast':
            lookup = contrast(filt_low, filt_hi, britlo, brithi, filt_low,
                              filt_hi)
        elif stretch == 'Histogram':
            h = makeHistogram(vals, element_size, line_size, filt_low,
                              brithi - britlo)
            lookup = histoStretch(filt_low, filt_hi, in_low, in_hi, h)

        vals = modify(vals, element_size, line_size, filt_low, lookup)
        rangeObject.setSamples(vals)

    return newData
Beispiel #18
0
def applyToRange(function, data):
    """ Apply the function name to each timestep of the data """
    newData = data.clone()
    f = function + '(rangeValue)'
    if (GridUtil.isTimeSequence(newData)):
        for t in range(newData.getDomainSet().getLength()):
            rangeValue = newData.getSample(t)
            result = eval(f)
            newData.setSample(t, result, 0)
    else:
        rangeValue = newData
        newData = eval(f)
    return newData
Beispiel #19
0
def oldaverageOverTime(field, makeTimes=0):
    """@deprecated Average the values in each time step
    If makeTimes is true (1) then we return a field mapping all of the times
    to the average. Else we just return the average """
    if (GridUtil.isTimeSequence(field) == 0):
        return field
    cnt = 0
    domainSet = field.getDomainSet()
    current = None
    for t in range(domainSet.getLength()):
        cnt = cnt + 1
        rangeValue = field.getSample(t)
        if (current is None):
            current = rangeValue.clone()
        else:
            current = current + rangeValue
    if (cnt == 0):
        return None
    current = current / cnt
    if (makeTimes):
        return Util.makeTimeField(current, GridUtil.getDateTimeList(field))
    return current
Beispiel #20
0
def oldaverageOverTime(field,makeTimes = 0):
    """@deprecated Average the values in each time step
    If makeTimes is true (1) then we return a field mapping all of the times
    to the average. Else we just return the average """
    if (GridUtil.isTimeSequence(field)==0):
        return field;
    cnt = 0;
    domainSet = field.getDomainSet()
    current = None;
    for t in range(domainSet.getLength()):
        cnt=cnt+1
        rangeValue = field.getSample(t)
        if(current is None):
            current = rangeValue.clone();
        else:
            current = current+rangeValue;
    if(cnt == 0):
        return None;
    current = current/cnt;
    if(makeTimes):
        return Util.makeTimeField(current, GridUtil.getDateTimeList(field))
    return current
Beispiel #21
0
def printVals(sdataset):
    """Debug function that prints the values in a dataset."""
    data = sdataset.clone()
    
    for t in xrange(data.getDomainSet().getLength()):
        rangeObj = data.getSample(t)
        vals = rangeObj.getFloats(0)
        domain = GridUtil.getSpatialDomain(rangeObj)
        [element_size, line_size] = domain.getLengths()
        
        for i in range(line_size):
            for j in range(element_size):
                print i, j, vals[0][i * element_size + j]
Beispiel #22
0
def applyToRange(function,data):
    """ Apply the function name to each timestep of the data """
    newData = data.clone()
    f = function +'(rangeValue)'
    if (GridUtil.isTimeSequence(newData)):
        for t in range(newData.getDomainSet().getLength()):
            rangeValue = newData.getSample(t)
            result = eval(f)
            newData.setSample(t,result,0)
    else:
        rangeValue = newData
        newData = eval(f)
    return newData
Beispiel #23
0
def getSliceAtAltitude(fieldimpl, alt, unit="m"):
    """ Extract a 2D horizontal slice from a 3D grid at the given altitude;
      level is a real number; if unit is supplied, it must
      be compatible with meters (ft, fathoms, etc)
      param fieldimpl is a grid which may have
      one or more time steps.  """
    #import methods from
    from visad import RealType
    from visad import Real
    alt = float(alt)
    unit = Util.parseUnit(unit)
    altitude = Real(RealType.Altitude, alt, unit)
    ff = GridUtil.sliceAtLevel(fieldimpl, altitude)
    return ff
Beispiel #24
0
def getSliceAtAltitude(fieldimpl, alt, unit="m") :
  """ Extract a 2D horizontal slice from a 3D grid at the given altitude;
      level is a real number; if unit is supplied, it must
      be compatible with meters (ft, fathoms, etc)
      param fieldimpl is a grid which may have
      one or more time steps.  """
  #import methods from
  from visad import RealType
  from visad import Real
  alt = float(alt)
  unit = Util.parseUnit(unit)
  altitude = Real(RealType.Altitude, alt, unit)
  ff = GridUtil.sliceAtLevel(fieldimpl, altitude)
  return ff
Beispiel #25
0
def printValueDiff(sdataset1, sdataset2):
    data1 = sdataset1.clone()
    data2 = sdataset2.clone()
    
    for t in xrange(data1.getDomainSet().getLength()):
        rangeObj1 = data1.getSample(t)
        rangeObj2 = data2.getSample(t)
        vals1 = rangeObj1.getFloats(0)
        """ vals2 = rangeObj1.getFloats(0)  TODO: bug? """
        vals2 = rangeObj2.getFloats(0)
        domain = GridUtil.getSpatialDomain(rangeObj1)
        [element_size, line_size] = domain.getLengths()
        
        for i in xrange(line_size):
            for j in xrange(element_size):
                print i, j, vals1[0][i * element_size + j] - vals2[0][i * element_size + j]
Beispiel #26
0
 def wrapper(*args):
     wrappedArgs = []
     for i, arg in enumerate(args):
         # print '%s: %s' % (i, arg)
         if isinstance(arg, SingleBandedImage):
             arg = ImageSequenceImpl([arg])
         wrappedArgs.append(arg)
     # print [type(a) for a in wrappedArgs]
     result = func(*wrappedArgs)
     # print 'result type=%s' % (type(result))
     if GridUtil.isTimeSequence(result) and len(result) == 1:
         # print 'attempting conversion...'
         result = result.getImage(0)
     # else:
     # print 'not a time sequence! isseq=%s seqtype=%s' % (GridUtil.isSequence(result), GridUtil.getSequenceType(result))
     # print 'returning type=%s' % (type(result))
     return result
Beispiel #27
0
def printValueDiff(sdataset1, sdataset2):
    """Debug function that prints value differences between two datasets."""
    data1 = sdataset1.clone()
    data2 = sdataset2.clone()
    
    for t in xrange(data1.getDomainSet().getLength()):
        rangeObj1 = data1.getSample(t)
        rangeObj2 = data2.getSample(t)
        vals1 = rangeObj1.getFloats(0)
        # vals2 = rangeObj1.getFloats(0)  TODO: bug?
        vals2 = rangeObj2.getFloats(0)
        domain = GridUtil.getSpatialDomain(rangeObj1)
        [element_size, line_size] = domain.getLengths()
        
        for i in xrange(line_size):
            for j in xrange(element_size):
                print i, j, vals1[0][i * element_size + j] - vals2[0][i * element_size + j]
Beispiel #28
0
def printValueDiff(sdataset1, sdataset2):
    """Debug function that prints value differences between two datasets."""
    data1 = sdataset1.clone()
    data2 = sdataset2.clone()
    
    for t in xrange(data1.getDomainSet().getLength()):
        rangeObj1 = data1.getSample(t)
        rangeObj2 = data2.getSample(t)
        vals1 = rangeObj1.getFloats(0)
        # vals2 = rangeObj1.getFloats(0)  TODO: bug?
        vals2 = rangeObj2.getFloats(0)
        domain = GridUtil.getSpatialDomain(rangeObj1)
        [element_size, line_size] = domain.getLengths()
        
        for i in xrange(line_size):
            for j in xrange(element_size):
                print i, j, vals1[0][i * element_size + j] - vals2[0][i * element_size + j]
Beispiel #29
0
 def wrapper(*args):
     wrappedArgs = []
     for i, arg in enumerate(args):
         # print '%s: %s' % (i, arg)
         if isinstance(arg, SingleBandedImage):
             arg = ImageSequenceImpl([arg])
         wrappedArgs.append(arg)
     # print [type(a) for a in wrappedArgs]
     result = func(*wrappedArgs)
     # print 'result type=%s' % (type(result))
     if GridUtil.isTimeSequence(result) and len(result) == 1:
         # print 'attempting conversion...'
         result = result.getImage(0)
     # else:
         # print 'not a time sequence! isseq=%s seqtype=%s' % (GridUtil.isSequence(result), GridUtil.getSequenceType(result))
     # print 'returning type=%s' % (type(result))
     return result
Beispiel #30
0
def applyToRangeValues(function,data):
    """ Apply the function name to each value in each timestep of the data """
    newData = data.clone()
    f = function +'(values,step=step,rangeObject=rangeObject,field=field)'
    step=0
    if (GridUtil.isTimeSequence(newData)):
        for t in range(newData.getDomainSet().getLength()):
            rangeObject = newData.getSample(t)
            values = rangeObject.getFloats(0)
            values = eval(f)
            rangeObject.setSamples(values,1)
            step= step+1
    else:
        rangeObject = newData
        values = rangeObject.getFloats(0)
        values = eval(f)
        rangeObject.setSamples(values,1)
    return newData
Beispiel #31
0
def applyToRangeValues(function, data):
    """ Apply the function name to each value in each timestep of the data """
    newData = data.clone()
    f = function + '(values,step=step,rangeObject=rangeObject,field=field)'
    step = 0
    if (GridUtil.isTimeSequence(newData)):
        for t in range(newData.getDomainSet().getLength()):
            rangeObject = newData.getSample(t)
            values = rangeObject.getFloats(0)
            values = eval(f)
            rangeObject.setSamples(values, 1)
            step = step + 1
    else:
        rangeObject = newData
        values = rangeObject.getFloats(0)
        values = eval(f)
        rangeObject.setSamples(values, 1)
    return newData
Beispiel #32
0
def gradientFilter(sdataset, user_stretchval='Contrast', user_britlo=0, user_brithi=255):
    """Gradient filter from McIDAS-X.
    
    Args:
        user_britlo: Minimum brightness value for the calibration.
        user_brithi: Maximum brightness value for the calibration.
    """
    newData = sdataset.clone()
    stretch = user_stretchval
    britlo = int(user_britlo)
    brithi = int(user_brithi)
    
    for t in range(newData.getDomainSet().getLength()):
        rangeObject = newData.getSample(t)
        vals = rangeObject.getFloats(0)
        in_hi = max(vals[0])
        in_low = min(vals[0])
        domain = GridUtil.getSpatialDomain(rangeObject)
        
        [element_size, line_size] = domain.getLengths()
        
        for i in range(line_size):
            for j in range(element_size)[:-1]:
                vals[0][i * element_size + j] = int(abs(vals[0][i * element_size + j] - vals[0][i * element_size + j + 1]))
                
            # set last value to zero
            vals[0][i * element_size + j + 1] = 0
            
        for i in range(line_size):
            for j in range(element_size):
                vals[0][i * element_size + j] = scaleOutsideVal(vals[0][i * element_size + j], britlo, brithi)
                
        filt_low = int(min(vals[0]))
        filt_hi = int(max(vals[0]))
        if stretch == 'Contrast':
            lookup = contrast(filt_low, filt_hi, britlo, brithi, filt_low, filt_hi)
        elif stretch == 'Histogram':
            h = makeHistogram(vals, element_size, line_size, filt_low, brithi - britlo)
            lookup = histoStretch(filt_low, filt_hi, in_low, in_hi, h)
            
        vals = modify(vals, element_size, line_size, filt_low, lookup)
        rangeObject.setSamples(vals)
        
    return newData
Beispiel #33
0
def substitute(data, low, high, newValue):
    """change values in data  between low/high to newvalue """
    newData = data.clone();
    if (GridUtil.isTimeSequence(newData)):
        for t in range(newData.getDomainSet().getLength()):
            rangeObject = newData.getSample(t)
            values = rangeObject.getFloats(0);
            for i in range(len(values)):
               for j in range(len(values[0])):
		           if values[i][j]>=low:
		             if values[i][j]<=high:  values[i][j] = newValue;
            rangeObject.setSamples(values,1);
    else:
        rangeObject = newData;
        values = rangeObject.getFloats(0);
        for i in range(len(values)):
          for j in range(len(values[0])):
             if values[i][j]>=low:
                if values[i][j]<=high: values[0][i] = newValue;
        rangeObject.setSamples(values,1);
    return newData;
Beispiel #34
0
def substitute(data, low, high, newValue):
    """change values in data  between low/high to newvalue """
    newData = data.clone()
    if (GridUtil.isTimeSequence(newData)):
        for t in range(newData.getDomainSet().getLength()):
            rangeObject = newData.getSample(t)
            values = rangeObject.getFloats(0)
            for i in range(len(values)):
                for j in range(len(values[0])):
                    if values[i][j] >= low:
                        if values[i][j] <= high: values[i][j] = newValue
            rangeObject.setSamples(values, 1)
    else:
        rangeObject = newData
        values = rangeObject.getFloats(0)
        for i in range(len(values)):
            for j in range(len(values[0])):
                if values[i][j] >= low:
                    if values[i][j] <= high: values[0][i] = newValue
        rangeObject.setSamples(values, 1)
    return newData
Beispiel #35
0
def package(original, result):
    """ Put 'result' back into a FieldImpl using the time domain from 'original'.

    Args:
      original: the original argument to the VIIRS formula being called
      result: the result of the MultiSpectralDataSource methods called by
            the current VIIRS formula

    Returns: FieldImpl with proper time domain (so that e.g. IDV's %timestamp% macro
             will work properly)
    """
    from visad import FunctionType
    from visad import FieldImpl
    from visad import RealType

    if GridUtil.isTimeSequence(original):
        ftype = FunctionType(RealType.Time, result.getType())
        fieldimpl = FieldImpl(ftype, original.getDomainSet())
        fieldimpl.setSample(0, result)
        return fieldimpl
    else:
        # just return the plain flatfield if original wasn't a fieldimpl
        # (needed to make loadJPSSImage work)
        return result
Beispiel #36
0
def cleanFilter(sdataset, user_fill='Average', user_bline='Default', user_eline='Default', user_pdiff=15, user_ldiff=15, user_stretchval='Contrast', user_britlo=0, user_brithi=255):
    """Clean filter from McIDAS-X.
    
    Args:
        user_fill: 'Average': average of surrounding values (default)
                   'Min'    : source dataset minimum value
                   'Max'    : source dataset maximum value
        user_bline: Beginning line in the source image to clean.
                    (default=first line)
        user_eline: Ending line in the source image to clean.
                    (default = last line)
        user_pdiff: Absolute difference between an element's value and value 
                    of the element on either side.
        user_ldiff: Percentage difference between a line's average value and 
                    the average value of the line above and below.
        user_britlo: Minimum brightness value for the calibration.
        user_brithi: Maximum brightness value for the calibration.
    """
    newData = sdataset.clone()
    
    filter_fill = user_fill
    bline = user_bline
    eline = user_eline
    britlo = int(user_britlo)
    brithi = int(user_brithi)
    
    if bline != 'Default':
        bline = int(bline)
    else:
        bline = 0
    if eline != 'Default':
        eline = int(eline)
        
    filter_diff = int(user_pdiff)
    l_diff = int(user_ldiff)
    stretch = user_stretchval
    
    for t in range(newData.getDomainSet().getLength()):
        rangeObject = newData.getSample(t)
        vals = rangeObject.getFloats(0)
        in_hi = int(max(vals[0]))
        in_low = int(min(vals[0]))
        point_diff = (in_hi - in_low + 1) * (filter_diff / 100.0)
        line_diff = (in_hi - in_low + 1) * (l_diff / 100.0)
        domain = GridUtil.getSpatialDomain(rangeObject)
        [element_size, line_size] = domain.getLengths()
        if eline == 'Default':
            eline = line_size
            
        vals = shotMain(vals, bline, eline, element_size, line_size, point_diff)
        for i in range(line_size):
            for j in range(element_size):
                vals[0][i * element_size + j] = scaleOutsideVal(vals[0][i * element_size + j], britlo, brithi)
                
        filt_low = int(min(vals[0]))
        filt_hi = int(max(vals[0]))
        
        vals = badLineFilter(vals, bline, eline, element_size, line_size, filter_fill, line_diff, filt_low, filt_hi)
        
        # update the min/max of the image after the removal of the bad lines
        filt_low = int(min(vals[0]))
        filt_hi = int(max(vals[0]))
        
        if stretch == 'Contrast':
            lookup = contrast(filt_low, filt_hi, britlo, brithi, filt_low, filt_hi)
        elif stretch == 'Histogram':
            h = makeHistogram(vals, element_size, line_size, filt_low, brithi - britlo)
            lookup = histoStretch(filt_low, filt_hi, britlo, brithi, h)
            
        vals = modify(vals, element_size, line_size, filt_low, lookup)
        rangeObject.setSamples(vals)
        
    return newData
Beispiel #37
0
def coreFilter(sdataset1, sdataset2, user_brkpoint1='Default', user_brkpoint2='Default', user_replace1='Default', user_replace2='Default', user_stretchval='Contrast', user_britlo=0, user_brithi=255):
    """Core filter from McIDAS-X.
    
    Requires 2 source datasets; resulting image has only 2 values.
    
    Args:
        user_brkpoint1: Sdataset1 breakpoint value.
                        (default=minimum value in either source dataset)
        user_brkpoint2: Sdataset2 breakpoint value.
                        (default=maximum value in either source dataset)
        user_replace1: Success condition replacement value.
                       (default=maximum value in either source dataset)
        user_replace2: Failure condition replacement value.
                       (default=minimum vlaue in either source dataset)
        user_britlo: Minimum brightness value for the calibration.
        user_brithi: Maximum brightness value for the calibration.
    """
    data1 = sdataset1.clone()
    data2 = sdataset2.clone()
    brkpoint1 = user_brkpoint1
    brkpoint2 = user_brkpoint2
    replace1 = user_replace1
    replace2 = user_replace2
    britlo = int(user_britlo)
    brithi = int(user_brithi)
    
    if brkpoint1 != 'Default':
        brkpoint1=int(brkpoint1)
        
    if brkpoint2 != 'Default':
        brkpoint2=int(brkpoint2)
        
    if replace1 != 'Default':
        replace1=int(replace1)
        
    if replace2 != 'Default':
        replace2 = int(replace2)
        
    stretch = user_stretchval
    
    for t in range(data1.getDomainSet().getLength()):
        range1 = data1.getSample(t)
        range2 = data2.getSample(t)
        vals1 = range1.getFloats(0)
        max1 = max(vals1[0])
        min1 = min(vals1[0])
        vals2 = range2.getFloats(0)
        max2 = max(vals2[0])
        min2 = min(vals2[0])
        in_low = min([min1, min2])
        in_hi = max([max1, max2])
        
        if brkpoint1 == 'Default':
            brkpoint1 = in_low
            
        if brkpoint2 == 'Default':
            brkpoint2 = in_hi
            
        if replace1 == 'Default':
            replace1 = brkpoint2
            
        if replace2 == 'Default':
            replace2 = brkpoint1
            
        domain = GridUtil.getSpatialDomain(range1)
        [element_size, line_size] = domain.getLengths()
        for i in range(line_size):
            for j in range(element_size):
                if (vals1[0][i * element_size + j] > brkpoint1 and vals2[0][i * element_size + j] > brkpoint2):
                    vals1[0][i * element_size + j] = replace1
                else:
                    vals1[0][i * element_size + j]=replace2
                    
        for i in range(line_size):
            for j in range(element_size):
                vals1[0][i * element_size + j] = scaleOutsideVal(vals1[0][i * element_size + j], britlo, brithi)
                
        filt_low = int(min([min(vals1[0]), min2]))
        filt_hi = int(max([max(vals1[0]), max2]))
        if stretch == 'Contrast':
            lookup = contrast(filt_low, filt_hi, in_low, in_hi, filt_low, filt_hi)
        elif stretch == 'Histogram':
            # make a histogram from both datasets
            v = []
            v.append(vals1[0])
            v.append(vals2[0])
            h = makeHistogram(v, element_size, line_size, filt_low, brithi - britlo)
            lookup = histoStretch(filt_low, filt_hi, in_low, in_hi, h)
            
        vals1 = modify(vals1, element_size, line_size, filt_low, lookup)
        range1.setSamples(vals1)
        
    return data1
Beispiel #38
0
def replaceFilter(sdataset, user_replaceVal=0, user_sourceval='Default', user_stretchval='Contrast', user_britlo=0, user_brithi=255):
    """Replace filter from McIDAS-X.
    
    Args:
        user_replace : Replacement value  (default=0)
        user_sourceval: Source image values in the region to replace 
                        user_replace; specify values in the list format, 
                        e.g. val1 val2 val3 etc., or a range format, e.g. 
                        bval-eval (default=0-255)
        user_britlo: Minimum brightness value for the calibration.
        user_brithi: Maximum brightness value for the calibration.
    """
    newData = sdataset.clone()
    replaceVal = int(user_replaceVal)
    stretch = user_stretchval
    britlo = int(user_britlo)
    brithi = int(user_brithi)
    
    # sourceVal can either be specified in list format: val1 val2 val3
    # or in a range format, bval-eval (default = 0-255) 
    if user_sourceval != 'Default':
        if '-' in user_sourceval:
            tempVal1 = [int(m) for m in user_sourceval.split('-')]
            tempVal = range(tempVal1[0], tempVal1[1] + 1)
        else:
            tempVal = user_sourceval.split()
    else:
        tempVal = range(0, 256)
        
    sourceVal = [float(m) for m in tempVal]
    
    for t in range(newData.getDomainSet().getLength()):
        rangeObject = newData.getSample(t)
        vals = rangeObject.getFloats(0)
        in_low = int(min(vals[0]))
        in_hi = int(max(vals[0]))
        domain = GridUtil.getSpatialDomain(rangeObject)
        
        [element_size, line_size] = domain.getLengths()
        
        for i in range(line_size):
            for j in range(element_size):
                line = vals[0][i * element_size + j]
                if (line in sourceVal):
                    line = replaceVal
                vals[0][i * element_size + j] = line
                
        for i in range(line_size):
            for j in range(element_size):
                vals[0][i * element_size + j] = scaleOutsideVal(vals[0][i * element_size + j], britlo, brithi)
                
        filt_low = int(min(vals[0]))
        filt_hi = int(max(vals[0]))
        if stretch == 'Contrast':
            lookup = contrast(filt_low, filt_hi, britlo, brithi, filt_low, filt_hi)
        elif stretch == 'Histogram':
            h = makeHistogram(vals, element_size, line_size, filt_low, brithi - britlo)
            lookup = histoStretch(filt_low, filt_hi, in_low, in_hi, h)
            
        vals = modify(vals, element_size, line_size, filt_low, lookup)
        rangeObject.setSamples(vals)
        
    return newData
Beispiel #39
0
def writeGridToXls(grid,filename='grid.xls'):
    """Write out the grid data to an excel spreadsheet"""
    GridUtil.writeGridToXls(grid,filename)
    return grid
Beispiel #40
0
def lonFlip(grid):
    """ Flip the longitudes in a grid from -180-180 to 0-360 (or vice-versa).
        Only works for cyclic rectilinear grids.
    """
    return GridUtil.lonFlip(grid)
Beispiel #41
0
def newName(field, varname, copy=0):
    """ create a new field with a new parameter name """
    return GridUtil.setParamType(field, varname, copy)
Beispiel #42
0
def replaceFilter(sdataset, user_replaceVal=0, user_sourceval='Default', user_stretchval='Contrast', user_britlo=0, user_brithi=255):
    """Replace filter from McIDAS-X.
    
    Args:
        user_replace : Replacement value  (default=0)
        user_sourceval: Source image values in the region to replace 
                        user_replace; specify values in the list format, 
                        e.g. val1 val2 val3 etc., or a range format, e.g. 
                        bval-eval (default=0-255)
        user_britlo: Minimum brightness value for the calibration.
        user_brithi: Maximum brightness value for the calibration.
    """
    newData = sdataset.clone()
    replaceVal = int(user_replaceVal)
    stretch = user_stretchval
    britlo = int(user_britlo)
    brithi = int(user_brithi)
    
    # sourceVal can either be specified in list format: val1 val2 val3
    # or in a range format, bval-eval (default = 0-255) 
    if user_sourceval != 'Default':
        if '-' in user_sourceval:
            tempVal1 = [int(m) for m in user_sourceval.split('-')]
            tempVal = range(tempVal1[0], tempVal1[1] + 1)
        else:
            tempVal = user_sourceval.split()
    else:
        tempVal = range(0, 256)
        
    sourceVal = [float(m) for m in tempVal]
    
    for t in range(newData.getDomainSet().getLength()):
        rangeObject = newData.getSample(t)
        vals = rangeObject.getFloats(0)
        in_low = int(min(vals[0]))
        in_hi = int(max(vals[0]))
        domain = GridUtil.getSpatialDomain(rangeObject)
        
        [element_size, line_size] = domain.getLengths()
        
        for i in range(line_size):
            for j in range(element_size):
                line = vals[0][i * element_size + j]
                if (line in sourceVal):
                    line = replaceVal
                vals[0][i * element_size + j] = line
                
        for i in range(line_size):
            for j in range(element_size):
                vals[0][i * element_size + j] = scaleOutsideVal(vals[0][i * element_size + j], britlo, brithi)
                
        filt_low = int(min(vals[0]))
        filt_hi = int(max(vals[0]))
        if stretch == 'Contrast':
            lookup = contrast(filt_low, filt_hi, britlo, brithi, filt_low, filt_hi)
        elif stretch == 'Histogram':
            h = makeHistogram(vals, element_size, line_size, filt_low, brithi - britlo)
            lookup = histoStretch(filt_low, filt_hi, in_low, in_hi, h)
            
        vals = modify(vals, element_size, line_size, filt_low, lookup)
        rangeObject.setSamples(vals)
        
    return newData
Beispiel #43
0
def holeFilter(sdataset, user_brkpoint1=0, user_brkpoint2=1, user_stretchval='Contrast', user_britlo=0, user_brithi=255):
    """Hole filter from McIDAS-X.
    
    Searches for missing data and fills the holes using the surrounding 
    element values.
    
    Args:
        brkpoint1: Low end breakpoint value.
                   (default = minimum sdataset value)
        brkpoint2: High end breakpoint value.
                   (default = maximum sdataset value)
        user_britlo: Minimum brightness value for the calibration.
        user_brithi: Maximum brightness value for the calibration.
    """
    data = sdataset.clone()
    brkpoint1 = int(user_brkpoint1)
    brkpoint2 = int(user_brkpoint2)
    stretch = user_stretchval
    britlo = int(user_britlo)
    brithi = int(user_brithi)
    
    for t in xrange(data.getDomainSet().getLength()):
        rangeObject = data.getSample(t)
        vals = rangeObject.getFloats(0)
        in_low = min(vals[0])
        in_hi = max(vals[0])
        minVal = min([brkpoint1, brkpoint2])
        maxVal = max([brkpoint1, brkpoint2])
        domain = GridUtil.getSpatialDomain(rangeObject)
        [element_size, line_size] = domain.getLengths()
        
        for i in range(line_size):
            for j in range(element_size)[1:-1]:
                curVal = vals[0][i * element_size + j]
                # search line for bad values
                if curVal >= minVal and curVal <= maxVal:
                    # look for the next good value
                    doFill = 0
                    for k in range(element_size)[j:]:
                        nextVal = vals[0][i * element_size + k]
                        if nextVal < minVal or nextVal > maxVal:
                            doFill = 1
                            break
                            
                    if doFill == 1:
                        for fill in range(element_size)[j:k]:
                            vals[0][i * element_size + fill] = (vals[0][i * element_size + j - 1] + vals[0][i * element_size + k]) / 2
                            
        for i in range(line_size):
            for j in range(element_size):
                vals[0][i * element_size + j] = scaleOutsideVal(vals[0][i * element_size + j], britlo, brithi)
                   
        filt_low = int(min(vals[0]))
        filt_hi = int(max(vals[0]))
        
        if stretch == 'Contrast':
            lookup = contrast(filt_low, filt_hi, britlo, brithi, filt_low, filt_hi)
        elif stretch == 'Histogram':
            h = makeHistogram(vals, element_size, line_size, filt_low, brithi - britlo)
            lookup = histoStretch(filt_low, filt_hi, in_low, in_hi, h)
            
        vals = modify(vals, element_size, line_size, filt_low, lookup)
        rangeObject.setSamples(vals)
        
    return data
Beispiel #44
0
def exportGridToNetcdf(grid, filename='grid.nc'):
    """Write out the grid data to CF compliant netCDF file"""
    GridUtil.exportGridToNetcdf(grid, filename)
    return grid
Beispiel #45
0
def newUnit(field, varname, unitname):
    """ set the name and unit on a grid """
    newunit = Util.parseUnit(unitname)
    newType = Util.makeRealType(varname, newunit)
    return GridUtil.setParamType(field, newType, 0)
Beispiel #46
0
def writeGridToXls(grid, filename='grid.xls'):
    """Write out the grid data to an excel spreadsheet"""
    GridUtil.writeGridToXls(grid, filename)
    return grid
Beispiel #47
0
def lowPass2DFilter(sdataset, user_linecoef=0.5, user_elecoef=0.5, user_stretchval='Contrast', user_britlo=0, user_brithi=255):
    """Two dimensional low pass filter from McIDAS-X.
    
    Args:
        user_linecoef: Line coefficient: 0.0 < linecoef < 1.0.
        user_elecoef: Element coefficient: 0.0 < elecoef < 1.0.
        user_britlo: Minimum brightness value for the calibration.
        user_brithi: Maximum brightness value for the calibration.
    """
    newData = sdataset.clone()
    lcoef = float(user_linecoef)
    ecoef = float(user_elecoef)
    stretch=user_stretchval
    l1 = 1.0 - lcoef
    e1 = 1.0 - ecoef
    britlo = int(user_britlo)
    brithi = int(user_brithi)
    
    for t in xrange(newData.getDomainSet().getLength()):
        rangeObject = newData.getSample(t)
        vals = rangeObject.getFloats(0)
        in_hi = max(vals[0])
        in_low = min(vals[0])
        domain = GridUtil.getSpatialDomain(rangeObject)
        [element_size, line_size] = domain.getLengths()
        
        # save the first line
        realLine = vals[0][0:element_size].tolist()
        
        for i in range(line_size):
            # left to right filter along line
            val = vals[0][i * element_size]
            for j in range(element_size):
                if vals[0][i * element_size + j] > 0:
                    val = ecoef * val + e1 * vals[0][i * element_size + j]
                vals[0][i * element_size + j] = lowPass2DRound(val+0.0000001)
                
            # right to left filter along line
            val = vals[0][i * element_size + (element_size - 1)]
            
            # second argument of -1 ensures that the 0th element is done
            for j in xrange(element_size - 1, -1, -1):
                val = ecoef * val + e1 * vals[0][i * element_size + j]
                vals[0][i * element_size + j] = lowPass2DRound(val) 
                
            # filter along the elements
            for j in range(element_size):
                val = lcoef * realLine[j] + l1 * vals[0][i * element_size + j]
                vals[0][i * element_size + j] = lowPass2DRound(val) 
                
            realLine = vals[0][i * element_size:i * element_size + element_size].tolist()
            
        # filter along the lines going through the image up the elements
        # save the last line
        realLine = vals[0][(line_size - 1) * element_size:line_size * element_size].tolist()
        
        # second argument of -1 ensures that the 0th line is done
        for i in xrange(line_size - 1, -1, -1):
            for j in range(element_size):
                val = lcoef * realLine[j] + l1 * vals[0][i * element_size + j]
                vals[0][i * element_size + j] = lowPass2DRound(val) 
                
            realLine = vals[0][i * element_size:i * element_size + element_size].tolist()
            
        for i in range(line_size):
            for j in range(element_size):
                vals[0][i * element_size + j] = scaleOutsideVal(vals[0][i * element_size + j], britlo, brithi)
                
        filt_low = int(min(vals[0]))
        filt_hi = int(max(vals[0]))
        
        if stretch == 'Contrast':
            lookup = contrast(filt_low, filt_hi, britlo, brithi, filt_low, filt_hi)
        elif stretch == 'Histogram':
            # h = hist(field(vals), [0], [post_hi - post_low])
            h = makeHistogram(vals, element_size, line_size, filt_low, brithi - britlo)
            lookup = histoStretch(filt_low, filt_hi, in_low, in_hi, h)
            
        vals = modify(vals, element_size, line_size, filt_low, lookup)
        rangeObject.setSamples(vals)
        
    return newData
Beispiel #48
0
def make2D(slice):
  """Make a 2D slice from a 3D slice at a single level """
  return GridUtil.make2DGridFromSlice(slice)
Beispiel #49
0
def discriminateFilter(sdataset1, sdataset2, user_brkpoint1='Default', user_brkpoint2='Default', user_brkpoint3='Default', user_brkpoint4='Default', user_replace='Default', user_stretchval='Contrast', user_britlo=0, user_brithi=255):
    """Discriminate filter from McIDAS-X.
    
    Requires 2 source datasets; used to mask off a portion of the first 
    source image.
    
    Args:
        user_brkpoint1: Low end breakpoint value for sdataset1.
                        (default=minimum value in either source dataset)
        user_brkpoint2: High end breakpoint value for sdataset1.
                        (default=maximum value in either source dataset)
        user_brkpoint3: Low end breakpoint value for sdataset2.
                        (default=minimum value in either source dataset)
        user_brkpoint4: High end breakpoint value for sdataset2.
                        (default=maximum value in either source dataset)
        user_replace: Failure condition replacement value 
                      (default=minimum value in either source dataset)
        user_britlo: Minimum brightness value for the calibration.
        user_brithi: Maximum brightness value for the calibration.
    """
    data1 = sdataset1.clone()
    data2 = sdataset2.clone()
    brkpoint1 = user_brkpoint1
    brkpoint2 = user_brkpoint2
    brkpoint3 = user_brkpoint3
    brkpoint4 = user_brkpoint4
    replace = user_replace
    stretch = user_stretchval
    britlo = int(user_britlo)
    brithi = int(user_brithi)
    
    if brkpoint1 != 'Default':
        brkpoint1 = int(brkpoint1)
        
    if brkpoint2 != 'Default':
        brkpoint2 = int(brkpoint2)
        
    if brkpoint3 != 'Default':
        brkpoint3 = int(brkpoint3)
        
    if brkpoint4 != 'Default':
        brkpoint4 = int(brkpoint4)
        
    if replace != 'Default':
        replace = int(replace)
        
    for t in range(data1.getDomainSet().getLength()):
        range1 = data1.getSample(t)
        range2 = data2.getSample(t)
        vals1 = range1.getFloats(0)
        max1 = max(vals1[0])
        min1 = min(vals1[0])
        vals2 = range2.getFloats(0)
        max2 = max(vals2[0])
        min2 = min(vals2[0])
        in_low = int(min([min1, min2]))
        in_hi = int(max([max1, max2]))
        
        if brkpoint1 == 'Default':
            brkpoint1=in_low
            
        if brkpoint2 == 'Default':
            brkpoint2=in_hi
            
        if brkpoint3 == 'Default':
            brkpoint3=in_low
            
        if brkpoint4 == 'Default':
            brkpoint4 = in_hi
            
        if replace == 'Default':
            replace = in_low
            
        domain = GridUtil.getSpatialDomain(range1)
        [element_size, line_size] = domain.getLengths()
        for i in range(line_size):
            for j in range(element_size):
                if vals1[0][i * element_size + j] < brkpoint1 or vals1[0][i * element_size + j] > brkpoint2 or vals2[0][i * element_size + j] < brkpoint3 or vals2[0][i * element_size + j] > brkpoint4:
                    vals1[0][i * element_size + j]=replace
                    
        if stretch == 'Contrast':
            lookup = contrast(in_low, in_hi, britlo, brithi, in_low, in_hi)
        elif stretch == 'Histogram':
            """ make a histogram from the first dataset """
            h = makeHistogram(vals1, element_size, line_size, in_low, brithi - britlo)
            lookup = histoStretch(in_low, in_hi, britlo, brithi, h)
            
        vals1 = modify(vals1, element_size, line_size, in_low, lookup)
        range1.setSamples(vals1)
        
    return data1
Beispiel #50
0
def lowPass2DFilter(sdataset, user_linecoef=0.5, user_elecoef=0.5, user_stretchval='Contrast', user_britlo=0, user_brithi=255):
    """Two dimensional low pass filter from McIDAS-X.
    
    Args:
        user_linecoef: Line coefficient: 0.0 < linecoef < 1.0.
        user_elecoef: Element coefficient: 0.0 < elecoef < 1.0.
        user_britlo: Minimum brightness value for the calibration.
        user_brithi: Maximum brightness value for the calibration.
    """
    newData = sdataset.clone()
    lcoef = float(user_linecoef)
    ecoef = float(user_elecoef)
    stretch=user_stretchval
    l1 = 1.0 - lcoef
    e1 = 1.0 - ecoef
    britlo = int(user_britlo)
    brithi = int(user_brithi)
    
    for t in xrange(newData.getDomainSet().getLength()):
        rangeObject = newData.getSample(t)
        vals = rangeObject.getFloats(0)
        in_hi = max(vals[0])
        in_low = min(vals[0])
        domain = GridUtil.getSpatialDomain(rangeObject)
        [element_size, line_size] = domain.getLengths()
        
        # save the first line
        realLine = vals[0][0:element_size].tolist()
        
        for i in range(line_size):
            # left to right filter along line
            val = vals[0][i * element_size]
            for j in range(element_size):
                if vals[0][i * element_size + j] > 0:
                    val = ecoef * val + e1 * vals[0][i * element_size + j]
                vals[0][i * element_size + j] = lowPass2DRound(val+0.0000001)
                
            # right to left filter along line
            val = vals[0][i * element_size + (element_size - 1)]
            
            # second argument of -1 ensures that the 0th element is done
            for j in xrange(element_size - 1, -1, -1):
                val = ecoef * val + e1 * vals[0][i * element_size + j]
                vals[0][i * element_size + j] = lowPass2DRound(val) 
                
            # filter along the elements
            for j in range(element_size):
                val = lcoef * realLine[j] + l1 * vals[0][i * element_size + j]
                vals[0][i * element_size + j] = lowPass2DRound(val) 
                
            realLine = vals[0][i * element_size:i * element_size + element_size].tolist()
            
        # filter along the lines going through the image up the elements
        # save the last line
        realLine = vals[0][(line_size - 1) * element_size:line_size * element_size].tolist()
        
        # second argument of -1 ensures that the 0th line is done
        for i in xrange(line_size - 1, -1, -1):
            for j in range(element_size):
                val = lcoef * realLine[j] + l1 * vals[0][i * element_size + j]
                vals[0][i * element_size + j] = lowPass2DRound(val) 
                
            realLine = vals[0][i * element_size:i * element_size + element_size].tolist()
            
        for i in range(line_size):
            for j in range(element_size):
                vals[0][i * element_size + j] = scaleOutsideVal(vals[0][i * element_size + j], britlo, brithi)
                
        filt_low = int(min(vals[0]))
        filt_hi = int(max(vals[0]))
        
        if stretch == 'Contrast':
            lookup = contrast(filt_low, filt_hi, britlo, brithi, filt_low, filt_hi)
        elif stretch == 'Histogram':
            # h = hist(field(vals), [0], [post_hi - post_low])
            h = makeHistogram(vals, element_size, line_size, filt_low, brithi - britlo)
            lookup = histoStretch(filt_low, filt_hi, in_low, in_hi, h)
            
        vals = modify(vals, element_size, line_size, filt_low, lookup)
        rangeObject.setSamples(vals)
        
    return newData
Beispiel #51
0
def mergeFilter(sdataset1, sdataset2, user_brkpoint1='Default', user_brkpoint2='Default', user_constant=0, user_stretchval='Contrast', user_britlo=0, user_brithi=255):
    """Merge filter from McIDAS-X.
    
    Requires 2 source datasets; merges them if the sdataset1 value is between 
    the specified breakpoints, otherwise it selects the sdataset2 value minus 
    the specified constant.
    
    Args:
        user_brkpoint1: sdataset1 breakpoint value.
                        (default=minimum value in either source dataset)
        user_brkpoint2: sdataset2 breakpoint value.
                        (default=maximum value in either source dataset)
        user_constant: Subtractive constant.
        user_britlo: Minimum brightness value for the calibration.
        user_brithi: Maximum brightness value for the calibration.
    """
    data1 = sdataset1.clone()
    data2 = sdataset2.clone()
    brkpoint1 = user_brkpoint1
    brkpoint2 = user_brkpoint2
    constant = int(user_constant)
    britlo = int(user_britlo)
    brithi = int(user_brithi)
    
    if brkpoint1 != 'Default':
        brkpoint1 = int(brkpoint1)
        
    if brkpoint2 != 'Default':
        brkpoint2 = int(brkpoint2)
        
    stretch = user_stretchval
    britlo = int(user_britlo)
    brithi = int(user_brithi)
    
    for t in range(data1.getDomainSet().getLength()):
        range1 = data1.getSample(t)
        range2 = data2.getSample(t)
        vals1 = range1.getFloats(0)
        max1 = max(vals1[0])
        min1 = min(vals1[0])
        vals2 = range2.getFloats(0)
        max2 = max(vals2[0])
        min2 = min(vals2[0])
        in_low = min([min1, min2])
        in_hi = max([max1, max2])
        
        if brkpoint1 == 'Default':
            brkpoint1 = in_low
            
        if brkpoint2 == 'Default':
            brkpoint2 = in_hi
            
        domain = GridUtil.getSpatialDomain(range1)
        [element_size, line_size] = domain.getLengths()
        for i in range(line_size):
            for j in range(element_size):
                if vals1[0][i * element_size + j] < brkpoint1 or vals1[0][i * element_size + j] > brkpoint2:
                    vals1[0][i * element_size + j] = vals2[0][i * element_size + j] - constant
                    
        for i in range(line_size):
            for j in range(element_size):
                vals1[0][i * element_size + j] = scaleOutsideVal(vals1[0][i * element_size + j], britlo, brithi)
                
        filt_low = int(min([min(vals1[0]), min2]))
        filt_hi = int(max([max(vals1[0]), max2]))
        if stretch == 'Contrast':
            lookup = contrast(filt_low, filt_hi, in_low, in_hi, filt_low, filt_hi)
        elif stretch == 'Histogram':
            # make a histogram from both datasets
            v = []
            v.append(vals1[0])
            v.append(vals2[0])
            h = makeHistogram(v, element_size, line_size, filt_low, brithi - britlo)
            lookup = histoStretch(filt_low, filt_hi, in_low, in_hi, h)
            
        vals1 = modify(vals1, element_size, line_size, filt_low, lookup)
        range1.setSamples(vals1)
        
    return data1
Beispiel #52
0
def make2D(slice):
    """Make a 2D slice from a 3D slice at a single level """
    return GridUtil.make2DGridFromSlice(slice)
Beispiel #53
0
def passFilter(sdataset, user_passname, user_radius=50, user_leak=100, user_stretchval='Contrast', user_britlo=0, user_brithi=255):
    """Used by one-dimensional low-pass and high-pass filters from McIDAS-X.
    
    Args:
        user_passname: Either 'High' or 'Low'.
        user_radius: Sample length surrounding the source element; used for 
                     sample average.
        user_leak: Filter efficiency.
        user_britlo: Minimum brightness value for the calibration.
        user_brithi: Maximum brightness value for the calibration.
    """
    newData = sdataset.clone()
    radius = int(user_radius)
    leak = int(user_leak)
    stretch = user_stretchval
    britlo = int(user_britlo)
    brithi = int(user_brithi)
    
    ntot = 2 * radius + 1
    nmod = radius + 1
    
    for t in xrange(len(newData)):
        rangeObject = newData.getSample(t)
        vals = rangeObject.getFloats()
        in_hi = max(vals[0])
        in_low = min(vals[0])
        midpoint = (in_hi - in_low) / 2 + in_low
        domain=GridUtil.getSpatialDomain(rangeObject)
        [element_size, line_size] = domain.getLengths()
        radiusArray = range(nmod)
        
        for i in xrange(line_size):
            nr = 1 + radius
            
            if nr > element_size:
                nr = element_size
                
            k = vals[0][i * element_size: i * element_size + nr].tolist()
            
            for p in range(len(k)):
                k[p] = int(k[p])
                
            radiusArray = radius * [int(vals[0][i * element_size])] + k
            nsum = sum(radiusArray)
            
            nright = radius
            for j in xrange(element_size):
                curVal = vals[0][i * element_size + j]
                average = int((leak * nsum) / (100 * ntot))
                
                if user_passname.startswith('High'):
                    vals[0][i * element_size + j] = scaleOutsideVal(curVal - average + midpoint, britlo, brithi)
                    
                if user_passname.startswith('Low'):
                    vals[0][i * element_size + j] = scaleOutsideVal(average, britlo, brithi)
                    
                # move the radius array one element to the right and 
                # recalculate the sum
                radiusArray.pop(0)
                nright = nright + 1
                mright = nright
                
                if mright > element_size - 1:
                    mright = element_size - 1
                    
                radiusArray.append(int(vals[0][i * element_size + mright]))
                nsum = sum(radiusArray)
                
        filt_low = int(min(vals[0]))
        filt_hi = int(max(vals[0]))
        
        if stretch == 'Contrast':
            lookup = contrast(filt_low, filt_hi, britlo, brithi, filt_low, filt_hi)
        elif stretch == 'Histogram':
            h = makeHistogram(vals, element_size, line_size, filt_low, brithi - britlo)
            lookup = histoStretch(filt_low, filt_hi, in_low, in_hi, h)
            
        vals = modify(vals, element_size, line_size, filt_low, lookup)
        rangeObject.setSamples(vals)
        
    return newData
Beispiel #54
0
def lonFlip(grid):
    """ Flip the longitudes in a grid from -180-180 to 0-360 (or vice-versa).
        Only works for cyclic rectilinear grids.
    """
    return GridUtil.lonFlip(grid)
Beispiel #55
0
def cloudFilter(sdataset1, sdataset2, user_replace='Default', user_constant=0, user_stretchval='Contrast', user_britlo=0, user_brithi=255):
    """Cloud filter from McIDAS-X - requires 2 source datasets.
    
    Args:
        user_replace: Replacement value (default=minimum value in either 
                      sdataset1 or sdataset2)
        user_constant: Additive constant (default=0)
        user_britlo: Minimum brightness value for the calibration.
        user_brithi: Maximum brightness value for the calibration.
    """
    data1 = sdataset1.clone()
    data2 = sdataset2.clone()
    replace = user_replace
    constant = int(user_constant)
    britlo = int(user_britlo)
    brithi = int(user_brithi)
    
    if replace != 'Default':
        replace = int(replace)
    stretch = user_stretchval
    
    for t in range(data1.getDomainSet().getLength()):
        range1 = data1.getSample(t)
        vals1 = range1.getFloats(0)
        min1 = min(vals1[0])
        max1 = max(vals1[0])
        range2 = data2.getSample(t)
        vals2 = range2.getFloats(0)
        min2 = min(vals2[0])
        max2 = max(vals2[0])
        in_low = min([min1, min2])
        in_hi = max([max1, max2])
        if replace == 'Default':
            replace = in_low
            
        domain = GridUtil.getSpatialDomain(range1)
        [element_size, line_size] = domain.getLengths()
        
        for i in range(line_size):
            for j in range(element_size):
                line1 = vals1[0][i * element_size + j]
                line2 = vals2[0][i * element_size + j]
                
                if line1 <= (line2 + constant):
                    vals1[0][i * element_size + j] = replace
                    
        for i in range(line_size):
            for j in range(element_size):
                vals1[0][i * element_size + j] = scaleOutsideVal(vals1[0][i * element_size + j], britlo, brithi)
                
        filt_low = int(min([min(vals1[0]), min2]))
        filt_hi = int(max([max(vals1[0]), max2]))
        if stretch == 'Contrast':
            lookup = contrast(filt_low, filt_hi, in_low, in_hi, filt_low, filt_hi)
        elif stretch == 'Histogram':
            # make a histogram from both datasets
            v = []
            v.append(vals1[0])
            v.append(vals2[0])
            h = makeHistogram(v, element_size, line_size, filt_low, brithi - britlo)
            lookup = histoStretch(filt_low, filt_hi, in_low, in_hi, h)
            
        vals1 = modify(vals1, element_size, line_size, filt_low, lookup)
        range1.setSamples(vals1)
        
    return data1
Beispiel #56
0
def setLevel(grid, level, unit):
    return GridUtil.addLevelToGrid(grid, float(level), unit)
Beispiel #57
0
def cloudFilter(sdataset1, sdataset2, user_replace='Default', user_constant=0, user_stretchval='Contrast', user_britlo=0, user_brithi=255):
    """Cloud filter from McIDAS-X - requires 2 source datasets.
    
    Args:
        user_replace: Replacement value (default=minimum value in either 
                      sdataset1 or sdataset2)
        user_constant: Additive constant (default=0)
        user_britlo: Minimum brightness value for the calibration.
        user_brithi: Maximum brightness value for the calibration.
    """
    data1 = sdataset1.clone()
    data2 = sdataset2.clone()
    replace = user_replace
    constant = int(user_constant)
    britlo = int(user_britlo)
    brithi = int(user_brithi)
    
    if replace != 'Default':
        replace = int(replace)
    stretch = user_stretchval
    
    for t in range(data1.getDomainSet().getLength()):
        range1 = data1.getSample(t)
        vals1 = range1.getFloats(0)
        min1 = min(vals1[0])
        max1 = max(vals1[0])
        range2 = data2.getSample(t)
        vals2 = range2.getFloats(0)
        min2 = min(vals2[0])
        max2 = max(vals2[0])
        in_low = min([min1, min2])
        in_hi = max([max1, max2])
        if replace == 'Default':
            replace = in_low
            
        domain = GridUtil.getSpatialDomain(range1)
        [element_size, line_size] = domain.getLengths()
        
        for i in range(line_size):
            for j in range(element_size):
                line1 = vals1[0][i * element_size + j]
                line2 = vals2[0][i * element_size + j]
                
                if line1 <= (line2 + constant):
                    vals1[0][i * element_size + j] = replace
                    
        for i in range(line_size):
            for j in range(element_size):
                vals1[0][i * element_size + j] = scaleOutsideVal(vals1[0][i * element_size + j], britlo, brithi)
                
        filt_low = int(min([min(vals1[0]), min2]))
        filt_hi = int(max([max(vals1[0]), max2]))
        if stretch == 'Contrast':
            lookup = contrast(filt_low, filt_hi, in_low, in_hi, filt_low, filt_hi)
        elif stretch == 'Histogram':
            # make a histogram from both datasets
            v = []
            v.append(vals1[0])
            v.append(vals2[0])
            h = makeHistogram(v, element_size, line_size, filt_low, brithi - britlo)
            lookup = histoStretch(filt_low, filt_hi, in_low, in_hi, h)
            
        vals1 = modify(vals1, element_size, line_size, filt_low, lookup)
        range1.setSamples(vals1)
        
    return data1
Beispiel #58
0
def passFilter(sdataset, user_passname, user_radius=50, user_leak=100, user_stretchval='Contrast', user_britlo=0, user_brithi=255):
    """Used by one-dimensional low-pass and high-pass filters from McIDAS-X.
    
    Args:
        user_passname: Either 'High' or 'Low'.
        user_radius: Sample length surrounding the source element; used for 
                     sample average.
        user_leak: Filter efficiency.
        user_britlo: Minimum brightness value for the calibration.
        user_brithi: Maximum brightness value for the calibration.
    """
    newData = sdataset.clone()
    radius = int(user_radius)
    leak = int(user_leak)
    stretch = user_stretchval
    britlo = int(user_britlo)
    brithi = int(user_brithi)
    
    ntot = 2 * radius + 1
    nmod = radius + 1
    
    for t in xrange(len(newData)):
        rangeObject = newData.getSample(t)
        vals = rangeObject.getFloats()
        in_hi = max(vals[0])
        in_low = min(vals[0])
        midpoint = (in_hi - in_low) / 2 + in_low
        domain=GridUtil.getSpatialDomain(rangeObject)
        [element_size, line_size] = domain.getLengths()
        radiusArray = range(nmod)
        
        for i in xrange(line_size):
            nr = 1 + radius
            
            if nr > element_size:
                nr = element_size
                
            k = vals[0][i * element_size: i * element_size + nr].tolist()
            
            for p in range(len(k)):
                k[p] = int(k[p])
                
            radiusArray = radius * [int(vals[0][i * element_size])] + k
            nsum = sum(radiusArray)
            
            nright = radius
            for j in xrange(element_size):
                curVal = vals[0][i * element_size + j]
                average = int((leak * nsum) / (100 * ntot))
                
                if user_passname.startswith('High'):
                    vals[0][i * element_size + j] = scaleOutsideVal(curVal - average + midpoint, britlo, brithi)
                    
                if user_passname.startswith('Low'):
                    vals[0][i * element_size + j] = scaleOutsideVal(average, britlo, brithi)
                    
                # move the radius array one element to the right and 
                # recalculate the sum
                radiusArray.pop(0)
                nright = nright + 1
                mright = nright
                
                if mright > element_size - 1:
                    mright = element_size - 1
                    
                radiusArray.append(int(vals[0][i * element_size + mright]))
                nsum = sum(radiusArray)
                
        filt_low = int(min(vals[0]))
        filt_hi = int(max(vals[0]))
        
        if stretch == 'Contrast':
            lookup = contrast(filt_low, filt_hi, britlo, brithi, filt_low, filt_hi)
        elif stretch == 'Histogram':
            h = makeHistogram(vals, element_size, line_size, filt_low, brithi - britlo)
            lookup = histoStretch(filt_low, filt_hi, in_low, in_hi, h)
            
        vals = modify(vals, element_size, line_size, filt_low, lookup)
        rangeObject.setSamples(vals)
        
    return newData
Beispiel #59
0
def exportGridToNetcdf(grid,filename='grid.nc'):
    """Write out the grid data to CF compliant netCDF file"""
    GridUtil.exportGridToNetcdf(grid,filename)
    return grid
Beispiel #60
0
def resampleGrid(oldGrid, gridwithNewDomain):
    """ display gridded data on a new domain
   """
    newLocs = GridUtil.getSpatialDomain(gridwithNewDomain)
    return GridUtil.resampleGrid(oldGrid, newLocs)