有无限种可能性(或特殊情况下的值为1或0)。可以使用直接方法在常数时间内计算出解决方案。不需要近似或迭代方法来找到给定函数的根。这只是纯数学。
高斯核具有有趣的对称性。其中之一是当峰值被平移到
(0,0)
时的旋转不变性。另一个是2D高斯表面的1D截面是高斯曲线。
暂时忽略
offset
:它实际上并没有改变问题(它只是Z轴平移),并且为分辨率添加了额外的无用项。
几何解法是一个椭圆,因此解决方案
(xe,ye)
遵循共轭表达式:
(xe-x0)² / a² + (ye-y0)² / b² = 1
。如果
sigma_x=sigma_y
,那么解决方案更简单:这是一个带有表达式
(xe-x0)² + (ye-y0)² = r
的圆。请注意,
a
,
b
和
r
取决于所搜索的值和内核参数(例如
sigma_x
)。更改
sigma_x
和
sigma_y
就像拉伸空间一样,因此解决方案也类似地改变。更改
x0
和
y0
就像平移空间一样,因此解决方案也是如此。
实际上,我们可以解决更简单的情况,其中
x0=0
,
y0=0
,
sigma_x=1
和
sigma_y=1
。然后,我们可以应用一个翻译,然后使用转换矩阵进行线性变换。基本的4x4矩阵可以做到这一点。解决更简单的情况要容易得多,因为需要考虑的参数较少。实际上,
g0
和
offset
也可以部分丢弃
f
,因为它在表达式的两侧,并且只需解决线性方程
offset + g0 * h(xe,ye) = g0 / e
,因此
h(x,y) = 1 / e - offset / g0
,其中
h(xe, ye) = exp(-(xe² + ye²)/2)
。假设我们暂时忘记了翻译和线性变换,那么问题可以很容易地解决:
h(xe, ye) = 1 / e - offset / g0
exp(-(xe² + ye²)/2) = 1 / e - offset / g0
-(xe² + ye²)/2 = ln(1 / e - offset / g0)
xe² + ye² = -2 * ln(1 / e - offset / g0)
我们得到了圆的表达式,其中半径r
是-2*ln(1 / e - offset / g0)
!请注意,表达式中的ln
基本上是自然对数。
现在我们可以尝试找出4x4矩阵系数,或者直接尝试解决完整表达式,这最终并不那么困难。
offset + g0 * exp(-((x-x0)²/(2*sigma_x²) + (y-y0)²/(2*sigma_y²))) = g0 / e
exp(-((x-x0)²/(2*sigma_x²) + (y-y0)²/(2*sigma_y²))) = 1 / e - offset / g0
-((x-x0)²/(2*sigma_x²) + (y-y0)²/(2*sigma_y²)) = ln(1 / e - offset / g0)
((x-x0)²/sigma_x² + (y-y0)²/sigma_y²)/2 = -ln(1 / e - offset / g0)
(x-x0)²/sigma_x² + (y-y0)²/sigma_y² = -2 * ln(1 / e - offset / g0)
我们得到了椭圆的表达式,其中r = -2 * ln(1 / e - offset / g0)
是一个常数,a = sigma_x
和b = sigma_y
是上述表达式中的未知参数。它可以使用a = sigma_x/sqrt(r)
和b = sigma_y/sqrt(r)
进行归一化,以便右侧完全符合上述表达式,但这只是一些数学细节。
您可以轻松找到椭圆的一个点,因为您知道椭圆的中心(x0, y0)
,并且至少有一点在线y=y0
与上述椭圆表达式的交点处。让我们找到它:
(x-x0)²/sigma_x² + (y0-y0)²/sigma_y² = -2 * ln(1 / e - offset / g0)
(x-x0)²/sigma_x² = -2 * ln(1 / e - offset / g0)
(x-x0)² = -2 * ln(1 / e - offset / g0) * sigma_x²
x = sqrt(-2 * ln(1 / e - offset / g0) * sigma_x²) + x0
请注意,有两个解 (-sqrt(...) + x0
),但只需要其中一个。我希望在计算中没有犯任何错误(至少细节足以轻松找到)并且解决方案在您的情况下不是复数。此解决方案的好处是它非常快速地计算。
最终解决方案是:
(xe, ye) = (sqrt(-2*ln(1/e-offset/g0)*sigma_x²)+x0, y0)
f(x,y)
应该是(offset+g₀)/e
还是offset+g₀/e
? - chrslg