You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

方形金属件X光片轮廓分析:拟合各边平均直线检测表面粗糙度

方形金属件X光轮廓的表面粗糙度检测实现方案

一、拆分轮廓为四条独立边

方形闭合轮廓首先要拆成四条边的点集,保证后续拟合的针对性:

  • 极简方法:通过坐标极值划分。找出所有轮廓点的x、y最大最小值,将x接近最小值的归为左边,x接近最大值的归为右边,y接近最小值的归为上边,y接近最大值的归为下边;
  • 精准方法:通过相邻点的斜率突变找拐点,用拐点把轮廓拆成四段,能有效避开边角过渡点,避免干扰直线拟合。

二、用最小二乘法拟合每条边的平均直线

对每条边的点集,最小二乘法是最优拟合选择——它能让所有点到直线的垂直距离平方和最小,拟合出的直线最接近边的“平均位置”:

  • 注意处理垂直边:如果直接用y = kx + b会出现无穷大斜率,可先交换x、y坐标,拟合x = ky + b,之后再转换回原坐标系的直线方程;
  • Python实现代码:
import numpy as np

def fit_edge_line(edge_points):
    x_coords = edge_points[:, 0]
    y_coords = edge_points[:, 1]
    # 判断是否为垂直边(x方向变化远小于y方向)
    is_vertical = (np.max(x_coords) - np.min(x_coords)) < (np.max(y_coords) - np.min(y_coords))
    
    if is_vertical:
        # 交换x和y,拟合x = k*y + b
        x_coords, y_coords = y_coords, x_coords
    
    # 最小二乘法求解直线参数
    A = np.vstack([x_coords, np.ones(len(x_coords))]).T
    k, b = np.linalg.lstsq(A, y_coords, rcond=None)[0]
    
    if is_vertical:
        # 转换回原坐标系的直线方程 y = (1/k)x - b/k
        return 1/k, -b/k
    # 返回y = kx + b的参数k和b
    return k, b

三、计算偏差得到粗糙度指标

拟合直线后,通过点到直线的垂直距离计算粗糙度:

  • 对每条边的每个点,计算其到拟合直线的垂直距离,该距离就是点相对于“理想平整边”的偏差;
  • 常用粗糙度评价指标:
    • 算术平均偏差Ra:所有偏差绝对值的平均值,工业检测中最常用;
    • 均方根偏差Rq:所有偏差平方的平均值开根号,能更突出大偏差的影响;
  • 计算Ra的代码示例:
def calc_point_to_line_dist(x, y, k, b):
    # 直线kx - y + b = 0的垂直距离公式
    return abs(k * x - y + b) / np.sqrt(k**2 + 1)

def calculate_ra(edge_points, line_k, line_b):
    dist_list = [calc_point_to_line_dist(x, y, line_k, line_b) for x, y in edge_points]
    return np.mean(dist_list)

四、关键注意事项

  • 若X光片存在噪声,拟合前要对边的点集做平滑处理(比如移动平均滤波),去掉明显噪声点,避免拉偏拟合直线;
  • 拆分边时要保证每条边的点数量足够多,点太少会导致拟合直线的可靠性大幅降低;
  • 方形四条边可分别计算粗糙度,后续根据需求取平均值,或保留每条边的单独检测结果。

内容的提问来源于stack exchange,提问作者nitesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:01:28