def shotMain(vals,bline,eline,element_size,line_size,filter_diff): """Actual shot filter code - needs to be separate as clean filter calls it as well.""" for i in range(line_size)[bline:eline]: for j in range(element_size)[1:-2]: left = vals[0][i*element_size + j - 1] value = vals[0][i*element_size + j] right = vals[0][i*element_size + j + 2] left_diff = value - left right_diff = value - right sign = left_diff *right_diff if (sign < 0): continue left_diff = abs(left_diff) if (left_diff < filter_diff): continue right_diff = abs(right_diff) if (right_diff < filter_diff): continue # for some reason, have to do this to floor the value p = (left + right)/2 a = field((p,)) b = a.floor().getValues(0) vals[0][i*element_size + j] = b[0] return vals
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 shotMain(vals,bline,eline,element_size,line_size,filter_diff): """Actual shot filter code - needs to be separate as clean filter calls it as well.""" for i in range(line_size)[bline:eline]: for j in range(element_size)[1:-2]: left = vals[0][i*element_size + j - 1] value = vals[0][i*element_size + j] right = vals[0][i*element_size + j + 2] left_diff = value - left right_diff = value - right sign = left_diff *right_diff if (sign < 0): continue left_diff = abs(left_diff) if (left_diff < filter_diff): continue right_diff = abs(right_diff) if (right_diff < filter_diff): continue # for some reason, have to do this to floor the value p = (left + right)/2 a = field((p,)) b = a.floor().getValues(0) vals[0][i*element_size + j] = b[0] return vals
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. Arg 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