lee滤波对于sar影像去噪非常有用

Lee滤波和Refine-Lee滤波 Lee滤波是选择一定长度的窗口作为局部区域,利用图像局部统计特性进行SAR图像斑点滤波的典型方法。其是基于完全发育的斑点噪声模型。(图像上斑点处于均匀区域,且斑点噪声与图像信号不相关)根据试验研究表明完全发育的相干噪声是一种乘性噪声,即有(k,l)是图像像素的坐标,I(k,l)是实际得到的图强强度(含有噪声),x(k,l)是一个平稳随机过程,描述了原始信号,v(k,l)即为相干斑噪声,它是一个均值为1,方差为的平稳白噪声。乘性相干斑模型如下:噪声抑制的两个关键环节:一是建立真实后向散射系数的估计机制,二是制 阅读详情

lee滤波对于sar影像去噪非常有用。且lee滤波也很容易理解,且看以下python代码编写的lee滤波函数。

import numpy as np
from scipy.ndimage import uniform_filter
​
def lee_filter(img, size, global_variance):
    """
    Apply Lee filter for speckle noise reduction using a global variance.
    """
    img_mean = uniform_filter(img, (size, size))
    img_sqr_mean = uniform_filter(img ** 2, (size, size))
    img_variance = img_sqr_mean - img_mean ** 2
​
    # Avoid division by zero or invalid operations
    denominator = img_variance + global_variance
    denominator[denominator == 0] = 1e-9  # Prevent division by zero
​
    img_weights = img_variance / denominator
    img_output = img_mean + img_weights * (img - img_mean)
    return img_output

但是在实际处理时,我们一般还要做一些处理,比如规定好输入、输出。一般来说,遥感影像是巨大的,所以我们也要考虑到硬件的性能。

以下是我所使用的改进的代码,仅供参考。

import numpy as np
from scipy.ndimage import uniform_filter
from osgeo import gdal
import sys
​
def translate(band, number=2):
    """
    Convert the value of a band to the range 0-255 for visualization
    2% linear conversion
    """
    if np.all(np.isnan(band)) or not np.any(band):
        return np.zeros_like(band, dtype=np.uint8)
​
    max_val = np.nanmax(band)
    min_val = np.nanmin(band)
​
    if max_val == 0:
        return np.zeros_like(band, dtype=np.uint8)
​
    band = band.astype(np.float64)
    band[band == -9999] = np.nan
    band[band == 0] = np.nan
​
    band_data = band / max_val * 255
    band_data[np.isnan(band_data)] = 0
​
    d2 = np.percentile(band_data, number)
    u98 = np.percentile(band_data, 100 - number)
​
    if u98 - d2 == 0:
        return np.zeros_like(band, dtype=np.uint8)
​
    maxout = 255
    minout = 0
    data_8bit_new = minout + ((band_data - d2) / (u98 - d2)) * (maxout - minout)
    data_8bit_new[data_8bit_new < minout] = minout
    data_8bit_new[data_8bit_new > maxout] = maxout
    return data_8bit_new
​
def read_img(file):
    """
    Read a Sentinel-1 GeoTIFF image and return its data, geotransform, projection, and GCPs.
    """
    dataset = gdal.Open(file)
    if dataset is None:
        raise FileNotFoundError(f"Could not open {file}")
​
    img_width = dataset.RasterXSize
    img_height = dataset.RasterYSize
    img_data = dataset.GetRasterBand(1).ReadAsArray(0, 0, img_width, img_height)
    img_data = img_data.astype(float)
    img_data[img_data == -9999] = np.nan
    img_data[img_data == 0] = np.nan
​
    geotransform = dataset.GetGeoTransform()
    if geotransform is None:
        raise ValueError("Input image has no geotransform information")
​
    projection = dataset.GetProjection()
​
​
    # Retrieve GCPs and GCP projection
    gcps = dataset.GetGCPs()
    gcp_projection = dataset.GetGCPProjection() if gcps else None
​
    return img_data, dataset, geotransform, projection, gcps, gcp_projection
​
def lee_filter(img, size, global_variance):
    """
    Apply Lee filter for speckle noise reduction using a global variance.
    """
    img_mean = uniform_filter(img, (size, size))
    img_sqr_mean = uniform_filter(img ** 2, (size, size))
    img_variance = img_sqr_mean - img_mean ** 2
​
    denominator = img_variance + global_variance
    denominator[denominator == 0] = 1e-9
​
    img_weights = img_variance / denominator
    img_output = img_mean + img_weights * (img - img_mean)
    return img_output
​
def process_block(full_img_data, block_y, block_x, block_height, block_width, window_size, global_variance):
    """
    Process a single block with padding to handle edge effects correctly.
    Expects full_img_data to be pre-filled with 0 instead of NaN.
    """
    full_height, full_width = full_img_data.shape
    pad_size = window_size // 2
​
    y_start_padded = max(0, block_y - pad_size)
    y_end_padded = min(full_height, block_y + block_height + pad_size)
    x_start_padded = max(0, block_x - pad_size)
    x_end_padded = min(full_width, block_x + block_width + pad_size)
​
    padded_block = full_img_data[y_start_padded:y_end_padded, x_start_padded:x_end_padded]
    filtered_padded_block = lee_filter(padded_block, window_size, global_variance)
​
    y_start_crop = block_y - y_start_padded
    y_end_crop = y_start_crop + block_height
    x_start_crop = block_x - x_start_padded
    x_end_crop = x_start_crop + block_width
​
    return filtered_padded_block[y_start_crop:y_end_crop, x_start_crop:x_end_crop]
​
def block_processing(img_data, output_path, dataset, geotransform, projection, gcps, gcp_projection, block_size=512, window_size=7):
    """
    Process the image in blocks, replacing NaNs with 0 for filtering and restoring them after.
    Preserves Geo Points (geotransform), Coordinate System (projection), and GCPs in output.
    """
    full_height, full_width = img_data.shape
    driver = gdal.GetDriverByName('GTiff')
    if driver is None:
        raise ValueError("GDAL GTiff driver not available")
​
    out_dataset = driver.Create(output_path, full_width, full_height, 1, gdal.GDT_Float32)
    if out_dataset is None:
        raise RuntimeError(f"Failed to create output file: {output_path}")
​
    # Set geospatial metadata
    out_dataset.SetGeoTransform(geotransform)
    out_dataset.SetProjection(projection)
    if gcps and gcp_projection:
        print("Applying GCPs to output image...")
        out_dataset.SetGCPs(gcps, gcp_projection)
​
    out_band = out_dataset.GetRasterBand(1)
    out_band.SetNoDataValue(np.nan)
​
    print("Creating NaN mask...")
    nan_mask = np.isnan(img_data)
​
    print("Replacing NaN with 0 for processing...")
    processing_data = np.nan_to_num(img_data, nan=0.0)
​
    print("Calculating global image variance (from original data)...")
    global_variance = np.nanvar(img_data)
    if global_variance == 0:
        global_variance = 1e-9
    print(f"Global variance: {global_variance}")
​
    print("Starting block processing...")
    for y in range(0, full_height, block_size):
        for x in range(0, full_width, block_size):
            block_height = min(block_size, full_height - y)
            block_width = min(block_size, full_width - x)
​
            filtered_block = process_block(processing_data, y, x, block_height, block_width, window_size, global_variance)
            mask_block = nan_mask[y:y + block_height, x:x + block_width]
            filtered_block[mask_block] = np.nan
​
            out_band.WriteArray(filtered_block, xoff=x, yoff=y)
​
    print("Block processing finished.")
    out_band.FlushCache()
    out_dataset.FlushCache()
    out_band = None
    out_dataset = None
    print(f"Filtered image saved to {output_path}")
​
if __name__ == '__main__':
    # Update these paths to your local files
    testfile = r'F:\s1a-iw-grd-vv.tiff'
    outputfile = r'D:\lee_filtered_s1a-iw-grd-vv.tif'
​
    try:
        print(f"Reading input file: {testfile}")
        img_data, dataset, geotransform, projection, gcps, gcp_projection = read_img(testfile)
        print(f"Geotransform: {geotransform}")
        print(f"Projection: {projection}")
        if gcps:
            print(f"Found {len(gcps)} GCPs in input image.")
        else:
            print("No GCPs found in input image.")
        block_processing(img_data, outputfile, dataset, geotransform, projection, gcps, gcp_projection, block_size=512, window_size=7)
    except FileNotFoundError as e:
        print(f"Error: {e}. Please ensure the input file path is correct.")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")
    finally:
        dataset = None

结果对比

我们使用一景GF3影像做测试,去噪前:

image-20250618170753403

去噪后:

image-20250618170733930

局部放大对比,去噪前:

image-20250618170850080

image-20250618170905007

哨兵1影像的去噪前后对比

去噪前

image-20250619090857660

去噪后

image-20250619090743794

局部放大对比,去噪前:

局部放大对比,去噪后:

image-20250619090952448

再放大对比,去噪前:

image-20250619091117329

image-20250619091124138

基于航天宏图PIE-SAR软件的高分三号(GF-3)SAR影像的预处理 软件官网 航天宏图—国内领先的卫星运营与应用服务提供商(官网) 一、数据导入 数据导入-GF-3-根据模式选择 参数文件导入解压后GF-3数据的XML文件 通道自动填充 设置输出目录 确定 等待,加载图像、自动构建金字塔 二、复数数据转换 强度/幅度特征是SAR影像最主要的特征之一,基于SAR强度/幅度影像可以提取地物目标信息,因此需要将SAR复数数据转换为SAR强度/幅度数据。导入输入影像,设置参数类型,输出目录、命名、类型; 漫长的等待 三、多视 为提... 阅读详情

相关推荐

Lee滤波器---MATLAB

%% Lee滤波器 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 [filename ,pathname]=... uigetfile({'*.bmp';'*.tif';'*.jpg';},'选择图片'); %选择图片路径 str=[pathname filename]; % 合成路径+文件名 im = imread(str); % 读图.

临风暖阳的博客 2149

Lee滤波和Refine-Lee滤波实验

Lee滤波和Refine-Lee滤波实验

python 数字图像处理之Lee滤波器

python 数字图像处理之Lee滤波器

weixin_43896283的博客 7985

如何理解scipy.ndimage中的uniform_filter

如何理解scipy.ndimage中的uniform_filter

Kp0fS的草稿纸 1605

Matlab图像处理之Lee滤波器

LEE滤波器是一种基于窗函数的滤波器,其原理是将窗口内的像素进行加权平均,以消除图像中的噪声。这种滤波器通常用于SAR图像去噪,因为SAR图像中常常存在噪声和模糊现象。

weixin_43896283的博客 3470

GEE:实现 Lee 杂波滤波器(Lee speckle filter)降低或去除SAR图像中的杂波(speckle noise)

Lee speckle filter(Lee杂波滤波器)是一种常用的合成孔径雷达(SAR)图像处理算法,用于降低或去除SAR图像中的杂波(speckle noise)。SAR图像中的杂波是由于SAR工作原理导致的干涉和散射效应造成的不均匀亮度分布,给图像分析和解译带来困难。Lee滤波器基于统计原理,通过对图像进行空间平滑处理来减少杂波的影响。具体而言,Lee滤波器使用了局部统计信息,如图像的均值和方差,对每个像素点进行滤波处理。

养乐多的博客 2617

[转载]SAR影像斑点噪声及去噪方法

一、SAR影像斑点噪声 1、斑点噪声产生的机理 SAR成像系统是基于相干原理的,而这一理论基础存在着原理性缺陷,这个缺陷表现为:在雷达回波信号中,相邻像素点的灰度值会由于相干性而产生一些随机的变化,并且这种随机变化是围绕着某一均值而进行的,这样就在图像中产生了斑点噪声。而斑点噪声的产生是由于SAR成像所基于的相干原理所造成的缺陷,因此是不可避免的。 从产生机理上讲,SAR图像中的斑点噪声是由于...

weixin_38698410的博客 2万+

SAR图像去噪处理与Lee滤波算法实战

htmltable {th, td {th {pre {简介:合成孔径雷达(SAR)图像在遥感、地理信息系统和军事领域中应用广泛,但其成像过程易受相干斑噪声影响,降低图像质量。Lee滤波器是一种经典的SAR图像去噪方法,基于统计模型并通过滑动窗口机制进行噪声抑制。本文档深入讲解了Lee滤波及其扩展版本——极化Lee滤波的原理与实现,涵盖自适应窗口调整、滤波参数预估计等关键技术。

weixin_42594419的博客 1457

SAR图像去噪算法汇总

转自https://blog.youkuaiyun.com/weixin_38698410/article/details/90670796 一、SAR影像斑点噪声 1、斑点噪声产生的机理 SAR成像系统是基于相干原理的,而这一理论基础存在着原理性缺陷,这个缺陷表现为:在雷达回波信号中,相邻像素点的灰度值会由于相干性而产生一些随机的变化,并且这种随机变化是围绕着某一均值而进行的,这样就在图像中产生了斑点噪声。而斑点噪声的产生是由于SAR成像所基于的相干原理所造成的缺陷,因此是不可避免的。 从产生机理上讲,SAR图像中的

weixin_42968145的博客 1万+

SAR雷达影像处理:从数据转换到滤波技术

合成孔径雷达(SAR)是一种远程感知技术,能够在各种天气和光照条件下提供高分辨率的地面图像。SAR利用雷达波对地球表面进行扫描,通过记录返回信号的时间和相位信息,重建出地形的三维图像。合成孔径雷达(SAR)数据格式多样,不同的数据格式常由不同的雷达系统或应用软件所采用。常见的SAR数据格式包括但不限于::一种标准的、国际上广泛采用的遥感数据格式,用于各种航天器和航空器的数据交换。GeoTIFF:在SAR数据处理中,常常使用GeoTIFF格式,因为它支持地理空间信息和多个波段的数据表示。

weixin_32311823的博客 1373

SAR影像去噪实战:Lee滤波原理、Python实现与避坑指南

合成孔径雷达(SAR)影像中的相干斑噪声属于乘性噪声,与光学图像的加性噪声本质不同,直接套用高斯滤波或均值滤波易导致边缘模糊与细节丢失。工程实践中,需先理解乘性斑点模型与等效视数(ENL)的估计,再选择合适的滤波算法。Lee滤波作为经典自适应方法,能根据局部统计特性在平坦区域平滑、在异质区域保留中心像素,是SAR去噪的高效基线方案。本文从SAR噪声建模出发,介绍Lee滤波与Refined Lee滤波的原理和Python实现,并给出等效视数、边缘保持指数(EPI)等量化评估方法,剖析对数变换偏置、参数调节、深

weixin_29062613的博客 245

SAR图像去噪之Lee滤波

%Lee滤波 close all;clear all;clc; IMAGE=imread('test.jpg'); IMAGE=rgb2gray(IMAGE); figure(); imshow(IMAGE);title('原图'); [m,n]=size(IMAGE); WL=7;%Lee滤波的窗长 IMAGE_filtered=zeros(m-floor(WL/2),n-floor(WL/2)...

Joey's Blog 1万+

基于MATLAB的雷达图像斑点噪声去噪方法实战程序

为了提高代码复用性和执行效率,应将常用滤波操作封装为函数模块,并充分利用MATLAB的向量化能力替代显式循环。例如,实现一个通用的局部自适应滤波框架:% 自适应滤波主入口函数% 向量化实现局部统计case 'lee'Cn = 1;% 理论噪声方差(可根据ENL估算)ENL = 4;% 等效视数估计otherwiseerror('不支持的滤波方法');endend逻辑分析与扩展说明:函数采用统一接口,支持多种滤波方法切换;padarray。

weixin_42583683的博客 798

SARscape——Refined Lee滤波

Refined Lee filter因其较小的计算量和稳健的处理效果而成为目前SAR滤波处理中最为流行的滤波算法。Refined Lee filter 在 MMSE 的基础上加入了八个边缘检测窗口来自适应邻域。

点云侠的博客 1961

增强型Lee滤波:SAR图像乘性噪声抑制与边缘保持

SAR图像去噪本质是处理乘性噪声,而非加性高斯噪声;其核心挑战在于平衡斑点抑制与纹理保留。增强型Lee滤波基于局部统计建模,通过一阶矩(均值)与二阶矩(方差)构建自适应权重,在数学上实现LMMSE最优估计。相比传统滤波器,它不依赖梯度阈值保边,而是利用局部方差与噪声方差比值动态响应地物异质性,兼具物理可解释性与工程鲁棒性。该方法广泛应用于Sentinel-1、GF-3等星载SAR数据预处理,在遥感解译、变化检测和定量反演中支撑ENL与EPI双指标验证。本文详解其参数语义、MATLAB实操实现及典型避坑策略。

weixin_33624741的博客 278

增强型Lee滤波参数可调MATLAB实现:去噪保边兼顾的SAR图像处理

图像去噪是遥感与医学影像处理中的基础问题,尤其SAR图像和超声图像常受相干斑噪声干扰。乘性噪声模型下,经典Lee滤波利用局部均值和方差进行线性估计,计算高效但边缘细节容易模糊。增强型Lee滤波通过变异系数对像素分类,区分均质区、过渡区和强散射点,并引入可调衰减因子灵活控制平滑强度,在边缘保持指数与等效视数间取得平衡。该思路广泛用于合成孔径雷达图像去斑、医学超声图像组织边界增强等场景。本文分享一套参数可调的增强型Lee滤波MATLAB实现,支持窗口尺寸、衰减因子和阈值模式的自定义,便于工程集成与二次开发。

weixin_33391446的博客 141

SNAP处理Sentinel-1 SAR影像流程

本文的处理流程适用于Sentinel-1数据关于数据和数据的区别和介绍,很容易找到,本文不再赘述。本文的处理步骤包含了辐射定标、噪声去除、轨道校正、地形校正(地理编码),这些步骤完成后SAR影像便可正常投入使用。

weixin_51610638的博客 5039

Lee滤波(python代码)

Lee滤波算法(python实现代码)

上一篇: 在 Python 中使用 JSON
下一篇: 揭秘地图坐标系的秘密
小白说遥感
博客等级 码龄10年 2033粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值