曲线的曲率特征

 找了很多计算曲率的例子,都是x轴等间距的例子,我自己写了一个非等间距的曲率计算方法,将一个sin函数偏移并且旋转一定角度,分别测量他们的曲率和与二阶导的和

clc;
clear;

X=(0:0.001:2*pi);
gradient=10;
x0=sin(X');
x0=[X',x0];

%旋转点
alpha=pi/6;
x1=[(x0(:,1)+1)*cos(alpha)-x0(:,2)*sin(alpha),(x0(:,2)+1)*cos(alpha)+x0(:,1)*sin(alpha)];
%添加白噪声
%x1(:,2)=awgn(x1(:,2),80);
size0=size(x0,1);
height=size0(1);

%求得曲率累积
dist_cur0=StandardErrorPoint(gradient,x0);
dist_cur1=StandardErrorPoint(gradient,x1);

%求得二阶梯度累积
dist_gra0=StandardError(0,10,x0(:,2));
dist_gra1=StandardError(0,10,x1(:,2));

%显示
label0=strcat( '\leftarrow ',num2str(dist_cur0),'+e3');
label1=strcat( '\leftarrow ',num2str(dist_cur1),'+e3');
plot(x0(:,1),x0(:,2),'-r');
text(x0(height,1),x0(height,2),label0);
text(x1(height,1),x1(height,2),label1);
hold on
plot(x1(:,1),x1(:,2),'-g');

 下面是计算曲率的和的函数

function [curvature]=StandardErrorPoint1(gradient,x0)
    size_x=size(x0,1);    
    div=zeros(size_x,1);
    %一阶导
    for i=gradient+1:size_x-gradient
        div(i)=(x0(i+gradient,2)-x0(i,2))/(x0(i+gradient,1)-x0(i,1));
    end
    for i=1:gradient
       div(i)=div(gradient+1); 
    end
    for i=size_x-gradient+1:size_x
       div(i)=div(size_x-gradient); 
    end  
    %二阶导
    div2=zeros(size_x,1);
    for i=gradient+1:size_x-gradient
        div2(i)=(div(i+gradient)-div(i))/(x0(i+gradient,1)-x0(i,1));
    end
    for i=1:gradient
       div2(i)=div2(gradient+1); 
    end
    for i=size_x-gradient+1:size_x
       div2(i)=div2(size_x-gradient); 
    end
    %曲率
    cuv=zeros(size_x,1);
    for i=gradient+1:size_x-gradient
        d10=(x0(i-gradient,2)-x0(i,2))/(x0(i-gradient,1)-x0(i,1));
        d11=(x0(i+gradient,2)-x0(i,2))/(x0(i+gradient,1)-x0(i,1));
        d2=(d11-d10)/(x0(i+gradient,1)-x0(i,1));
        cuv(i)=abs(d2)/(1+d11*d11).^(3/2);
        %cuv(i)=abs(div2(i))/(1+div(i)*div(i)).^(3/2);
    end
    for i=1:gradient
       cuv(i)=cuv(gradient+1); 
    end
    for i=size_x-gradient+1:size_x
       cuv(i)=cuv(size_x-gradient); 
    end
    curvature=sum(cuv);
%    figure(3600)
%     plot(div,'-r'); 
%     hold on
%     plot(div2,'-g');
%     hold on
%     plot(cuv,'-b');
%     hold on
%     offset=fix(x0(1,1)*100);
%     text(1000+offset,div(1000+offset),['div' num2str(x0(1,1))]);
%     text(2000+offset,div2(2000+offset),['div2' num2str(x0(1,1))]);
%     text(2000+offset,cuv(2000+offset),['cuv' num2str(x0(1,1))]);

 下面这个是计算的二阶导的和,有点问题,有空再搞搞

%统计二阶导
function dist = StandardError(crop,gradient, y)
    size0=size(y);
    y_crop=y(crop+1:size0(1)-crop);
    size_crop=size(y_crop);
    size_crop=size_crop(1);
    y_gradient=zeros(size_crop,1);
    for i=gradient:size_crop-gradient
        y_gradient(i)=abs(y_crop(i-fix(gradient)+1)+y_crop(i+fix(gradient))-2*y_crop(i));
        %y_gradient(i)=y_crop(i-fix(gradient)+1)+y_crop(i+fix(gradient))-2*y_crop(i)/(size_crop-2*gradient+1);
    end
    %平滑梯度
    filter_num=1;   
    for i=1:filter_num
        %y_gradient=Gaussianfilter(100,10,y_gradient);                     %窗体大小和sigma没影响,
        %y_gradient=Medfilter(300,y_gradient);                             %修改滤波次数,经过检测,变化不大;窗体大小变大,梯度表差越小
        %y_gradient=Meanfilter(500,y_gradient);                             %窗体变化,影响不大
    end
%     figure(100);
%     plot(y_gradient);
    dist=sum(y_gradient);
end
        

 实验效果,

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值