二维高斯曲面拟合法求取光斑中心及算法的C++实现
(1)二维高斯去曲面拟合推导
一个二维高斯方程可以写成如下形式:
其中,G为高斯分布的幅值,,为x,y方向上的标准差,对式(1)两边取对数,并展开平方项,整理后为:
假如参与拟合的数据点有N个,则将这个N个数据点写成矩阵的形式为:A = B C,
其中:
A为N*1的向量,其元素为:
B为N*5的矩阵:
C为一个由高斯参数组成的向量:
(2)求解二维高斯曲线拟合
N个数据点误差的列向量为:E=A-BC,用最小二乘法拟合,使其N个数据点的均方差最小,即:
在图像数据处理时,数据量比较大,为减小计算量,将矩阵B进行QR分解,即:B=QR,分解后Q为一个N*N的正交矩阵,R为一个N*5的上三角矩阵,对E=A-BC进行如下推导:
由于Q为正交矩阵,可以得到:
令:
其中:
S为一个5维列向量;T为一个N-5维列向量;R1为一个5*5的上三角方阵,则
上式中,当S = R1C时取得最小值,因此只需解出:
即可求出:
中的
这些参数,这里先给出:
这里:
(3)C++代码实现,算法的实现过程中由于涉及大量的矩阵运算,所以采用了第三方的开源矩阵算法Eigen,这里真正用于高斯拟合的函数是
bool GetCentrePoint(float& x0,float& y0)
关于Eigen的用法请参考:http://blog.csdn.net/hjx_1000/article/details/8490941
#include "stdafx.h"
#include "GaussAlgorithm.h"VectorXf m_Vector_A;
MatrixXf m_matrix_B;
int m_iN =-1;bool InitData(int pSrc[100][100], int iWidth, int iHeight)
{if (NULL == pSrc || iWidth <=0 || iHeight <= 0)return false;m_iN = iWidth*iHeight;VectorXf tmp_A(m_iN);MatrixXf tmp_B(m_iN, 5);int i =0, j=0, iPos =0;while(i<iWidth){j=0;while(j<iHeight){tmp_A(iPos) = pSrc[i][j] * log((float)pSrc[i][j]);tmp_B(iPos,0) = pSrc[i][j] ;tmp_B(iPos,1) = pSrc[i][j] * i;tmp_B(iPos,2) = pSrc[i][j] * j;tmp_B(iPos,3) = pSrc[i][j] * i * i;tmp_B(iPos,4) = pSrc[i][j] * j * j;++iPos;++j;}++i;}m_Vector_A = tmp_A;m_matrix_B = tmp_B;}
bool GetCentrePoint(float& x0,float& y0)
{if (m_iN<=0)return false;//QR分解HouseholderQR<MatrixXf> qr;qr.compute(m_matrix_B);MatrixXf R = qr.matrixQR().triangularView<Upper>();MatrixXf Q = qr.householderQ();//块操作,获取向量或矩阵的局部VectorXf S;S = (Q.transpose()* m_Vector_A).head(5);MatrixXf R1;R1 = R.block(0,0,5,5);VectorXf C;C = R1.inverse() * S;x0 = -0.5 * C[1] / C[3];y0 = -0.5 * C[2] / C[4];return true;
}
其中:
函数 bool InitData(int pSrc[100][100], int iWidth, int iHeight)主要用于将数组转换成相应的矩阵,因为我的所有数据都在一个整形的二维数组中存着,所以需要做这种转换。
函数bool GetCentrePoint(float& x0,float& y0)主要用于对数据点进行二维高斯曲面拟合,并返回拟合的光点中心。
二维高斯曲面拟合法求取光斑中心及算法的C++实现相关推荐
- 二维高斯曲面拟合法求取光斑中心
(1)二维高斯去曲面拟合推导 一个二维高斯方程可以写成如下形式: 其中,G为高斯分布的幅值,,为x,y方向上的标准差,对式(1)两边取对数,并展开平方项,整理后为: 假如参与拟合的数据点有N个,则将这 ...
- 高斯低通滤波 matlab_一维和二维高斯函数及其一阶和二阶导数
二维高斯函数 高斯函数在图像滤波.边缘检测等中发挥着重要的作用.高斯滤波是典型的低通滤波,对图像有平滑作用.同时,高斯函数的一阶.二阶导数也可以用于高通滤波,比如canny算子中用到的是高斯函数的一阶 ...
- AI笔记: 计算机视觉之SIFT特征检测: 尺度空间、二维高斯函数、高斯金字塔
SIFT概述 SIFT的全称是Scale Invariant Feature Transform(尺度不变特征变换),是由加拿大教授David G.Lowe在1999年发表于计算机视觉国际会议,200 ...
- 使用二维高斯函数模糊图片
这篇文章以通俗易懂的语言和方式解释了如何使用高斯函数模糊一张图片. 1.一维高斯函数: a表示得到曲线的高度,b是指曲线在x轴的中心,c指width(与半峰全宽有关),图形如下: 2.根据一维高斯函数 ...
- 利用meshgrid函数绘制二维高斯函数曲面
meshgrid函数用于根据给定的横纵坐标点生成坐标网格,以便计算二元函数的取值. 设二维高斯函数表达式为: 程序如下: u=[-10:0.1:10]; v=[-10:0.1:10]; [U,V]=m ...
- 杨桃的Python进阶讲座16——数组array(六)一维数组和二维数组的索引和取值(配详细图解)
本人CSDN博客专栏:https://blog.csdn.net/yty_7 Github地址:https://github.com/yot777/ 在进阶讲座8中讲过数组(矩阵)的维度,我们再看看多 ...
- ITK:二维高斯混合模型期望最大化
ITK:二维高斯混合模型期望最大化 内容提要 输出结果 C++实现代码 内容提要 二维高斯混合模型期望最大值 输出结果 Cluster[0]Parameters:[101.40933830302448 ...
- C语言试题二十三之编写一个函数void function(int tt[m][n],int pp[n]),tt指向一个m行n列的二维函数组,求出二维函数组每列中最小元素,并依次放入pp所指定一维数组中
1. 题目 请编写一个函数void function(int tt[m][n],int pp[n]),tt指向一个m行n列的二维函数组,求出二维函数组每列中最小元素,并依次放入pp所指定一维数组中.二 ...
- 二维有限体积 matlab,二维有限体积法计算热传导及源码.pdf
二维有限体积法计算热传导及源码 //#include "stdafx.h" #include #include #include #include #include using n ...
最新文章
- 围巾都这么黑科技了,是我见识少了
- [设计模式随意链接]——命令模式
- [YTU]_2911 ( 我想放假)
- 基于Swoole和Redis实现的并发队列处理系统 1
- 算法练习-002-返回一个set数组
- 捕获异常VS抛出异常
- jar运行 osgi保存_自动化的OSGi测试运行程序
- css控制div等比高度
- 网站集成支付宝接口安装教程
- SpringBoot注解分析
- Makefile-filter和filter-out
- 1.1 c和c++关系
- CDA 数据分析师 Level1 基本知识(4)--统计学原理
- java高性能rpc,企业级rpc,zk调度,负载均衡,泛化调用一体的rpc服务框架
- 【已解决】树莓派4B+ wifi无法连接(提示认证失败)
- 基于Hbase和SpringBoot的分布式HOS文件存储系统
- 关于 Delphi 中流的使用(9) 分割与合并文件的函数
- 宽德投资C++开发 一面(48min)
- OpenWorm项目
- MySQL添加可重复执行列
热门文章
- 一建管道工程122知识点_背诵的知识点是否边缘化?一建市政一本通+学霸笔记,教你只记重点...
- 数据结构大作业_大数据课程笔记
- json string 格式_python中json函数的用法
- 樊登读书分享ppt_樊登读书精华分享-《分手后,成为更好的自己》
- printf输出字符串_c语言入门 第十二章 字符串
- linux 停止jar 指令,Linux编辑启动、停止与重启springboot jar包脚本实例
- php redius,Linux下Redius的安装与部署详解
- java把map值放入vector_Thinking in java基础之集合框架
- mysql数据库kj_Python3.7和数据库MySQL 8.0.12 数据库SQLite3连接(三)
- android wear ios表盘,秒杀 Apple Watch,Android Wear 又有 17 款新表盘可以玩啦!