利用matlab提取中心线

先看看代码运行结果(红色部分表示河流中心线,黑色表示河流两岸!):

注:

1. 由于河流两岸的坐标不是等距采样,所以无法保证100%准确,只要按着要求处理河岸坐标数据Shape文件,能保证95%以上能和真正的中心线重合;

2. 一条河流计算一次,支流另行计算;

3.计算中心线同样适合公路,且效果更好。

本程序主要有两个难点:

        1. 提取中心线

        2. 两侧目标点对应匹配

解决方法:

        1. 利用三角网格方法计算中心线(提示:三角形侧边中点连线平行于底边,因此只需要计算侧边中点);

        2. 可以通过重采样的方式来实现;

部分matlab代码:

%==================================说明====================================
%   根据河流两岸的一些列点坐标(2D),计算中心线,计算河流蜿蜒度;
%   作用:根据河流两岸的一些列点坐标(2D),计算中心线,计算河流蜿蜒度;
%   作者:胡礼珍
%   单位:厦门大学联合遥感接收站
%   邮件:hulizhen@xmu.edu.cn
%   Q  Q:249***701
clear;close all;clc;
[FileName,PathName,index] = uigetfile({'*.shp'},'shp文件读取','MultiSelect','off');
if index == 0
    errordlg('Shape输入错误,请重新输入','输入错误');
    return;                         %终止运行程序
end
% 由于数据的原因,不建议批量处理
S = shaperead([PathName,FileName]);             % 读取Shape文件
if length(S) ==2                                % 若线段个数等于2
    %%  Result_Data= River_Shoreline(S)./1000;      % 计算首尾位移和路程
    line1 = [S(1).X',S(1).Y';];                 % 第一条岸线
    line2 = [S(2).X',S(2).Y';];                 % 第二条岸线
    % line1和line2必须首尾一直
    line2 = line2(end:-1:1,:);                  % line 翻转,根据实际而定
    % Centerline = Center_Line(line1,line2);    % 计算中心线
    [Centerline,line1,line2] = Center_Line(line1,line2);      % 计算中心线
    %% 计算路程和路径
    % 第一行表示位移长度,剩下的每行表示一条线段的长度
    Result_Data = sqrt(sum((Centerline-[Centerline(end,:);Centerline(1:end-1,:)]).^2,2));
    Result_Data = [Result_Data(1,:),sum(Result_Data(2:end,:))]./1000;  % [位移,路程]
    Meanderness = Result_Data(1,2)/Result_Data(1,1);         % 蜿蜒度
else                                            % 若线段个数不等于2
    errordlg('Shape输入错误,请重新处理Shape文件','输入错误');
    return;                                     % 终止运行程序
end

%% 显示
figure('Name','位置')
plot(line1(:,1),line1(:,2),'k')
hold on
plot(line2(:,1),line2(:,2),'k')
plot(Centerline(:,1),Centerline(:,2),'r')
hold off

注:核心部分代码就不公布了,自行下载。

完整代码地址:matlab-计算河流蜿蜒度和提取中心线-其它文档类资源-CSDN下载

完整代码中有Word讲解,完整的程序,以及测试的代码!

也可以根据我的提示,自己编写代码,这样更能提高写代码能力。

路漫漫其修远兮,吾将上下而求索!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

心网千结

若有所帮助,请点赞支持

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

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

打赏作者

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

抵扣说明:

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

余额充值