利⽤Matlab实现迭代适应点算法
⽬录
1.算法描述
2.⼯具函数
3.函数调⽤
4.优势与不⾜
道格拉斯-普克算法(Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法、迭代适应点算法、分裂与合并算法)是将曲线近似表⽰为⼀系列点,并减少点的数量的⼀种算法。它的优点是具有平移和旋转不变性,给定曲线与阈值后,抽样结果⼀定。
1.算法描述
1.在曲线⾸尾两点间虚连⼀条直线,求出其余各点到该直线的距离。
2.选其最⼤者与阈值相⽐较,若⼤于阈值,则离该直线距离最⼤的点保留,否则将直线两端点间各点全
部舍去。
3.依据所保留的点,将已知曲线分成两部分处理,重复第1、2步操作,迭代操作,即仍选距离最⼤者与阈值⽐较,依次取舍,直到⽆点可舍去,最后得到满⾜给定精度限差的曲线点坐标。
Long Time Later
2.⼯具函数
为了代码简单易理解,这⾥使⽤了⼆分迭代,含详细注释代码如下(代码⽚可左右滑动)。
function nPntSet=dp(pntSet,TH)
% @author : slandarer
% pntSet  : ⼆维数据点
% TH      : 距离阈值
% 向量运算:计算所有点到⾸位两点连线距离
vertV=[pntSet(end,2)-pntSet(1,2),-pntSet(end,1)+pntSet(1,1)];
baseL=abs(sum((pntSet-pntSet(1,:)).*vertV./norm(vertV),2));
if max(baseL)<TH
% 若距离⼩于阈值则返回⾸尾点
nPntSet=[pntSet(1,:);pntSet(end,:)];
else
% 若距离⼤于阈值则左右两分⽀分别计算后拼接
maxPos=find(baseL==max(baseL));maxPos=maxPos(1);
L_PntSet=pntSet(1:maxPos,:);nL_PntSet=dp(L_PntSet,TH);
R_PntSet=pntSet(maxPos:end,:);nR_PntSet=dp(R_PntSet,TH);
nPntSet=[nL_PntSet;nR_PntSet(2:end,:)];
end
end
3.函数调⽤
给个demo:
% 构造⼀组数据
X=linspace(0,25,10)';
Y=randi([0,10],[10,1]);
pntSet=[X,Y];
% 阈值为2的dp算法
nPntSet=dp(pntSet,2);
% 坐标区域修饰
hold on
grid on
ax=gca;
ax.YLim=[0,10];
ax.DataAspectRatio=[1,1,1];
ax.Color=[1,1,1];
ax.XColor=[1,1,1].*.3;
ax.YColor=[1,1,1].*.3;
ax.LineWidth=1.5;
ax.FontName='cambria';
如何用matlab将已知点连线ax.GridLineStyle='--';
% 绘制原始数据曲线
plot(pntSet(:,1),pntSet(:,2),'Color',[0 0.4470 0.7410],'LineWidth',2,'Marker','*');
% 绘制新数据曲线
plot(nPntSet(:,1),nPntSet(:,2),'Color',[0.6350 0.0780 0.1840 .7],'LineWidth',2,'Marker','s');
legend('original-curve','feature-curve')
4.优势与不⾜
对⽐与垂距法(),道格拉斯-普克算法(dp)不会出现下⾯这种情况,即虽然每次变化都不⼤,但是连着好⼏次相同⽅向变化导致某些特征不会被提取出来:
但⽐较让⼈头疼的是,阈值需要⾃⼰选取,以下是不同阈值时对⽐图像:
以上就是利⽤Matlab实现迭代适应点算法的详细内容,更多关于Matlab迭代适应点算法的资料请关注其它相关⽂章!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。