三维精密测量(二) 曲率滤波

曲率滤波

本文重点

   图像边界往往存在噪声,在获取亚像素级边缘点后,必须对边缘点进行滤波。本文提出一种基于圆曲率的边缘点滤波方法,这种方法很简单,但是却有很好的滤波效果。

1. 曲率简单介绍

        曲率是曲线的一个重要特征,它在一定程度上反映了曲线的弯曲程度,对于二维曲线,曲率定义为

${\rm{k}} = \frac{{\frac{{{d^2}y}}{{d{x^2}}}}}{{{{\left[ {1 + {{\left( {\frac{{dy}}{{dx}}} \right)}^2}} \right]}^{\frac{3}{2}}}}} = \frac{{f''}}{{{{\left[ {1 + {{\left( {f'} \right)}^2}} \right]}^{\frac{3}{2}}}}}$   式(1.1)

        对于同一平面内的任意三个连续点(x1,y1),(x2,y2),(x3,y3),如图1所示,(x2,y2)的曲率定义为

${\rm{k}} = \frac{1}{r} = \frac{1}{{\sqrt {{{\left( {x0 - x2} \right)}^2} + {{\left( {y0 - y2} \right)}^2}} }}$   式(1.2)

        式中(x0,y0)为这三点组成圆的圆心,且有

${\rm{x}}0 = \frac{{a - b + c}}{d}$

${\rm{y}}0 = \frac{{e - f + g}}{{ - d}}$

a=(x1+x2)(x2-x1)(y3-y2)

b=(x2+x3)(x3-x2)(y2-y1)

c=(y1-y3)(y2-y1)(y3-y2)

d=2[(x2-x1)(y3-y2)-(x3-x2)(y2-y1)]

e=(y1+y2)(y2-y1)(x3-x2)

f=(y2+y3)(y3-y2)(x2-x1)

g=(x1-x3)(x2-x1)(x3-x2)

圆上某点曲率

图一

        推导方法由三个点共面,三个点到圆心距离相等求得。

        即

$\left| {\begin{array}{*{20}{c}}{\begin{array}{*{20}{c}}x&y&z&1\\{x1}&{y1}&{z1}&1\\{x2}&{y2}&{z2}&1\end{array}}\\{\begin{array}{*{20}{c}}{x3}&{y3}&{z3}&1\end{array}}\end{array}} \right| = 0$   (1)
R2 = (x1-x0)2+(y1-y0)2+(z1-z0)2   (2)

R2 = (x2-x0)2+(y2-y0)2+(z2-z0)2   (3)

R2 = (x3-x0)2+(y3-y0)2+(z3-z0)2   (4)

 

2. 滤波原理及算法

        在标准圆中,其边缘点的曲率相同,都等于标准半径的倒数。而在实际中,由于边缘点不是在理想的圆周点,边缘点的曲率会在某个值附近波动,这个值可以根据半径粗定位获得,称之为圆的粗定位曲率。如果边缘点存在噪声,该点的曲率在粗定位曲率附近有较大的波动,即该点曲率与粗定位曲率之差大于某个阈值(阈值通过实际情况判断)。通过式1.1知,一个噪声点会影响其临近的两个点的曲率值,因此只有当一个点的前后两个点的粗定位曲率都大于阈值,该点本身曲率也大于阈值,则该点才是噪声点,这样计算出的亚像素边缘经过曲率过滤会更接近标准圆。

        具体算法:

        Step1:根据式(1.2)求得各个亚像素级边缘点的曲率。

        Step2:令粗定位曲率为c(其值为粗定位圆半径的倒数),阈值为t,当前点为P(x0,y0),当前点,前一点,后一点曲率分别为Q0, Q-1,Q1。如果满足以下三个条件时,则认为点P(x0,y0)为噪声点,予以剔除。

        条件1:|Q0-c|>t;

        条件2:|Q-1-c|>t;

        条件3:|Q1-c|>t.

 

 

【 结束 】

转载于:https://www.cnblogs.com/fujj/p/9711062.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卡尔曼滤波是一种用于估计系统状态的优化算法,可以用于估计道路曲率。下面是一个使用卡尔曼滤波估计道路曲率的示例: ```python import numpy as np from scipy.linalg import block_diag def kalman_filter(y, dt, Q, R): # 初始化状态向量和协方差矩阵 x = np.array([[0], [0], [0]]) P = np.eye(3) # 状态转移矩阵 F = np.array([[1, dt, 0.5*dt**2], [0, 1, dt], [0, 0, 1]]) # 测量矩阵 H = np.array([[1, 0, 0]]) # 过程噪声协方差矩阵 G = np.array([[0.5*dt**2], [dt], [1]]) # 初始化估计误差协方差矩阵 Q = block_diag(Q, Q, Q) R = R # 卡尔曼滤波 for i in range(len(y)): # 预测 x = F @ x P = F @ P @ F.T + G @ Q @ G.T # 更新 K = P @ H.T @ np.linalg.inv(H @ P @ H.T + R) x = x + K @ (y[i] - H @ x) P = (np.eye(3) - K @ H) @ P return x # 测量数据 y = np.array([0.1, 0.2, 0.3, 0.4, 0.5]) # 时间间隔 dt = 1 # 过程噪声协方差 Q = 0.01 # 测量噪声协方差 R = 0.1 # 使用卡尔曼滤波估计道路曲率 x = kalman_filter(y, dt, Q, R) # 输出估计结果 print("Estimated curvature:", x[2]) ``` 这个示例中,我们首先定义了一个`kalman_filter`函数,该函数接受测量数据`y`、时间间隔`dt`、过程噪声协方差`Q`和测量噪声协方差`R`作为输入,并返回估计的道路曲率。 然后,我们定义了状态向量`x`和协方差矩阵`P`的初始值,并根据系统模型和测量模型定义了状态转移矩阵`F`、测量矩阵`H`和过程噪声协方差矩阵`G`。 在卡尔曼滤波的循环中,我们首先进行预测步骤,根据系统模型更新状态向量`x`和协方差矩阵`P`。然后,进行更新步骤,根据测量模型和测量数据更新状态向量`x`和协方差矩阵`P`。 最后,我们输出估计的道路曲率

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值