% % 遍历每个轮廓
% 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;
06-06