Beispiel #1
0
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
Beispiel #2
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 #3
0
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
Beispiel #4
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.
    
    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