光斑图、阵列图、灰度图圆形等目标中心定位方法。分享高斯拟合法和更为简单的中心、重心法MATLAB代码,以及基于Eigen库的高斯拟合法C代码。互助互助
by HPC_ZY
一、基本原理
大多数光斑其明暗分布情况都是中心最亮,往四周慢慢变暗,就类似二维高斯模型(如下图)。所以我们利用二维高斯模型去拟合光斑,从而得到光斑中心等参数。
由于本人不是数学大佬,就不推导数学公式了,直接上代码。
MATLAB版本
三种方法都需要提供一个叫mask的矩阵,它是一个二值图像,描述的是被判定而光斑的像素。务必提供争取或你认为对的mask,中心只会在mask的范围内搜索。
- 高斯拟合法
% 输入:原始灰度图像,光斑二值蒙版
% 输出:中心坐标
function coor = gausscenter(im,mask)
% 连通域
[label,num] = bwlabel(mask);
% 计算
coor = zeros(num,2);
for n = 1:num
[x,y] = find(label==n);
% 生成计算矩阵
m_iN = length(x);
tmp_A = zeros(m_iN,1);
tmp_B = zeros(m_iN,5);
for k = 1:m_iN
pSrc = im(x(k),y(k));
if pSrc>0
tmp_A(k) = pSrc*log(pSrc);
end
tmp_B(k,1) = pSrc ;
tmp_B(k,2) = pSrc*x(k);
tmp_B(k,3) = pSrc*y(k);
tmp_B(k,4) = pSrc*x(k)*x(k);
tmp_B(k,5) = pSrc*y(k)*y(k);
end
% QR分解
Vector_A = tmp_A;
matrix_B = tmp_B;
[Q,R] = qr(matrix_B);
% 求解中心
S = Q'*Vector_A;
S = S(1:5);
R1 = R(1:5,1:5);
C = R1\S;
coor(n,:) = [-0.5*C(2)