これは楽しい小さな問題です。そのためのライブラリを見つけようとするのではなく、定義から書いてみませんか?
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
ウィンドウをサイズ x サイズの正方形にしたくない場合は、uniform_filter
別のもの (ディスクによる畳み込み、ガウス フィルターなど) に置き換えてください。img_mean
と の両方を計算するのに同じである限り、任意のタイプの (重み付けされた) 平均化フィルターを使用できますimg_square_mean
。
Lee フィルターは、フィルターとしてはかなり古いものに思えます。エッジがあるウィンドウでは、分散が全体的な画像の分散よりもはるかに高くなるため、エッジでは適切に動作しません。したがって、(フィルター処理された画像に対するフィルター処理されていない画像の) 重みは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 のスペックルに特に適した機能があるかどうかはわかりませんが、ガイド付きフィルターやバイラテラル フィルターなどの最新のエッジ認識デノイザーを調べてください。