如何将下面的三角函数转换成python函数来计算边界曲率?

How to convert the following trigonometric function into a python function for boundary curvature calculation?

我正在尝试理解这张 source

中的几张幻灯片

具体来说,幻灯片 59 中的这个示例:

我不明白的部分是如何从链码到曲率。

我相信幻灯片 56 中给出了公式:

但是如果我尝试在 python 中实现它,我会得到不同的结果。 例如:

import matplotlib.pyplot as plt
# Dataset
x = [0, 1, 2, 2, 3, 4, 5, 6, 6, 7, 8]
y = [0, 0, 0, 1, 1, 2, 2, 1, 0, 0, 0]
# Show data
plt.scatter(x, y)
plt.plot(x, y)
plt.axis('equal')
plt.show()

import math
i = 4  # Taking the 5th point, at index 4, with supposed curvature of 1 from the slide
k = 1
a = math.atan((y[i+k]-y[i])/(x[i+k]-x[i]))
b = math.atan((y[i]-y[i-k])/(x[i]-x[i-k]))
result = (a - b) % (2 * math.pi)  # = 0.7853981633974483

很明显我漏掉了什么,但是什么?

第一张图片中的“曲率”是两个后续“链码”之间的差异modulo 8。因此,例如对于链码0 0 2 0 1 0 7 6 0 0,曲率中的第 4 个条目是 1 -0 = 1 而第六个是 7-0 = 7 = -1 (mod 8)。在 Python 你可以这样计算:

>>> def mod8(x):
...     m = x % 8
...     return m if m < 4 else m - 8
... 
>>> cc = [0, 0, 2, 0, 1, 0, 7, 6, 0, 0]
>>> [mod8(a - b) for (a, b) in zip(cc[1:], cc[:-1])]
[0, 2, -2, 1, -1, -1, -1, 2, 0]

如果将此与使用 atan 的公式进行比较,该公式缺少的是将角度从弧度转换为 1 为 45 度的单位 (pi/4)。根据公式,您的结果 0.7853981633974483 是正确的,但如果您希望得到 1.0,则必须将结果除以 math.pi/4.