当前位置: 首页 > news >正文

记录搜罗到的Matlab 对散点进行椭圆拟合

需要基于一些散点拟合椭圆估计并计算出椭圆的参数和周长,搜罗到直接上代码
(1)有用的椭圆拟合及参数计算函数

function W = fitellipse(x,y)
% 构造矩阵
D = [x.*x, x.*y, y.*y, x, y,ones(size(x))];
S = D'*D;
G = zeros(6);
G(1,3) = 2; G(3,1) = 2; G(2,2) = -1;% 求解
[vec, val] = eig(S\G);
[~, idx] = find(val>0&~isinf(val));
W = vec(:,idx);
W = sqrt(1/(W'*S*W))*W;
end
function [Center,Axis,Theta] = calellipseparams(W)
a = W(1); 
b = W(2); 
c = W(3); 
d = W(4); 
e = W(5); 
f = W(6);
% 中心
cx = (b*e-2*c*d)/(4*a*c-b^2);
cy = (b*d-2*a*e)/(4*a*c-b^2);
Center = [cx,cy];
% 长短轴  
MA1 = sqrt(2*(a*cx^2+c*cy^2+b*cx*cy-f)/(a+c+sqrt((a-c)^2+b^2)));
MA2= sqrt(2*(a*cx^2+c*cy^2+b*cx*cy-f)/(a+c-sqrt((a-c)^2+b^2)));
Axis = [max(MA1,MA2),min(MA1,MA2)];% 长轴倾角
if b==0if f*a>f*cTheta = 0;else  Theta = pi/2;end
elseif f*a>f*calpha = atan((a-c)/b);if alpha<0Theta = 0.5*(-pi/2-alpha);elseTheta = 0.5*(pi/2-alpha);endelsealpha = atan((a-c)/b);if alpha<0Theta = pi/2+0.5*(-pi/2-alpha);elseTheta = pi/2+0.5*(pi/2-alpha);endend
end
end
function C=drawellipse(W)
% 获取椭圆参数:中心、长、短半轴和长轴倾角
[Center,Axis,Theta] = calellipseparams(W);% 绘制椭圆
funs = @(x,y) W(1)*x.^2 + W(2)*x.*y + W(3)*y.^2 + W(4)*x + W(5)*y + W(6);
fimplicit(funs,'LineWidth',2)% 绘制长短轴
Majcoor = [-Axis(1),0; Axis(1),0];
Mincoor = [0,-Axis(2); 0,Axis(2)];
RM = [cos(Theta),-sin(Theta);sin(Theta),cos(Theta)];
Majcoor = Majcoor*RM'+Center;
Mincoor = Mincoor*RM'+Center;Slen = sqrt((Mincoor(1,1)-Mincoor(2,1))^2 + (Mincoor(1,2)-Mincoor(2,2))^2);
Llen = sqrt((Majcoor(1,1)-Majcoor(2,1))^2 + (Majcoor(1,2)-Majcoor(2,2))^2);C =(3.1415926*Slen+2*(Llen-Slen));line(Majcoor(:,1),Majcoor(:,2),'Color','r','LineWidth',3)
line(Mincoor(:,1),Mincoor(:,2),'Color','g','LineWidth',3)
plot(Center(1),Center(2),'y.','MarkerSize',15)end

(2)利用以上函数对已有散点进行椭圆拟合,并计算椭圆的周长如下:

XX=[....];%需拟合的散点
YY=[.....];% 椭圆拟合
W = fitellipse(YY',ZZ');%输入参数为列向量且长度一致,不是列向量时需要转置% 绘制结果
figure
plot(YY,ZZ,'.'), 
axis equal
hold on
C=drawellipse(W);%返回椭圆周长
axis equal

下面是本次拟合的结果,看起来还不错,
在这里插入图片描述

http://www.lryc.cn/news/460203.html

相关文章:

  • 分享我最近使用《柬埔寨语翻译通》App的体验,不会说高棉语也能去柬埔寨旅游,畅通无阻!
  • 文本语义检索系统的搭建过程,涵盖了召回、排序以及Milvus召回系统、短视频推荐等相关内容
  • redis在项目中运用(基础)
  • libaom 源码分析系列:svc_encoder_rtc.cc 文件
  • MySQL备份和还原,用mysqldump、mysql和source命令来完成
  • MySQL Server、HeidiSQL(MySQL 数据库工具)
  • 矩阵相关算法
  • 微信小程序-封装通用模块
  • Modnet 人像抠图(论文复现)
  • 利用session机制造测试账号,无需前端也可以测试后端接口
  • JAVA_18
  • Linux升级openssl版本
  • 多态对象的存储方案小结
  • Linux 之 nano 编辑器
  • zipkin启动脚本并指定mysql数据存储
  • 超越GPT-4的视觉与文本理解能力,开源多模态模型领跑者 - Molmo
  • 输入输出--I/O流【C++提升】()
  • Maven 中央仓库地址推荐
  • Fastgpt本地化部署 - 以MAC为例
  • SpringBoot框架下购物推荐网站的设计模式与实现
  • Apache Flink 和 Apache Kafka
  • Excel中Ctrl+e的用法
  • 07-Cesium动态处理线条闪烁材质的属性
  • postgresql16分区表解析
  • 文字识别解决方案-OCR识别应用场景解析
  • Qt 每日面试题 -9
  • K8s环境下使用sidecar模式对EMQX的exhook.proto 进行流量代理
  • Dirble:一款高性能目录扫描与爬取工具
  • C#语言基础
  • 网络分析仪——提升网络性能的关键工具