直线拟合,多项式拟合曲线,蒙特卡洛拟合曲线matlab 代码


% % 遍历每个轮廓
% for k = 1:length(B_L)
%     boundary = B_L{k};
%     
%     % 获取 x 和 y 坐标
%     x = boundary(:,2);
%     y = boundary(:,1);
%     
%     % 检查连通分量点数是否足够进行拟合
%     if length(x) < 2
%         continue;
%     end
%     
%     % 线性拟合
%     p = polyfit(x, y, 1);
%     
%     % 获取拟合直线的插值点
%     xx = linspace(min(x), max(x), 300);
%     yy = polyval(p, xx);
%     
%     % 延长直线
%     extrapolate_amount = 150; % 延长的量
%     xx_ext = linspace(min(x) - extrapolate_amount, max(x) + extrapolate_amount, 200);
%     yy_ext = polyval(p, xx_ext);
%     
%      % 过滤掉延申到图片外的点
%     valid_idx = (xx_ext >= 1) & (xx_ext <= cols) & (yy_ext >= 1) & (yy_ext <= rows);
%     xx_ext = xx_ext(valid_idx);
%     yy_ext = yy_ext(valid_idx);
% 
%     % 绘制结果
%     plot(x, y, 'r.', 'MarkerSize', 5); % 原始边缘点
%     plot(xx, yy, 'g-', 'LineWidth', 2); % 原始直线拟合
%     plot(xx_ext, yy_ext, 'b-', 'LineWidth', 2); % 延长后的直线拟合
% end
% 
% hold off;


% for k = 1:length(B_L)
%     boundary = B_L{k};
%     
%     % 获取 x 和 y 坐标
%     x = boundary(:,2);
%     y = boundary(:,1);
%     
%     % 检查连通分量点数是否足够进行拟合
%     if length(x) < 2
%         continue;
%     end
%     
%     % 多项式拟合
%     % 选择一个合适的多项式阶数 n,这里示例使用二次多项式,即 n = 2
%     n = 6;
%     p = polyfit(x, y, n);
% 
%     % 通过多项式系数 p 得到拟合的 y 值
%     xx_poly = linspace(min(x), max(x), 300);
%     yy_poly = polyval(p, xx_poly);
%     
%     % 延长多项式曲线
%     extrapolate_amount = 15; % 延长的量,自定
%     xx_ext_poly = linspace(min(x) - extrapolate_amount, max(x) + extrapolate_amount, 400);
%     yy_ext_poly = polyval(p, xx_ext_poly);
%     
%     % 过滤掉延申到图片外的点
%     valid_idx = (xx_ext_poly >= 1) & (xx_ext_poly <= cols) & (yy_ext_poly >= 1) & (yy_ext_poly <= rows);
%     xx_ext_poly = xx_ext_poly(valid_idx);
%     yy_ext_poly = yy_ext_poly(valid_idx);
%     
%     % 绘制结果
%     plot(x, y, 'r.', 'MarkerSize', 5); % 原始边缘点
%     plot(xx_poly, yy_poly, 'g-', 'LineWidth', 2); % 多项式拟合曲线
%     plot(xx_ext_poly, yy_ext_poly, 'b-', 'LineWidth', 2); % 延长后的多项式拟合曲线
% end
% 
% hold off;
% 
% for k = 1:length(B_L)
%     boundary = B_L{k};
%     
%     % 获取 x 和 y 坐标
%     x = boundary(:,2);
%     y = boundary(:,1);
%     
%     % 检查连通分量点数是否足够进行拟合
%     if length(x) < 4
%         continue; % 卡特蒙样条至少需要4个点才能计算
%     end
%     
%     % 对原始边缘点使用卡特蒙样条拟合
%     t = 1:length(x); % 假设每两个点之间的参数距离相同
%     tt = linspace(min(t), max(t), 300); % 插值参数,用于生成更多的点让曲线更平滑
%     
%     % 使用卡特蒙样条曲线进行插值
%     xx_catmull = spline(t, [0 x' 0], tt);
%     yy_catmull = spline(t, [0 y' 0], tt);
%     
%     % 延长卡特蒙样条曲线
%     extrapolate_amount = 600; % 延长的量
%     t_ext = [min(t)-extrapolate_amount tt max(t)+extrapolate_amount];
%     xx_ext_catmull = spline(t, [0 x' 0], t_ext);
%     yy_ext_catmull = spline(t, [0 y' 0], t_ext);
%     
%     % 过滤掉延申到图片外的点
%     valid_idx = (xx_ext_catmull >= 1) & (xx_ext_catmull <= cols) & (yy_ext_catmull >= 1) & (yy_ext_catmull <= rows);
%     xx_ext_catmull = xx_ext_catmull(valid_idx);
%     yy_ext_catmull = yy_ext_catmull(valid_idx);
%     
%     % 绘制结果
%     plot(x, y, 'r.', 'MarkerSize', 5); % 原始边缘点
%     plot(xx_catmull, yy_catmull, 'g-', 'LineWidth', 2); % 卡特蒙样条拟合曲线
%     plot(xx_ext_catmull, yy_ext_catmull, 'b-', 'LineWidth', 2); % 延长后的卡特蒙样条拟合曲线
% end
% extrapolate_amount = 400;
% for k = 1:length(B_L)
%     boundary = B_L{k};
%     
%     % 获取 x 和 y 坐标
%     x = boundary(:,2);
%     y = boundary(:,1);
%     
%     % 检查连通分量点数是否足够进行拟合
%     if length(x) < 4
%         continue; % 卡特蒙样条至少需要4个点才能计算
%     end
%     
%     % 对原始边缘点使用卡特蒙样条拟合
%     t = 1:length(x); % 假设每两个点之间的参数距离相同
%     tt = linspace(min(t), max(t), 300); % 插值参数,用于生成更平滑的曲线
%     
%     % 使用卡特蒙样条曲线进行插值
%     xx_catmull = spline(t, [0 x' 0], tt);
%     yy_catmull = spline(t, [0 y' 0], tt);
%     
%     % 假定extrapolate_amount对于t的扩展以等比增长
%     t_extrapolate_before = linspace(min(t)-extrapolate_amount, min(t)-1, 100); % 在最小t之前延长
%     t_extrapolate_after = linspace(max(t)+1, max(t)+extrapolate_amount, 100); % 在最大t之后延长
%     t_ext = [t_extrapolate_before, tt, t_extrapolate_after];
% 
%     
%     xx_ext_catmull = spline(t, [0 x' 0], t_ext);
%     yy_ext_catmull = spline(t, [0 y' 0], t_ext);
%     
%     % 过滤掉延申到图片外的点
%     valid_idx = (xx_ext_catmull >= 1) & (xx_ext_catmull <= cols) & (yy_ext_catmull >= 1) & (yy_ext_catmull <= rows);
%     xx_ext_catmull = xx_ext_catmull(valid_idx);
%     yy_ext_catmull = yy_ext_catmull(valid_idx);
%     
%     %
%  
%     plot(x, y, 'r.', 'MarkerSize', 5); % 原始边缘点
%     hold on; % 确保绘制不会覆盖之前的结果
%     plot(xx_catmull, yy_catmull, 'g-', 'LineWidth', 2); % 卡特蒙样条拟合曲线
%     plot(xx_ext_catmull, yy_ext_catmull, 'b-', 'LineWidth', 2); % 延长后的卡特蒙样条拟合曲线
%  
% end
% hold off;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,这里给你一个用Matlab实现RANSAC拟合多项式曲线的例子代码。这个例子使用了二次多项式模型来拟合数据,你可以根据自己的需求修改代码以适应不同的数据和模型。 ```matlab % 生成一组带噪声的数据 x = linspace(0, 10, 100); y = 2*x.^2 - 3*x + 1 + randn(size(x)); % RANSAC拟合多项式曲线 maxIter = 1000; % 最大迭代次数 inlierThresh = 0.2; % 内点阈值 bestModel = []; % 最佳模型 bestInliers = []; % 最佳内点 bestErr = inf; % 最小误差 for i = 1:maxIter % 随机选择3个数据点 subset = randperm(length(x), 3); xSubset = x(subset); ySubset = y(subset); % 拟合二次多项式曲线 polyCoeffs = polyfit(xSubset, ySubset, 2); fittedY = polyval(polyCoeffs, x); % 计算误差 err = abs(y - fittedY); % 找到内点 inliers = find(err < inlierThresh); % 更新最佳模型参数 if length(inliers) > length(bestInliers) bestModel = polyCoeffs; bestInliers = inliers; bestErr = mean(err(inliers)); end end % 使用所有内点重新拟合模型 bestModel = polyfit(x(bestInliers), y(bestInliers), 2); % 绘制结果 figure; plot(x, y, 'ko'); hold on; plot(x, polyval(bestModel, x), 'r-', 'LineWidth', 2); legend('数据', 'RANSAC拟合'); ``` 这个例子中,我们使用了`polyfit`函数来拟合二次多项式曲线,使用`polyval`函数计算拟合结果。在RANSAC算法中,我们随机选择3个数据点用来估计模型参数,然后计算所有数据点到拟合曲线的距离,将距离小于阈值的点划分为内点,其他点划分为外点。最后,我们使用所有内点重新拟合模型,得到最终的拟合结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知新_ROL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值