【问题标题】:Speckle ( Lee Filter) in PythonPython中的散斑(李过滤器)
【发布时间】:2017-02-08 16:54:15
【问题描述】:

我正在尝试在卫星 SAR 图像中去除斑点噪声。我没有得到任何可以在 SAR 图像中去除斑点噪声的软件包。我已经尝试过 pyradar,但它适用于 python 2.7,我正在使用 Windows 上的 python 3.5 处理 Anaconda。 Rsgislib 也可用,但它在 Linux 上。 Joseph Meiring 在 github 上也给出了 Lee 过滤器代码,但它无法正常工作。 : https://github.com/reptillicus/LeeFilter

任何人都可以分享斑点过滤器的python脚本或如何在python中进行斑点过滤器设计。

【问题讨论】:

  • 将 pyradar 脚本从 Python 2.7 转换为 Python 3 应该很简单。

标签: python python-3.x image-processing imagefilter sar


【解决方案1】:

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

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

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

安装者:

pip install findpeaks

运行者:

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))

如果你想直接使用去噪滤波器,可以这样做:

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')

如果您想尝试使用该库,可以通过here 找到更多示例。

【讨论】:

    【解决方案2】:

    这是一个有趣的小问题。与其尝试为它找到一个库,不如从定义中编写它?

    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_meanimg_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 中的散斑,但您可能需要研究现代边缘感知降噪器,如引导滤波器或双边滤波器过滤器。

    【讨论】:

    • 非常感谢!!!!亚历克斯,实际上我是这个领域的新手,找不到好的文献。非常感谢!!!!!!!!!
    • @Shubham_geo 不客气。我添加了一些注释和一个示例。
    • pyradar 包似乎是我拥有的图像的问题,您能否指出我们可以在这里找到所有过滤器定义的正​​确位置,就像您上面的那个一样? pyradar-tools.readthedocs.io/en/latest/…
    • 这是一个很棒的简单实现。我认为您的代码中有一个小错误。根据this article,权重参数计算为核方差除以核方差加上整体图像方差之和。当您计算权重时,您改为平方方差。过滤器的工作原理基本相同,但在均匀区域中平滑更为严格。
    • @Addison:是的,你是对的,方差是“sigma squared”,而不是 sigma。发现得好!现在已经修好了。
    猜你喜欢
    • 2015-06-13
    • 2013-01-29
    • 2012-06-19
    • 2013-09-10
    • 2021-03-05
    • 2021-04-22
    • 1970-01-01
    • 2015-02-09
    相关资源
    最近更新 更多