直线拟合算法
来源:互联网 发布:美国反倾销数据库 编辑:程序博客网 时间:2024/05/16 07:25
在计算机视觉的应用中,经常会用到提取一条直线的精确位置这样的工作。这时就要用到直线的拟合算法了。
这里,我也贴一个利用最小二乘法计算最佳拟合直线的代码。
这个代码是我以前学习《机器视觉算法与应用(双语版)》[德] 斯蒂格(Steger C) 著;杨少荣 等 译 的书时写的。所有的公式推导都在书中 3.8.1 ,还算比较有用。
与一元线性回归算法的区别:一元线性回归算法假定 X 是无误差的,只有 Y 有误差。 而这个算法假设每个点的 X Y 坐标的误差都是符合 0 均值的正态分布的。 因此,在计算机视觉的应用中比普通的一元线性回归拟合的结果要好。
#include <QVector>#include <QPoint>#include <math.h>/// 本代码用到了 Qt5 中的 QVector 和 QPoint。但是可以很容易的改为其他数组类型。/** * 最小二乘法直线拟合(不是常见的一元线性回归算法) * 将离散点拟合为 a x + b y + c = 0 型直线 * 假设每个点的 X Y 坐标的误差都是符合 0 均值的正态分布的。 * 与一元线性回归算法的区别:一元线性回归算法假定 X 是无误差的,只有 Y 有误差。 */bool lineFit(const QVector<QPoint> &points, double &a, double &b, double &c){ int size = points.size(); if(size < 2) { a = 0; b = 0; c = 0; return false; } double x_mean = 0; double y_mean = 0; for(int i = 0; i < size; i++) { x_mean += points[i].x(); y_mean += points[i].y(); } x_mean /= size; y_mean /= size; //至此,计算出了 x y 的均值 double Dxx = 0, Dxy = 0, Dyy = 0; for(int i = 0; i < size; i++) { Dxx += (points[i].x() - x_mean) * (points[i].x() - x_mean); Dxy += (points[i].x() - x_mean) * (points[i].y() - y_mean); Dyy += (points[i].y() - y_mean) * (points[i].y() - y_mean); } double lambda = ( (Dxx + Dyy) - sqrt( (Dxx - Dyy) * (Dxx - Dyy) + 4 * Dxy * Dxy) ) / 2.0; double den = sqrt( Dxy * Dxy + (lambda - Dxx) * (lambda - Dxx) ); a = Dxy / den; b = (lambda - Dxx) / den; c = - a * x_mean - b * y_mean; return true;}
2 1
- Ransac算法--直线拟合
- 直线拟合算法
- 直线拟合算法(续)
- Ransac算法--直线拟合
- C#最小二乘法直线拟合算法
- RANSAC算法做直线拟合
- RANSAC算法做直线拟合
- RANSAC算法做直线拟合
- 【算法研究与实现】最小二乘法直线拟合
- 【算法研究与实现】最小二乘法直线拟合
- 直线拟合
- 直线拟合
- 直线拟合
- 最小二乘法直线拟合、圆拟合
- 最小二乘法直线拟合
- 最小二乘法直线拟合
- 最小二乘法直线拟合
- OpenCV 直线拟合
- jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign ke
- Tricky Sum(等比数列)
- python爬虫:爬取慕课网视频
- html5 canvas 使用说明
- PUSHA/PUSHAD POPA/POPAD 指令详解
- 直线拟合算法
- magento安装出现的一些问题(后续补充)
- hdoj 1896 Stones 【优先队列】
- (十三)利用processing模拟粒子系统
- Java笔记基础
- 第39级台阶
- 第三周上机实践项目——项目2-本月有几天?
- xdoj 1130 A Simple Math Problem 3 组合公式
- 有理数类