二维高斯曲面拟合法求取光斑中心
(1)二维高斯去曲面拟合推导
一个二维高斯方程可以写成如下形式:
其中,G为高斯分布的幅值,,为x,y方向上的标准差,对式(1)两边取对数,并展开平方项,整理后为:
假如参与拟合的数据点有N个,则将这个N个数据点写成矩阵的形式为:A = B C,
其中:
A为N1的向量,其元素为:
B为N5的矩阵:
C为一个由高斯参数组成的向量:
(2)求解二维高斯曲线拟合
N个数据点误差的列向量为:E=A-BC,用最小二乘法拟合,使其N个数据点的均方差最小,即:
在图像数据处理时,数据量比较大,为减小计算量,将矩阵B进行QR分解,即:B=QR,分解后Q为一个NN的正交矩阵,R为一个N5的上三角矩阵,对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 ...
最新文章
- 数据库之子查询四(多重,表复制)
- Andriod anim alpha中的属性介绍
- 有哪些事,是你做了领导后才明白的?
- 使用CSS属性处理前端开发中长文本造成的内容显示重叠问题
- zlib库compress和uncompress函数的使用方法
- Gridview SummaryItem 格式化数字
- 论文浅尝 - AAAI2021 | 从历史中学习:利用时间感知拷贝生成网络建模时态知识图谱...
- 移动web时代已开启:腾讯X5内核浏览服务
- SSM之SpringMVC框架
- ES(Elasticsearch)解除索引只读限制
- 空气污染扩散模型-高斯烟羽烟团模型原理及GIS应用示例
- wireshark抓取分析UDP数据包
- imageAI基本使用
- 【转】让ubuntu自带词典可以本地查…
- 学习了pr后的收获_pr学习心得(入门篇)
- 如何查看端口是否开启
- 探讨:Mac真的有必要安装双系统吗
- 51单片机多线程神器:Tiny-51操作系统
- 无效的m3u8怎么办_你还在为m3u8文件如何转换而发愁?看了我就有答案了
- 文章收录技巧(怎么提升网站伪原创文章的收录)