利用matlab提取中心线
生活随笔
收集整理的這篇文章主要介紹了
利用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 == 0errordlg('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 % 若線段個數不等于2errordlg('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講解,完整的程序,以及測試的代碼!
也可以根據我的提示,自己編寫代碼,這樣更能提高寫代碼能力。
路漫漫其修遠兮,吾將上下而求索!
總結
以上是生活随笔為你收集整理的利用matlab提取中心线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeLite配置
- 下一篇: matlab人脸追踪,求大神帮助我这个菜