ArcPy学习心得系列(5)遥感数据中值滤波与均值滤波实现方法(不计入NoDATA)

高斯滤波及其实现 1.滤波算法简介       图像处理中,常用的滤波算法有均值滤波、中值滤波以及高斯滤波等。均值滤波使用模板内所有像素的平均值代替模板中心像素灰度值,这种方法易收到噪声的干扰,不能完全消除噪声,只能相对减弱噪声;中值滤波计算模板内所有像素中的中值,并用所计算出来的中值体改模板中心像素的灰度值,这种方法对噪声不是那么敏感,能够较好的消除椒盐噪声,但是容易导致图像的不连续性。高斯滤波对图像邻域内像素进... 阅读详情

在数据处理与应用的过程中,我们难免会遇到一些低质量的遥感数据,低质量遥感数据一般是由于天气因素导致的,在云量较多时,卫星传感器所采集到的地面信息被云层所遮挡,导致遥感图像成像过程中产生了较多噪声,对遥感数据的精确度造成了一定影响,如果不解决这些数据中的噪声,会导致我们从遥感数据中所提取到的信息也不够精确。

为更好的处理遥感数据中的噪声,我们一般会使用均值滤波或中值滤波对遥感图像进行去噪,去除遥感图像噪声的目的在于最大程度上还原原始数据,以便于我们更好的提取遥感图像中的有效信息。

那么,在进行滤波代码的实现以前,让我们一起来看一下滤波的实现原理吧!

 

其中,滤波算法的主要思路为,设置一个n*n(n=2x+1,x>0)大小的窗口,随后对这个窗口的中心点像元进行重新赋值,以5*5的窗口以及均值滤波算法为例,在上图中,窗口A的中心像元(0,0)的值为19,而经过了均值滤波后,也就是在窗口B中,原窗口A的中心像元(0,0)的值变成了11,而这个值,是由原窗口A中所有像元的值加起来的总和除以25得到的。

通过上述算法,即可对一个窗口内的遥感数据进行滤波,基于上述思路,对整个遥感图像进行遍历,以窗口的中心像元为基准,取到N个相同大小的窗口(窗口大小会随应用场景的变化而变化),对其中的每一个窗口中心像元进行滤波,以下,为滤波过程的核心代码,其中,self.w_1是人为设置的窗口大小,height和width分别表示遥感数据的行数和列数,result表示滤波后的新数据。


edge = int((self.w_l - 1) / 2)#计算遍历的起始位置与终点
height = data.shape[0]#获取数据的行数
width = data.shape[1]#获取数据的列数
for i in range(edge,height-edge):#设定遍历起始行与终点行
    for j in range(edge,width-edge):#设定遍历起始列与终点列
        newdata =data[i - edge:i + edge + 1, j - edge:j + edge + 1]#取一个n*n的窗口
        if self.no_data_value in newdata:
            continue
        else:
            result[i, j] = np.median(newdata)#调用np.median求中值函数

基于以上代码,即可完成中值滤波(不对NoDATA及数组边缘进行计算)。

除了滤波部分的代码以外,我们还需了解,ArcPy是如何对遥感数据进行读取以及对计算结果进行输出的,首先,我们需要利用ArcPy的Raster方法对数据进行读取,随后利用ArcPy的RasterToNumPyArray方法,将数据转换为array数组,并利用以上滤波算法对数组进行滤波。在滤波完成后,我们还需要将滤波后的结果保存为TIFF文件。

以下部分为数据读取与成果输出部分的代码。


arcpy.env.outputCoordinateSystem = self.Path#设置输出坐标系
arcpy.env.overwriteOutput = True#可以覆盖数据
tif = arcpy.Raster(self.Path)#读取数据
ExtentXmin = tif.extent.XMin#取x坐标最小值
ExtentYmin = tif.extent.YMin#取y坐标最小值
lowerLeft = arcpy.Point(ExtentXmin,ExtentYmin)#取得数据起始点坐标(左下角坐标)
Widthcellsize=tif.meanCellWidth#像元宽度
Heightcellsize=tif.meanCellHeight#像元高度
self.no_data_value = tif.noDataValue#获取数据NoDATA
#将Raster转换为Array数组
self.data = arcpy.RasterToNumPyArray(tif, nodata_to_value=self.no_data_value)
newdata = self.Filter()
if newdata != None:
    #将滤波后的array数组转换为Raster,其中需要指定其左下角坐标,像元大小及NoDATA等参数
    newRaster = arcpy.NumPyArrayToRaster(newdata,lowerLeft,Widthcellsize,Heightcellsize,value_to_nodata=self.no_data_value)
    newRaster.save(self.Save)#将Raster保存到存储目录下
    arcpy.BuildPyramids_management(self.Save)#建立金字塔

至此,本次讲解到此结束,以下为此算法的全部代码。


import arcpy
import numpy as np

class RasterFilter:
    def __init__(self,DataPath,windows_length,method,SavePath):
        self.Path = DataPath
        self.w_l = windows_length
        self.method = method
        self.Save = SavePath

    def Start(self,method="Median"):
        arcpy.env.outputCoordinateSystem = self.Path#设置输出坐标系
        arcpy.env.overwriteOutput = True#可以覆盖数据
        tif = arcpy.Raster(self.Path)#读取数据
        ExtentXmin = tif.extent.XMin#取x坐标最小值
        ExtentYmin = tif.extent.YMin#取y坐标最小值
        lowerLeft = arcpy.Point(ExtentXmin,ExtentYmin)#取得数据起始点坐标(左下角坐标)
        Widthcellsize=tif.meanCellWidth#像元宽度
        Heightcellsize=tif.meanCellHeight#像元高度
        self.no_data_value = tif.noDataValue#获取数据NoDATA
        #将Raster转换为Array
        self.data = arcpy.RasterToNumPyArray(tif, nodata_to_value=self.no_data_value)
        newdata = self.Filter()
        if newdata != None:
            #将滤波后的array数组转换为Raster,其中需要指定其左下角坐标,像元大小及NoDATA等参数
            newRaster = arcpy.NumPyArrayToRaster(newdata,lowerLeft,Widthcellsize,Heightcellsize,value_to_nodata=self.no_data_value)
            newRaster.save(self.Save)#将Raster保存到存储目录下
            arcpy.BuildPyramids_management(self.Save)#建立金字塔
    def Filter(self):
        data = self.data#获取array数据
        result = data.copy()#复制array到result
        edge = int((self.w_l - 1) / 2)#计算遍历起始位置与终点
        height = data.shape[0]#获取数据的行数
        width = data.shape[1]#获取数据的列数
        if height - 1 - edge <= edge or width - 1 - edge <= edge:#如何数据行列数小于设置的窗口大小,则返回并抛出异常
            print("The parameter k is to large.")
            return None
        if self.method == "Median":
            for i in range(edge,height-edge):#设定遍历起始行与终点行
                for j in range(edge,width-edge):#设定遍历起始列与终点列
                    newdata =data[i - edge:i + edge + 1, j - edge:j + edge + 1]#取一个n*n的窗口
                    if self.no_data_value in newdata:
                        continue
                    else:
                        result[i, j] = np.median(newdata)#调用np.median求中值函数

        elif self.method == "Average":
            for i in range(edge,height-edge):
                for j in range(edge,width-edge):
                    newdata =data[i - edge:i + edge + 1, j - edge:j + edge + 1]
                    if self.no_data_value in newdata:
                        continue
                    else:
                        result[i, j] = np.average(newdata)#调用np.average求均值函数
        return result
if __name__=='__main__':
    rFilter = RasterFilter(r"F:\NPPOFNDVI\ASTERGDEMV2DEM_fujian\ASTGTM2_N23E116_dem.tif",5,"Median",r"F:\NPPOFNDVI\ASTERGDEMV2DEM_fujian\DEM2.tif")
rFilter.Start()

以下为DEM数据滤波前后的对比图。

关于遥感图像镶嵌后出现斑点情况的解决方案 拉普拉斯算子是霍奇理论的核心,并且是德拉姆上同调的结果。中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。 阅读详情

相关推荐

【遥感数字图像处理(朱文泉)】第七章 图像去噪声

图像去噪声

甜子yu的博客 5981

【ArcGIS风暴】水文分析模块实验:山脊线和山谷线提取

实验平台:ArcGIS 9.3 实验目的:学习和掌握山脊线和山谷线提取的原理及方法 实验要求:利用ArcGIS水文分析模块提取样区的山脊线和山谷线 实验数据:Ex1 实验步骤: 1.正负地形的提取 (1)打开Arcmap,加载数据EX1,如图 (2)平滑处理(均值滤波)。加载Spatial Analyst模块,单击Neighborhood statistics,利用邻域分析的方法计...

智慧空间实验室 5315

椒盐噪声的中值滤波处理

椒盐噪声是图像处理中常见的一种噪声类型,它会在图像中引入黑白像素点,使得图像看起来像是被撒上了椒盐。中值滤波通过对像素周围邻域内的像素值进行排序,并取中间值作为新值,可以有效地去除椒盐噪声,同时保留图像的细节信息。中值滤波是一种非线性滤波技术,它的原理是将像素点周围的邻域内的像素值进行排序,然后将中间值作为当前像素点的新值。第一个子图显示原始图像,第二个子图显示添加椒盐噪声后的图像,第三个子图显示经过中值滤波处理后的图像。函数将原始图像、噪声图像和中值滤波后的图像显示在一张图中,以便比较它们的效果。

VnReact的博客 558

制作斜坡单元的两种方法

方法一 arcgis工具箱 均值滤波曲率处理斜坡单元.tbx-讲义文档类资源-优快云下载 方法二 arcgis工具箱 arcgis生成斜坡单元修改3.0版本.zip-讲义文档类资源-优快云下载 后处理 利用arcgis对斜坡单元批量后处理_Z_W_H_的博客-优快云博客 参考文献 [1]颜阁. 华池县滑坡易发性制图[D].兰州大学,2016. [2]王凯,张少杰,韦方强.斜坡单元提取方法研究进展和展望[J]....

Z_W_H_的博客 3772

ArcGIS教程:众数滤波 (Spatial Analyst)

根据相邻像元数据值的众数替换栅格中的像元,像元大小, 当前工作空间, 掩膜, 输出坐标系, 范围, 临时工作空间, 捕捉栅格。

Unity布娃娃系统 Ragdoll Mecanim Mixer使用

6. 选完之后,左键下面的hip等角色各个部位不松开鼠标,拖拽连接到上面Amature的各个部位,如图,下面所有部位都连接完之后,第二步点击Configure Selected Bones确认你的部位连接选择。要做一个布娃娃和动画混合的项目,这个插件是比较不错的,搜了一圈文章教程也是抄来抄去,抄的没有头没有尾,自己摸索着用了一下,记录使用过程吧。8. 之后就点击步骤7图一中的Create Ragdoll,会发现player结构发生变化,如图。4. 添加完脚本之后会显示你的player结构,如图。

SuShengQuanshiW的博客 1649

来自工业界的知识库 RAG 服务(二),RagFlow 源码全流程深度解析

前面介绍过有道 QAnything 源码解析,通过深入了解工业界的知识库 RAG 服务,得到了不少调优 RAG 服务的新想法。因此本次趁热打铁,额外花费一点时间,深入研究了另一个火热的开源 RAG 服务RagFlow的完整实现流程,希望同样有所收获。首先依旧可以先从框架图入手,与常规的 RAG 架构进行一些比较可以看到右侧知识库被明显放大,同时最右侧详细介绍了文件解析的各种手段,比如OCR等,这些在常规的 RAG 中可能会作为一个不起眼的。

易迟的专栏 2万+

EtherCat 从站开发中遇到的问题分享

EtherCat从站 AX58100

yu_arius的博客 2058

免费搞定DWG转DXF:ODA File Converter保姆级配置指南(附常见报错解决)

本文详细介绍了如何使用ODA File Converter免费工具实现DWG到DXF的格式转换,包括环境配置、命令行参数解析、编程集成方案及常见问题解决。特别针对网络访问异常、参数配置等实际痛点提供应对策略,帮助用户高效完成工程设计文件的格式转换。

weixin_29291185的博客 6020

Vue3+Openlayers教程导航页【目录】

欢迎来到 Vue3+Openlayers 系列教程,这里是我在 优快云 编写的所有 Vue3+Openlayers 系列相关文章的索引页,适合初学者到进阶用户系统阅读。👀 更多教程正在持续更新中,欢迎关注我,一起探索 Openlayers 的强大魅力!

小彭的博客 1267

FM1288回声消除芯片调试方案 - 综述

专栏文章概览

优快云mianfeixiazai001的博客 1714

QT如何使用CTK插件搭建应用程序框架?

CTK框架,QT框架,插件系统

cs821984831的博客 735

〔重庆理工大学〕大学物理实验--变温霍耳效应及其参数测定

每个老师要求不同,实验报告内容和数据仅供参考。

Pretty Boy Fox的博客 3044

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: ArcPy学习心得(4)(四)大尺度空间范围可燃物载量计算方法
下一篇: 明明都是2000坐标的地形图,怎么位置就不一样呢?
sky
J
博客等级 码龄5年 3533粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

sky J

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

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

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

打赏作者

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

抵扣说明:

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

余额充值