Python中的斑点(Lee Filter)

Shu*_*geo 4 python image-processing sar python-3.x imagefilter

我试图在卫星SAR图像中去除斑点噪声.我没有得到任何在SAR图像中去除散斑噪声的包.我已经尝试过pyradar,但它适用于python 2.7,我在Windows上运行带有python 3.5的Anaconda.此外,Rsgislib可用,但它在Linux上.Joseph meiring还在github上提供了一个Lee过滤器代码,但它无法正常工作.:https: //github.com/reptillicus/LeeFilter

请问,任何人都可以共享斑点滤波器的python脚本或如何在python中进行散斑滤波器设计.

Ale*_*x I 8

这是一个有趣的小问题.为什么不从定义中写出来,而不是试图为它找到一个库?

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
Run Code Online (Sandbox Code Playgroud)

如果你不希望窗口是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')
Run Code Online (Sandbox Code Playgroud)

带边缘的嘈杂图像 李过滤了

正如你所看到的,一般来说降噪效果非常好,但沿边缘的噪音要弱得多.

我不熟悉SAR,所以我不知道Lee滤镜是否有一些特性使它特别适合SAR中的散斑,但你可能想要研究现代的边缘感知降噪器,如引导滤波器或双边滤波器.


erd*_*ant 7

一般来说,通过肉眼很难在二维图中看到噪声滤波器的效果。让我通过例子来证明这一点。假设我们有这张嘈杂的图片:

噪声示例

现在让我将此图像转换为 3D 网格图。然后它会看起来像这样。噪点变得非常清晰,而且图片左右两侧的深度差异也变得非常明显。

网格图

该库findpeaks包含许多过滤器,这些过滤器是从各种(旧的 python 2)库中使用的,并重写为 python 3。应用过滤器非常简单,如下所示。请注意,此示例对于 SAR 图像来说似乎不太具有代表性,因为没有斑点噪声。在此示例中,均值或中值滤波器似乎表现得非常好。在局部高度很重要的散斑噪声图像中,这种均值/中值滤波器可以去除峰值,从而破坏感兴趣的信号。

安装方式:

pip install findpeaks
Run Code Online (Sandbox Code Playgroud)

由......运营:

from findpeaks import findpeaks

# Read image
img = cv2.imread('noise.png')

filters = [None, 'lee','lee_enhanced','kuan', 'fastnl','bilateral','frost','median','mean']

for getfilter in filters:
    fp = findpeaks(method='topology', scale=False, denoise=getfilter, togray=True, imsize=False, window=15)
    fp.fit(img)
    fp.plot_mesh(wireframe=False, title=str(getfilter), view=(30,30))
Run Code Online (Sandbox Code Playgroud)

比较方法

如果您想直接使用去噪滤波器,可以按如下方式完成:

import findpeaks
import matplotlib.pyplot as plt

# Read image
img = cv2.imread('noise.png')

# filters parameters
# window size
winsize = 15
# damping factor for frost
k_value1 = 2.0
# damping factor for lee enhanced
k_value2 = 1.0
# coefficient of variation of noise
cu_value = 0.25
# coefficient of variation for lee enhanced of noise
cu_lee_enhanced = 0.523
# max coefficient of variation for lee enhanced
cmax_value = 1.73

# Some pre-processing
# Make grey image
img = findpeaks.stats.togray(img)
# Scale between [0-255]
img = findpeaks.stats.scale(img)

# Denoising
# fastnl
img_fastnl = findpeaks.stats.denoise(img, method='fastnl', window=winsize)
# bilateral
img_bilateral = findpeaks.stats.denoise(img, method='bilateral', window=winsize)
# frost filter
image_frost = findpeaks.frost_filter(img, damping_factor=k_value1, win_size=winsize)
# kuan filter
image_kuan = findpeaks.kuan_filter(img, win_size=winsize, cu=cu_value)
# lee filter
image_lee = findpeaks.lee_filter(img, win_size=winsize, cu=cu_value)
# lee enhanced filter
image_lee_enhanced = findpeaks.lee_enhanced_filter(img, win_size=winsize, k=k_value2, cu=cu_lee_enhanced, cmax=cmax_value)
# mean filter
image_mean = findpeaks.mean_filter(img, win_size=winsize)
# median filter
image_median = findpeaks.median_filter(img, win_size=winsize)


plt.figure(); plt.imshow(img_fastnl, cmap='gray'); plt.title('Fastnl')
plt.figure(); plt.imshow(img_bilateral, cmap='gray'); plt.title('Bilateral')
plt.figure(); plt.imshow(image_frost, cmap='gray'); plt.title('Frost')
plt.figure(); plt.imshow(image_kuan, cmap='gray'); plt.title('Kuan')
plt.figure(); plt.imshow(image_lee, cmap='gray'); plt.title('Lee')
plt.figure(); plt.imshow(image_lee_enhanced, cmap='gray'); plt.title('Lee Enhanced')
plt.figure(); plt.imshow(image_mean, cmap='gray'); plt.title('Mean')
plt.figure(); plt.imshow(image_median, cmap='gray'); plt.title('Median')
Run Code Online (Sandbox Code Playgroud)

如果您想使用该库,可以在此处找到更多示例