这是一个有趣的小问题。为什么不从定义中写出它,而不是试图为它找到一个库?
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**2/(img_variance**2 + overall_variance**2)
img_output = img_mean + img_weights * (img - img_mean)
return img_output
如果你不想窗口是大小x尺寸的正方形,只需更换uniform_filter用别的东西(卷积磁盘,高斯滤波器等)。只要计算img_mean和img_square_mean,任何类型的(加权)平均滤波器都可以。
李过滤器似乎相当老式的过滤器。它在边缘表现不好,因为对于任何有边缘的窗口来说,方差将远远高于整体图像方差,因此(未滤波图像相对于滤波图像的)权重要接近1
一个例子:
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')
正如你所看到的降噪总体很好,但沿着边缘弱得多。
我对SAR不熟悉,所以我不知道Lee过滤器是否具有某些功能,使其特别适用于SAR斑点,但您可能需要考虑现代边缘感知的除雾器,如引导过滤器或双边过滤器。