利用matlab提取中心线
先看看代碼運(yùn)行結(jié)果(紅色部分表示河流中心線,黑色表示河流兩岸!):
注:
1. 由于河流兩岸的坐標(biāo)不是等距采樣,所以無(wú)法保證100%準(zhǔn)確,只要按著要求處理河岸坐標(biāo)數(shù)據(jù)Shape文件,能保證95%以上能和真正的中心線重合;
2. 一條河流計(jì)算一次,支流另行計(jì)算;
3.計(jì)算中心線同樣適合公路,且效果更好。
本程序主要有兩個(gè)難點(diǎn):
? ? ? ? 1. 提取中心線
? ? ? ? 2. 兩側(cè)目標(biāo)點(diǎn)對(duì)應(yīng)匹配
解決方法:
? ? ? ? 1. 利用三角網(wǎng)格方法計(jì)算中心線(提示:三角形側(cè)邊中點(diǎn)連線平行于底邊,因此只需要計(jì)算側(cè)邊中點(diǎn));
? ? ? ? 2. 可以通過(guò)重采樣的方式來(lái)實(shí)現(xiàn);
部分matlab代碼:
%==================================說(shuō)明==================================== % 根據(jù)河流兩岸的一些列點(diǎn)坐標(biāo)(2D),計(jì)算中心線,計(jì)算河流蜿蜒度; % 作用:根據(jù)河流兩岸的一些列點(diǎn)坐標(biāo)(2D),計(jì)算中心線,計(jì)算河流蜿蜒度; % 作者:胡禮珍 % 單位:廈門大學(xué)聯(lián)合遙感接收站 % 郵件:hulizhen@xmu.edu.cn % Q Q:249***701 clear;close all;clc; [FileName,PathName,index] = uigetfile({'*.shp'},'shp文件讀取','MultiSelect','off'); if index == 0errordlg('Shape輸入錯(cuò)誤,請(qǐng)重新輸入','輸入錯(cuò)誤');return; %終止運(yùn)行程序 end % 由于數(shù)據(jù)的原因,不建議批量處理 S = shaperead([PathName,FileName]); % 讀取Shape文件 if length(S) ==2 % 若線段個(gè)數(shù)等于2%% Result_Data= River_Shoreline(S)./1000; % 計(jì)算首尾位移和路程line1 = [S(1).X',S(1).Y';]; % 第一條岸線line2 = [S(2).X',S(2).Y';]; % 第二條岸線% line1和line2必須首尾一直line2 = line2(end:-1:1,:); % line 翻轉(zhuǎn),根據(jù)實(shí)際而定% Centerline = Center_Line(line1,line2); % 計(jì)算中心線[Centerline,line1,line2] = Center_Line(line1,line2); % 計(jì)算中心線%% 計(jì)算路程和路徑% 第一行表示位移長(zhǎng)度,剩下的每行表示一條線段的長(zhǎng)度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 % 若線段個(gè)數(shù)不等于2errordlg('Shape輸入錯(cuò)誤,請(qǐng)重新處理Shape文件','輸入錯(cuò)誤');return; % 終止運(yùn)行程序 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-計(jì)算河流蜿蜒度和提取中心線-其它文檔類資源-CSDN下載
完整代碼中有Word講解,完整的程序,以及測(cè)試的代碼!
也可以根據(jù)我的提示,自己編寫代碼,這樣更能提高寫代碼能力。
路漫漫其修遠(yuǎn)兮,吾將上下而求索!
總結(jié)
以上是生活随笔為你收集整理的利用matlab提取中心线的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: CodeLite配置
 - 下一篇: 串口引脚Remap怎么使用,在哪里使用