求含旋转参数θ的二维平顶高斯分布拟合公式
我需要一个带旋转参数θ的二维平顶高斯分布(2D flat-top Gaussian distribution)公式。
问题背景:
我有示例数据图像,尝试为这些数据拟合函数,最初采用了旋转二维高斯分布的拟合公式:
sigx2 = sigma_x**2 sigy2 = sigma_y**2 a = np.cos(theta)**2/(2*sigx2) + np.sin(theta)**2/(2*sigy2) b = np.sin(theta)**2/(2*sigx2) + np.cos(theta)**2/(2*sigy2) c = np.sin(2*theta)/(4*sigx2) - np.sin(2*theta)/(4*sigy2) expo = -a*(x-x0)**2 - b*(y-y0)**2 - 2*c*(x-x0)*(y-y0) g = offset + A*np.exp(expo)
但普通二维高斯分布的陡峭度不足,我需要更接近圆润、平缓的均匀分布形态。找到的平顶高斯分布公式如下:
$$f(x,y)=A\exp\left(-\left(\frac{\left(x-x_0\right)}{2\sigma2_X}\right){P_X}-\left(\frac{\left(y-y_0\right)}{2\sigma2_Y}\right){P_Y}\right)$$
我认为该公式适用,但不知如何将旋转参数θ融入其中,使其支持旋转。能否帮忙修改原有公式以实现平顶分布,或是在该平顶高斯公式中加入旋转参数θ?
要实现带旋转的二维平顶高斯分布,核心是先对坐标做旋转变换,再代入平顶高斯公式,具体步骤如下:
1. 坐标旋转变换逻辑
先将原始坐标$(x,y)$转换为以$(x_0,y_0)$为中心、旋转θ角后的局部坐标$(u,v)$,把旋转后的分布轴对齐到局部坐标系的u、v轴:
$$
\begin{cases}
u = (x - x_0)\cos\theta + (y - y_0)\sin\theta \
v = -(x - x_0)\sin\theta + (y - y_0)\cos\theta
\end{cases}
$$
2. 带旋转的平顶高斯公式
将变换后的$(u,v)$代入平顶高斯公式,得到最终带旋转的版本:
$$
f(x,y) = \text{offset} + A\exp\left(
-\left( \frac{u}{2\sigma_X^2} \right)^{P_X}
-\left( \frac{v}{2\sigma_Y^2} \right)^{P_Y}
\right)
$$
参数说明:
- $P_X、P_Y$:平顶控制参数,值越大顶部越平坦($P=2$时退化为普通二维高斯)
- $\theta$:旋转角度,控制分布的朝向
- $\sigma_X、\sigma_Y$:两个轴方向的尺度参数
- $x_0、y_0$:分布中心,$A$为振幅,$\text{offset}$为基线偏移
3. 对应的Python实现代码
基于numpy的可直接用于拟合的代码:
import numpy as np def rotated_flat_top_gaussian(x, y, x0, y0, sigma_x, sigma_y, theta, Px, Py, A, offset): # 坐标旋转变换 u = (x - x0) * np.cos(theta) + (y - y0) * np.sin(theta) v = -(x - x0) * np.sin(theta) + (y - y0) * np.cos(theta) # 计算平顶高斯指数项 term_u = (u / (2 * sigma_x**2)) ** Px term_v = (v / (2 * sigma_y**2)) ** Py expo = -(term_u + term_v) return offset + A * np.exp(expo)
关键提示
- 旋转变换是线性操作,不会改变平顶分布的核心形态,仅调整朝向
- 若需要对称平顶分布,可设置$P_X=P_Y$,减少拟合参数数量
- 拟合时建议先固定$P$的初始值(比如4~8,根据数据平坦度调整),再优化其他参数,提升拟合稳定性
内容的提问来源于stack exchange,提问作者jlipinski

