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)
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)
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)
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
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
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
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
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
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
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
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
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
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]
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
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
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
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
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]
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
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
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
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]
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
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]
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
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
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
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;
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
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
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
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
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
def writeGridToXls(grid,filename='grid.xls'): """Write out the grid data to an excel spreadsheet""" GridUtil.writeGridToXls(grid,filename) return grid
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)
def newName(field, varname, copy=0): """ create a new field with a new parameter name """ return GridUtil.setParamType(field, varname, copy)
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
def exportGridToNetcdf(grid, filename='grid.nc'): """Write out the grid data to CF compliant netCDF file""" GridUtil.exportGridToNetcdf(grid, filename) return grid
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)
def writeGridToXls(grid, filename='grid.xls'): """Write out the grid data to an excel spreadsheet""" GridUtil.writeGridToXls(grid, filename) return grid
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
def make2D(slice): """Make a 2D slice from a 3D slice at a single level """ return GridUtil.make2DGridFromSlice(slice)
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
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
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
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
def setLevel(grid, level, unit): return GridUtil.addLevelToGrid(grid, float(level), unit)
def exportGridToNetcdf(grid,filename='grid.nc'): """Write out the grid data to CF compliant netCDF file""" GridUtil.exportGridToNetcdf(grid,filename) return grid
def resampleGrid(oldGrid, gridwithNewDomain): """ display gridded data on a new domain """ newLocs = GridUtil.getSpatialDomain(gridwithNewDomain) return GridUtil.resampleGrid(oldGrid, newLocs)