0006_拟合

拟合的一般步骤:

1. 采集图像

2. 预处理,去燥、抠图

3. 边缘提取

4. 分割轮廓(或者联合轮廓)

5. 拟合

6. 或者进行距离的计算、或者显示

 

拟合的三个重要函数(直线、椭圆、圆)

//拟合直线

fit_line_contour_xld

Contours:输入轮廓

Algorithm:拟合直线的算法

MaxNumPoints:用于计算的最大轮廓点数,-1表示所有点都参与计算

ClippingEndPoints:轮廓开始点和结束点之间,被忽略点的个数

Iterations:加权拟合的最大迭代次数

ClippingFactor:用于消除异常值的削减因子

RowBegin:线段起点的行坐标

ColBegin:线段起点的列坐标

RowEnd:线段结束点的行坐标

ColEnd:线段结束点的列坐标

Nr:线参数:法线向量的行坐标

Nc:线参数:法线向量的列坐标

Dist:线参数:线与原点的距离

 

 

//拟合椭圆

fit_ellipse_contours_xld

Contours:输入xld轮廓

Algorithm:拟合采用的算法

MaxNumPoints:拟合轮廓采用的最多的点数

MaxClosureDist:被认为封闭的最大的距离

ClippingEndPoints:轮廓开始点和结束点之间,被忽略点的个数

VossTabSize:用于Voss方法的圆形段数

Iterations:加权拟合的最大迭代次数

ClippingFactor:用于消除异常值的削减因子

Row:椭圆中心点的行坐标

Column:椭圆中心点的列坐标

Phi:主轴的方向角度(弧度)

Radius1:长半轴的长度

Radius2:短半轴的长度

StartPhi:起始点的角度(弧度)

EndPhi:结束点的角度(弧度)

PointOrder:边界点的次序

 

 

//拟合圆

fit_circle_contours_xld

Contours:输入轮廓

Algorithm:圆拟合的算法

MaxNumPoints:用于计算的最大轮廓点数(-1表示所有点都参与)

MaxClosureDist:被视为“闭合”的轮廓的端点之间的最大距离

ClippingEndPoints:拟合时要忽略的轮廓开始和结束处的点数

Iterations:鲁棒加权拟合的最大迭代次数

ClippingFactor:消除异常值的削减因子(典型值:Huber为1.0,Tukey为2.0)

Row:圆的中心点行坐标

Column:圆的中心点列坐标

Radius:圆的半径

StartPhi:开始点的角度

EndPhi:结束点的角度

PointOrder:边界点的次序

 

更多halcon和六轴机械臂算法干货公众号:

 

% 碳化硅外延层厚度计算MATLAB代码 % 版本:MATLAB R2023a % 功能:实现数据预处理、极值点检测、Cauchy模型拟合、厚度计算及统计分析 %% 1. 数据读取 % 读取附件1和附件2数据 data1 = readmatrix('附件1.xlsx'); % 入射角10°数据 data2 = readmatrix('附件2.xlsx'); % 入射角15°数据 wave_number1 = data1(:, 1); % 波数 (cm⁻¹) reflectance1 = data1(:, 2); % 反射率 (%) wave_number2 = data2(:, 1); reflectance2 = data2(:, 2); %% 2. 数据预处理 % 2.1 基线校正(滚动窗口最小值法) window_size = 50; baseline1 = movmin(reflectance1, window_size); corrected_reflectance1 = reflectance1 - baseline1; baseline2 = movmin(reflectance2, window_size); corrected_reflectance2 = reflectance2 - baseline2; % 2.2 平滑处理(Savitzky-Golay滤波器) smooth_window = 11; poly_order = 2; smoothed_reflectance1 = sgolayfilt(corrected_reflectance1, poly_order, smooth_window); smoothed_reflectance2 = sgolayfilt(corrected_reflectance2, poly_order, smooth_window); %% 3. 极值点检测(极大值) % 设置峰值检测参数 min_peak_height = mean(smoothed_reflectance1) * 1.2; % 最小峰高设为均值的1.2倍 peak_distance = 50; % 峰间距 [peaks1, locs1] = findpeaks(smoothed_reflectance1, wave_number1, 'MinPeakHeight', min_peak_height, 'MinPeakDistance', peak_distance); [peaks2, locs2] = findpeaks(smoothed_reflectance2, wave_number2, 'MinPeakHeight', min_peak_height, 'MinPeakDistance', peak_distance); %% 4. Cauchy色散模型拟合 % 定义Cauchy模型函数 cauchy_model = @(params, lambda) params(1) + params(2)./lambda.^2 + params(3)./lambda.^4; % 准备数据(将波数转换为波长,单位:μm) lambda1 = 1 ./ locs1 * 100; % 波数(cm⁻¹)转波长(μm):λ(μm) = 10^4 / 波数(cm⁻¹) lambda2 = 1 ./ locs2 * 100; % 初始参数猜测和边界 initial_params = [2.5, 0.05, 0.0005]; % [A, B, C] lb = [2.4, 0.04, 0.0004]; % 参数下界 ub = [2.6, 0.06, 0.0006]; % 参数上界 % 拟合参数 params1 = lsqcurvefit(cauchy_model, initial_params, lambda1, peaks1, lb, ub); params2 = lsqcurvefit(cauchy_model, initial_params, lambda2, peaks2, lb, ub); A1 = params1(1); B1 = params1(2); C1 = params1(3); A2 = params2(1); B2 = params2(2); C2 = params2(3); %% 5. 厚度计算 % 入射角转换为弧度 theta1 = deg2rad(10); % 附件1入射角10° theta2 = deg2rad(15); % 附件2入射角15° % 计算相邻极大值点的波数差Δṽ_i delta_nu1 = diff(locs1); % 附件1波数差 delta_nu2 = diff(locs2); % 附件2波数差 % 计算厚度(仅保留5-10μm范围内的结果) d1 = zeros(size(delta_nu1)); for i = 1:length(delta_nu1) lambda_avg = 100 ./ mean([locs1(i), locs1(i+1)]); % 平均波长(μm) n = cauchy_model(params1, lambda_avg); % 平均折射率 denominator = 2 * delta_nu1(i) * sqrt(n^2 - sin(theta1)^2); d1(i) = 1 / denominator; end d1 = d1(d1 >= 5 & d1 <= 10); % 筛选有效厚度 d2 = zeros(size(delta_nu2)); for i = 1:length(delta_nu2) lambda_avg = 100 ./ mean([locs2(i), locs2(i+1)]); n = cauchy_model(params2, lambda_avg); denominator = 2 * delta_nu2(i) * sqrt(n^2 - sin(theta2)^2); d2(i) = 1 / denominator; end d2 = d2(d2 >= 5 & d2 <= 10); %% 6. 统计分析 stats1 = [mean(d1), median(d1), std(d1), prctile(d1, 2.5), prctile(d1, 97.5)]; % 均值、中位数、标准差、95%置信区间 stats2 = [mean(d2), median(d2), std(d2), prctile(d2, 2.5), prctile(d2, 97.5)]; %% 7. 结果输出 disp('附件1厚度统计结果(单位:μm):'); disp(['均值:', num2str(stats1(1)), ',中位数:', num2str(stats1(2)), ',标准差:', num2str(stats1(3))]); disp(['95%置信区间:[', num2str(stats1(4)), ', ', num2str(stats1(5)), ']']); disp('附件2厚度统计结果(单位:μm):'); disp(['均值:', num2str(stats2(1)), ',中位数:', num2str(stats2(2)), ',标准差:', num2str(stats2(3))]); disp(['95%置信区间:[', num2str(stats2(4)), ', ', num2str(stats2(5)), ']']); % 保存结果 save('厚度计算结果.mat', 'd1', 'd2', 'stats1', 'stats2', 'params1', 'params2'); writematrix(d1, '厚度_附件1.csv'); writematrix(d2, '厚度_附件2.csv'); 修改此代码使其运算结果显示折射率计算结果、厚度计算结果、均值、中位数、标准差、置信区间以及可靠性。(低AI率)
最新发布
09-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值