Search code examples
pythonpython-3.ximage-processingimagefiltersar

Speckle ( Lee Filter) in Python


I am trying to do speckle noise removal in satellite SAR image.I am not getting any package which does speckle noise removal in SAR image. I have tried pyradar but it works with python 2.7 and I am working on Anaconda with python 3.5 on windows. Also Rsgislib is available but it is on Linux. Joseph meiring has also given a Lee filter code on github but it fails to work. : https://github.com/reptillicus/LeeFilter

Kindly, can anyone share the python script for Speckle Filter or how to proceed for speckle filter design in python.


Solution

  • This is a fun little problem. Rather than try to find a library for it, why not write it from the definition?

    from scipy.ndimage.filters import uniform_filter
    from scipy.ndimage.measurements import variance
    
    def lee_filter(img, size):
        img_mean = uniform_filter(img, (size, size))
        img_sqr_mean = uniform_filter(img**2, (size, size))
        img_variance = img_sqr_mean - img_mean**2
    
        overall_variance = variance(img)
    
        img_weights = img_variance / (img_variance + overall_variance)
        img_output = img_mean + img_weights * (img - img_mean)
        return img_output
    

    If you don't want the window to be a square of size x size, just replace uniform_filter with something else (convolution with a disk, gaussian filter, etc). Any type of (weighted) averaging filter will do, as long as it is the same for calculating both img_mean and img_square_mean.

    The Lee filter seems rather old-fashioned as a filter. It won't behave well at edges because for any window that has an edge in it, the variance is going to be much higher than the overall image variance, and therefore the weights (of the unfiltered image relative to the filtered image) are going to be close to 1.

    An example:

    from pylab import *
    import numpy as np
    img = np.random.normal(0.5, 0.1, (100,100))
    img[:,:50] += 0.25
    imshow(img, vmin=0, vmax=1, cmap='gray')
    imshow(lee_filter(img, 20), vmin=0, vmax=1, cmap='gray')
    

    Noisy image with edge Lee filtered

    As you can see the noise reduction is very good in general, but much weaker along the edge.

    I'm not familiar with SAR so I don't know if Lee filter has some features that make it particularly good for speckle in SAR, but you may want to look into modern edge-aware denoisers, like guided filter or bilateral filter.