基于MATLAB的DEM读取显示以及山顶点提取

2023-11-09 17:50

本文主要是介绍基于MATLAB的DEM读取显示以及山顶点提取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、山顶点提取原理
  • 二、MATLAB代码实现(亲测有效)
    • 1.程序以及程序清单
    • 2.运行结果以及分析


前言

利用MATLAB强大的数组运算的功能,我们可以利用其进行山顶点的提取。但由于知识比较薄弱,在MATLAB正确读取并显示DEM模型上还未能找到合适的方法,因此在下面我采用的是常规导入并进行拉伸显示。本篇文章只是一个小实验,希望读者能从中获益,若有不足之处,望能指出。

一、山顶点提取原理

所谓山顶点,即是该部分地形区域上的高程最大点,提取山顶点对地形研究有很重要的意义。通过提取山顶点来获取山顶点的几何位置,在GIS分析中可用来作为选址分析或者地形分析。下图是在arcmap中 提取山顶矢量点,可以看出,其提取的结果还是比较满意,但在边缘区域就会出现多余点的情况,而且还会出现多个山顶点重叠的情况。
在这里插入图片描述
下面我们就来谈一谈山顶点提取原理,我们利用的源数据是DEM图,其每个像元值代表的是一个高程值。那如何找到一定区域内的最高点呢,按照下述流程,我们可以得到差值矩阵图。

此差值矩阵中的零值就代表的是山顶点,其他值都是低于这个点的其他高程点。我们进行重分类,将零值换为0,其他值赋值为1,通过转换成double数组,就可以得到一个二值化图。

在这里插入图片描述

二、MATLAB代码实现(亲测有效)

1.程序以及程序清单

程序清单:
geotiffread:用于读取地理tiff文件
padarray:用于在原矩阵四周扩充零矩阵
deal:用于分身
reshape:改变数组的维度不改变数值
flip:颠倒数组
find:查找数组某值得具体行列位置
numel:计算数组的元素个数

clc;
clear all;
%geotiffread函数可用于读取地理tiff文件格式图片
% data变量存储坐标或是像元数据,info变量用于存储数据的一些详细信息
[data,info]=geotiffread("DEM1.tif");
%拉伸图像,由于dem数据中边缘存在异常值,因此一般要进行拉伸才能够显示,拉伸的大小视实际情况而定
image=data.*30;
%-------------------------%
imshow(image);
colorbar;
title('DEM image')
%-------------------------%
%padarrary函数用于给图像四周扩充零矩阵,扩充的具体范围视窗口大小而定
image1=padarray(image,[7,7]);
%deal函数用于将数组赋给两个变量,其继承了原矩阵的所有属性值,目的是保证后续不会被迭代改变
[x1,x2]=deal(image1);
[rows,cols]=size(image1);
%采用15*15的窗口遍历每一个像元,将窗口内的最大值赋值给该像元
for i=1:rows-14for j=1:cols-14NR=x1(i:i+14,j:j+14);ER=reshape(NR,[1,15*15]);MAX_NR=max(ER);x2(i+6,j+6)=MAX_NR;end
end
diff_image=image1-x2;
[xx1,xx2]=deal(diff_image);
for ii=1:rowsfor jj=1:colsif xx1(ii,jj)<0xx2(ii,jj)=0;elsexx2(ii,jj)=1;endend
end
top=double(xx2);
%------------------------------------------------------------%
%---------------------------------------%
%查找异常值,并对图像进行裁剪
[r,c]=size(data);
first_row_find=0;end_row_find=0;first_col_find=0;end_col_find=0;
first_row=data(1,1:c);
end_row=flip(data(r,1:c));
first_col=flip(data(1:r,1));
end_col=data(1:r,c);
for mm=1:cif first_row(mm)==max(data)first_row_find=first_row_find+1;elsebreakendif end_row(mm)==max(data)end_row_find=end_row_find+1;elsebreakend
end
for nn=1:rif first_col(nn)==max(data)first_col_find=first_col_find+1;elsebreakendif end_col(nn)==max(data)end_col_find=end_col_find+1;elsebreakend
end
%---------------------------------------%
%------------------------------------------------------------%
crop_top=top(7+first_col_find:rows-7-end_col_find,7+first_row_find:cols-7-end_row_find);
imshow(crop_top);
title('the crop top.point image')
%根据find函数查找corp_top图像上山顶点的行列坐标
[rows1,cols1]=find(crop_top==1);
[rows2,cols2]=size(data);
ol=data(first_col_find:rows2-end_col_find,first_row_find:cols2-end_row_find).*45;
imshow(ol);
title('the crop DEM image')
%------------------------------------------------------------%
png=data(first_col_find:rows2-end_col_find,first_row_find:cols2-end_row_find).*45;
png1=deal(png);
number=0;
for iii=1:size(rows1)number=number+1;png1(rows1(number),cols1(number))=1;
end
imshow(png1);
title('the mix top.point image');
%------------------------------------------------------------%
count=numel(find(crop_top==1))

2.运行结果以及分析

下图为源数据DEM图,该图的高程以灰白色条显示,数据类型为int16。由于我的源数据是掩膜提取的,所以该图的四周含有异常值,因此色条的范围很大,另外要在MATLAB中显示,则需要对图像进行拉伸才能显示正常。
在这里插入图片描述
针对上图的异常显示,我们需要对图像进行裁剪,去除四周的异常值,结果如下
在这里插入图片描述
本文主要采用的窗口大小为15*15,通过对源数据DEM进行遍历之后,再进行相减以及二值化处理,可以得到下面的图,图中的白色点即为山顶点,其高程在一定区域内最高。
在这里插入图片描述
下图即按照上图的白色点坐标,在the crop DEM image中显示的结果,不难看出,其山顶点的位置还是较为正确,而且不存在边缘多余山顶点的情况。
在这里插入图片描述

这篇关于基于MATLAB的DEM读取显示以及山顶点提取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

Python读取TIF文件的两种方法实现

《Python读取TIF文件的两种方法实现》本文主要介绍了Python读取TIF文件的两种方法实现,包括使用tifffile库和Pillow库逐帧读取TIFF文件,具有一定的参考价值,感兴趣的可以了解... 目录方法 1:使用 tifffile 逐帧读取安装 tifffile:逐帧读取代码:方法 2:使用

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器