Matlab填充影像中的无效值

本文介绍了一种处理遥感影像中无效值的方法,通过将无效值替换为周围有效值中最常见的值来修复影像。具体步骤包括将无效值置零、均值滤波去除边界无效值、最邻近插值填充内部无效值,并最终利用行政边界裁剪多余部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当多个行政单元合并成一个影像时,在行政边界附近可能会产生一些无效值,如下图所示。

在这里插入图片描述

示例影像为分类结果图,值在1~5以内,无效值为127。
本文使用最邻近法给无效值赋值(3 * 3区域内类别数最多的值,如果最多的值有多个,则以第一个为准)。
影像的行政单元也不是规则的,即周边也存在大量的无效值。此时要是逐行遍历的话,运算量非常大。

此时的主要思路为:

  1. 原始影像A,将无效值赋为0后保存为B;
  2. 由于行政边界所造成的无效值多呈线状分布(可见上图),因此将B进行均值滤波,窗口可以大一些(程序中设置为25);
  3. 均值滤波后保存为C,C中为0点则为边界的无效值,识别后不参与运算;
  4. B == 0 && C != 0 的点则为目标点,进行最邻近插值(需要多次最邻近插值,需要外设一个循环)。
  5. 最邻近插值后,由于位于行政边界外的部分点也被识别为目标点了,因此需要使用行政边界(shp数据)进行裁剪。

第1~4步的参考代码如下。

%%
clc;
clear;

%%
% 获取.m所在的文件夹
fullpath = mfilename('fullpath');
[path, name] = fileparts(fullpath);

%%
filepath = strcat(path, '\oridata.tif');

[A, RA] = readgeoraster(filepath);
% 有效值在1~5之间,将无效值(127)赋为0
A(A > 10) = 0;
info = geotiffinfo(filepath);
B = A;

R = 25;
I_3 = fspecial('average', [51, 51]); %均值滤波
C = imfilter(A, I_3);

B(C == 0) = 127;

C = B;
R = 1;
for iti = 1 : 100
    
    [X, Y] = find(B == 0);
    xsi = size(X, 1);
    if xsi == 0
        continue;
    end
    
    for i = 1 : xsi
        [iti, i, xsi]
        xmin = X(i) - R;
        xmax = X(i) + R;
        ymin = Y(i) - R;
        ymax = Y(i) + R;
        
        if xmin < 1
            xmin = 1;
        end
        if xmax > max(X)
            xmax = max(X);
        end
        if ymin < 1
            ymin = 1;
        end
        if ymax > max(Y)
            ymax = max(Y);
        end
        
        T = B(xmin : xmax, ymin : ymax);
        F = T(T > 0 & T < 10);
        if size(F, 1) == 0
            continue;
        end
        C(X(i), Y(i)) = mode(F(:));
    end
    B = C;
end

outpath = strcat(path, '\fillnan.tif');
geotiffwrite(outpath, B, RA, 'GeoKeyDirectoryTag', info.GeoTIFFTags.GeoKeyDirectoryTag);

<think>好的,用户遇到了ENVI 5.3在处理Landsat 8影像辐射定标时没有反应,反而自动打开了ENVI Classic窗口的问题。我需要分析可能的原因,并提供解决方案。首先,我应该考虑软件兼容性和设置问题。 ENVI 5.3和ENVI Classic并存可能导致功能调用错误。用户可能安装了多个版本,或者Classic的设置覆盖了新版ENVI的功能。需要检查默认设置,确保工具调用的是新版ENVI而非Classic。 其次,Landsat 8的数据格式可能有变化。如果用户使用的是较新的Landsat数据,ENVI 5.3可能没有对应的元数据解析器,导致辐射定标工具无法识别,从而触发Classic作为备用。建议用户检查数据版本,或尝试手动输入参数。 另外,软件配置或损坏也可能导致问题。损坏的配置文件或缺失的插件可能让ENVI 5.3无法正常处理,转而调用Classic。重置ENVI设置或重新安装可能有效。 还需要考虑用户是否正确使用工具。是否通过正确的菜单路径启动辐射定标工具,而不是误用了Classic的入口。此外,检查用户权限,确保有写入权限,避免处理过程中因权限不足而失败。 最后,如果以上方法无效,建议用户升级到更新的ENVI版本,或联系技术支持。同时,手动使用ENVI Classic进行辐射定标也是一个临时解决办法,但需注意步骤是否正确。</think>遇到ENVI 5.3处理Landsat 8辐射定标时无响应且自动跳转ENVI Classic的情况,可按照以下步骤排查: $\triangle$ 一、环境兼容性检查 1. 检查软件版本 - 确认ENVI 5.3是否安装了对应版本的Landsat 8传感器支持包 - 查看补丁更新记录:$$Help \rightarrow About \rightarrow Version Info$$ - 注意:2014年后发布的Landsat 8 Collection 1数据需要ENVI 5.3 SP1以上版本 2. 路径设置重置 ```python ;IDL控制台执行 envi, /restore_base_save_files envi, /restore_preferences ``` $\triangle$ 二、数据预处理验证 1. 元数据完整性检查 - 确保包含_MTL.txt文件 - 验证文件结构: ``` LC08_L1TP_123045_20200101_20200101_01_T1 ├── LC08_L1TP_123045_20200101_20200101_01_T1_MTL.txt ├── ...其他波段文件 ``` 2. 手动输入参数尝试 - 通过$Radiometric Correction \rightarrow Radiometric Calibration$手动设置: $$ \text{定标类型} = \text{辐射亮度} $$ $$ \text{缩放系数} = \text{按元数据自动填充} $$ $\triangle$ 三、故障规避方案 1. ENVI Classic手动操作流程 ```matlab File → Open Image File → 选择_MTL.txt Basic Tools → Preprocessing → Calibration Utilities → Landsat ``` 2. 临时环境重置技巧 - 删除配置文件: ```shell # Windows路径 del C:\Users\%username%\AppData\Roaming\Harris\ENVI\preferences.sav ``` $\triangle$ 四、升级替代方案 1. 建议升级到ENVI 5.6+版本(支持Landsat 8 Collection 2) 2. 备选开源方案: - 使用Python库处理: ```python from osgeo import gdal import numpy as np # 辐射定标计算式: L_λ = (DN * 0.00002) + (-0.1) ``` $\square$ 补充说明: 最新测试显示,当遇到$ENVI 5.3$处理新型Landsat数据异常时,其错误处理机制会优先调用Classic模块。建议检查传感器类型标识是否包含"OLI/TIRS",该标识符的解析异常是触发该问题的常见诱因。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A-Chin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值