[ArcPy] 遥感影像去黑边-第六届全国大学生GIS技能大赛试题

本文主要是介绍[ArcPy] 遥感影像去黑边-第六届全国大学生GIS技能大赛试题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

完整试题:http://www.higis.cn/753

文章目录

  • 问题
  • 分析
  • ArcPy暴力剔除边缘的像元值
    • 代码
    • 将Py脚本制定成自定义工具
    • 结果
  • 找出边界后掩膜

问题

去除遥感影像黑边

数据:
这里写图片描述

分析

【方法一】将边界进行矢量化,然后用掩膜提取
缺点:遥感影像边缘是锯齿形,矢量化边界精度不高

【方法二】边界像元值为0,将0值重分类为NoData
缺点:将内部像元值为0的像素也归为了NoData,会出现空洞
发现ArcGIS中有类似功能的工具:ArcToolbox–>Data Management Tools–>Raster–>Raster Dataset–>CopyRaster

【方法三】法一法二联合做就可以解决他们两个的缺点
法一的结果为1.tif,法二的结果为2.tif
栅格计算器:Con(IsNull(“2”) & ( ~IsNull(“1”)), “1”, “2” )
解释:如果2为NoData的地方1有值,那么就赋予1的值,其他地方赋予2

【方法四】使用ArcPy仅将边缘像元为0的地方赋予NoData,里面的地方不处理
缺点:处理速度慢,遥感图像n行m列,时间复杂度O(n*m)

【方法五】使用边界跟踪算法得出边界,存储成shp格式,再进行掩膜

ArcPy暴力剔除边缘的像元值

代码

# -*- coding:utf-8 -*-
# Author: PasserQi
# Time: 2017/12/18
# Func: 去边处理
# Desc: 从左边向右,从右边向左开始搜索,将边界像素替换成NoData,只会替换到边界的像素,不会替换到内部像元
# Attention: 若要打包成ArcGIS自定义工具,此文件下不能有中文
import arcpy,sys
from arcpy.sa import *arcpy.CheckOutExtension("sptial") #权限检查
# 得到初始参数
# rasterPath = sys.argv[1]
# outPath = sys.argv[2]
# BORDER_VALUE = int(sys.argv[3])
#
rasterPath = r'E:\user\Desktop\DeleteDarkSide\Data\Kejicheng0.TIF' #输入栅格
outPath = r'E:\user\Desktop\DeleteDarkSide\Data\q' #输出栅格
BORDER_VALUE = 0 #边界值if __name__ == '__main__':r = Raster(rasterPath) #打开栅格noDataValue = r.noDataValue #获取栅格中的NoData值array = arcpy.RasterToNumPyArray(r) #转成Numpy方便对每个像元进行处理bandNum,rowNum,colNum = array.shape #波段、行数、列数# 左边for i in range(0,rowNum):for j in range(0,colNum):if array[0][i][j]==BORDER_VALUE: #找到边界for w in range(0,bandNum):array[w][i][j] = noDataValue #赋值print "替换:%d %d" % (i,j)continueelif array[0][i][j]==noDataValue: #是无值continueelse: #是普通像素break #退出该行# 右边for i in range(0,rowNum):for z in range(0,colNum):j = colNum - 1 - zif array[0][i][j]==BORDER_VALUE: #找到边界for w in range(0,bandNum):array[w][i][j] = noDataValue  # 赋值print "替换:%d %d" % (i, j)continueelif array[0][i][j]==noDataValue: #是无值continueelse: #是普通像素break #退出该行#保存栅格lowerLeft = arcpy.Point(r.extent.XMin, r.extent.YMin) #左下角点坐标cellWidth = r.meanCellWidth #栅格宽度cellHeight = r.meanCellHeightnewRaster = arcpy.NumPyArrayToRaster(array,lowerLeft,cellWidth,cellHeight,noDataValue) #转换成栅格newRaster.save(outPath) #保存

将Py脚本制定成自定义工具

这里写图片描述

执行: 去黑边 "E:\user\Desktop\[ArcPy] 去除遥感影像黑边\Data\Kejicheng0.TIF" "E:\user\Desktop\[ArcPy] 去除遥感影像黑边\result\tmp.tif" 0
开始时间: Thu Dec 21 20:15:58 2017
正在运行脚本 去黑边...
Completed script 去黑边...
成功 在 Thu Dec 21 20:19:02 2017 (经历的时间: 3 分 4 秒)

注:可以看到这个方法时间要很久

结果

这里写图片描述

找出边界后掩膜

# -*- coding:utf-8 -*-
# Author: PasserQi
# Time: 2017/12/19
# Func: 提取出遥感图像的边界
# Desc: 使用边界跟踪算法,此实例使用八连通邻域,输入的边界为
import arcpy,sys,threading
from arcpy.sa import *rasterPath = r'E:\user\Desktop\[ArcPy] 去除遥感影像黑边\Data\Kejicheng0.TIF' #输入栅格
outPath = r'E:\user\Desktop\DeleteDarkSide\Data\q' #输出栅格
BORDER_VALUE = 0 #边界值directions = [ [0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1],[1,0],[1,1]] #方向数组
def following(dir,boundary): #内边界start_i,start_j = boundary[0] #找出第一个x,y = boundary[-1] #找出最后一个# print boundary[0] + boundary[-1]if len(boundary)!=1 and start_i==x and start_j==y: #闭合了returnx = x + directions[dir][0] #移动y = y + directions[dir][1] #移动flag = False #标识是否找到下一个边界if x<0 or y<0 or x>=rowNum or y>=colNum: #出边界flag = False #没有找到,继续找elif array[0][x][y]!=BORDER_VALUE and array[0][x][y]!=noDataValue: #有像素flag = Trueboundary.append([x,y] )if x==start_i and y==start_j:return#没有找到下一个继续搜索if flag==True: #找到了下一个边界像素if dir%2==0:dir = (dir+7)%8else:dir = (dir+6)%8else: #未找到dir = (dir+1)%7print len(boundary)following(dir,boundary)if __name__ == '__main__':sys.setrecursionlimit(1000000)  # 例如这里设置为一百万r = Raster(rasterPath) #打开栅格noDataValue = r.noDataValue #获取栅格中的NoData值array = arcpy.RasterToNumPyArray(r) #转成Numpy方便对每个像元进行处理bandNum,rowNum,colNum = array.shape #波段、行数、列数# 找出图像最左上方的像素flag = Falsefor i in range(0,rowNum):for j in range(0,colNum):if array[0][i][j]!=BORDER_VALUE and array[0][i][j]!=noDataValue:start_i = istart_j = jflag = Truebreakif flag:breakboundary = [] #边界数组boundary.append([start_i,start_j] )print boundary# 开始搜索dir = 7 #起始搜索方向threading.stack_size(200000000) #堆大小设置thread = threading.Thread(target=following(dir,boundary))thread.start()

这篇关于[ArcPy] 遥感影像去黑边-第六届全国大学生GIS技能大赛试题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/705546

相关文章

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

GIS图形库更新2024.8.4-9.9

更多精彩内容请访问 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信:digital_twin123 Cesium 本期发布了1.121 版本。重大新闻,Cesium被Bentley收购。 ✨ 功能和改进 默认启用 MSAA,采样 4 次。若要关闭 MSAA,则可以设置scene.msaaSamples = 1。但是通过比较,发现并没有多大改善。

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

生信代码入门:从零开始掌握生物信息学编程技能

少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 介绍 生物信息学是一个高度跨学科的领域,结合了生物学、计算机科学和统计学。随着高通量测序技术的发展,海量的生物数据需要通过编程来进行处理和分析。因此,掌握生信编程技能,成为每一个生物信息学研究者的必备能力。 生信代码入门,旨在帮助初学者从零开始学习生物信息学中的编程基础。通过学习常用

如何打造个性化大学生线上聊天交友系统?Java SpringBoot Vue教程,2025最新设计思路

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小程序/安卓实战项目 大数据实战项目 ⚡⚡文末获取源码 文章目录

参会邀请 | 第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)

第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)将于2024年9月13日-15日在中国张家口召开。 MVIPIT 2024聚焦机器视觉、图像处理与影像技术,旨在为专家、学者和研究人员提供一个国际平台,分享研究成果,讨论问题和挑战,探索前沿技术。诚邀高校、科研院所、企业等有关方面的专家学者参加会议。 9月13日(周五):签到日 9月14日(周六):会议日 9月15日(周日

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区

2024 年高教社杯全国大学生数学建模竞赛 C 题 农作物的种植策略 参考论文 无水印

持续更新中,2024年数学建模比赛思路代码论文都会发布到专栏内,只需订阅一次!  完整论文+代码+数据结果链接在文末!  订阅后可查看参考论文文件 第一问 1.1 问题重述 这个问题围绕的是华北山区的某乡村,在有限的耕地条件下,如何制定最优的农作物种植策略。乡村有 34 块露天耕地和 20 个大棚,种植条件包括粮食作物、蔬菜、水稻和食用菌。除了要考虑地块的面积、种植季节等,还要确保

CTFHub技能树-Git泄漏-Index

目录 一、Git索引(Index)的基本概念 二、解题过程 主旨:使用git泄漏恢复源代码 方法一:使用GitHack手动恢复 方法二:直接使用Git_Extract获取网站源代码拿去flag   当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。请尝试使用BugScanTeam的Gi

2024年全国大学生数学建模A题借鉴论文

问题  1: 舞龙队的动态位置与速度计算 1. **螺旋线的几何建模**:根据题目描述,舞龙队沿着等距螺旋线前进。螺旋线的螺距为 55 cm, 需根据极坐标公式确定每节板凳的位置。 -  极坐标螺旋线方程:\( r = a + b\theta \), 其中  \( b \)  是螺距, 可以利用该方程计算 每秒舞龙队的各个节数的坐标。 2. **速度计算**:给定龙头的行进速度为 1 m/s ,