热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

探讨OpenCV和Matlab在最小二乘法直线拟合中的结果差异及原因分析

在使用最小二乘法进行直线拟合时,OpenCV和Matlab的计算结果存在显著差异。通过详细分析发现,这种不一致性可能源于两种软件在算法实现、数据处理方式以及数值稳定性上的不同。进一步研究还表明,输入数据的格式和预处理步骤也可能对最终结果产生影响。为了确保结果的一致性和准确性,建议在实际应用中对这两种工具的输出进行对比验证,并选择最适合具体应用场景的方法。
OpenCV 与 Matlab 中最小二乘法拟合直线数据不一致的问题

在使用最小二乘法拟合直线时,在 OpenCV 中拟合出的结果与 Matlab 中不一致。查阅资料后,发现 Matlab 中,使用最小二乘拟合时,使用的残差函数为y 的差值,即拟合值与实际值之间的差值,并不符合要使用点到直接的距离误差最小的思想;OpenCV 中的残差计算,则是使用了点到直线的距离误差最小,但opencv 中,使用了 M 估计对各个点的权重进行调整,因此,在使用过程中,需要注意;
以下为最小二乘法拟合直线的 Python 代码:

import numpy as np
import cv2 as cv
from scipy.optimize import leastsqdef func(p, x):k, b = preturn k * x + bdef error(p, x, y):return func(p, x) - ydef dist_error(p, x, y):k, b = pdist = np.abs(k * x + b - y) / np.sqrt(k**2 + 1)return distdef main():pts = np.array([(1, 3), (2, 5), (3, 8)], dtype=np.float64)x = pts[:, 0]y = pts[:, 1]para = leastsq(error, [1, 0], args=(x, y))para1 = leastsq(dist_error, [1, 0], args=(x, y))vx, vy, x0, y0 = cv.fitLine(pts, cv.DIST_L2, 0, 0.01, 0.01)k = vy / vxb = y0 - k * x0print("y 绝对值最小:", para[0])print("距离最小:", para1[0])print("opencv 拟合结果:", k, b)if __name__ == '__main__':main()

在这里插入图片描述
通过以上结果,可以看出,OpenCV 中的直线拟合,使用的最小二乘法的残差是距离的最小值;
注:由于 opencv 中使用了 M 估计进行了权重的调整,所以,如果只想用单纯的最小二乘法时,可根据需要自行编写算法。


推荐阅读
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 本文介绍了如何利用Python进行批量图片尺寸调整,包括放大和等比例缩放。文中提供了详细的代码示例,并解释了每个步骤的具体实现方法。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • Java 实现二维极点算法
    本文介绍了一种使用 Java 编程语言实现的二维极点算法。该算法用于从一组二维坐标中筛选出极点,适用于需要处理几何图形和空间数据的应用场景。文章不仅详细解释了算法的工作原理,还提供了完整的代码示例。 ... [详细]
  • 本文介绍了SVD(奇异值分解)和QR分解的基本原理及其在Python中的实现方法。通过具体代码示例,展示了如何使用这两种矩阵分解技术处理图像数据和计算特征值。 ... [详细]
  • 社交网络中的级联行为 ... [详细]
  • 使用Python实现余弦相似度计算
    余弦相似度广泛应用于文本分类、图像识别等领域,用于衡量两个向量之间的相似程度。其值域在-1到1之间,数值越接近1表示两向量越相似,完全相同为1;相反方向时为-1;正交或不相关时为0。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • 本文介绍如何利用栈数据结构在C++中判断字符串中的括号是否匹配。通过顺序栈和链栈两种方式实现,并详细解释了算法的核心思想和具体实现步骤。 ... [详细]
  • 机器学习核心概念与技术
    本文系统梳理了机器学习的关键知识点,涵盖模型评估、正则化、线性模型、支持向量机、决策树及集成学习等内容,并深入探讨了各算法的原理和应用场景。 ... [详细]
  • 本文介绍 Java 中如何使用 Year 类的 atMonth 方法将年份和月份组合成 YearMonth 对象,并提供代码示例。 ... [详细]
  • 本文介绍两道有趣的编程问题:一是寻找给定数字n的连续数字序列及其个数,二是模拟一个翻杯子的游戏。同时附带一道智商题供读者思考。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
author-avatar
鸟的蛋蛋
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有