在我之前关于在每个爪子中发现脚趾的问题之后,我开始加载其他测量值以查看它将如何保持.不幸的是,我很快就遇到了上述步骤之一的问题:识别爪子.
你看,我的概念证明基本上是随着时间推移每个传感器的最大压力,并开始寻找每一行的总和,直到它找到!= 0.0.然后它对列进行相同的操作,一旦找到超过2行,再次为零.它将最小和最大行和列值存储到某个索引.
正如您在图中所看到的,这在大多数情况下都能很好地工作.但是,这种方法有许多缺点(除了非常原始):
人类可以拥有"空心脚",这意味着足迹内部有几排空行.因为我担心这种情况也会发生在(大)狗身上,所以在切断爪子之前,我等待至少2或3个空行.
如果在到达多个空行之前在另一列中创建另一个联系,则会产生问题,从而扩展该区域.我想我可以比较列,看看它们是否超过某个值,它们必须是单独的爪子.
当狗很小或走得更快时,问题会变得更糟.发生的事情是,前爪的脚趾仍在接触,而后爪的脚趾刚刚开始与前爪在同一区域内接触!
使用我的简单脚本,它将无法拆分这两个,因为它必须确定该区域的哪些帧属于哪个爪子,而目前我只需要查看所有帧的最大值.
它开始出错的例子:
所以现在我正在寻找一种更好的识别和分离爪子的方法(之后我将解决决定它是哪个爪子的问题!).
更新:
我一直在修补Joe的(真棒!)答案,但是我很难从我的文件中提取实际的爪子数据.
当应用于最大压力图像时,coded_paws显示了所有不同的爪子(见上文).但是,解决方案遍历每个帧(以分隔重叠的爪子)并设置四个Rectangle属性,例如坐标或高度/宽度.
我无法弄清楚如何获取这些属性并将它们存储在一些我可以应用于测量数据的变量中.因为我需要知道每个爪子,它在哪个框架中的位置是什么,并将它连接到哪个爪子(前/后,左/右).
那么如何使用Rectangles属性为每个爪子提取这些值呢?
我在我的公共Dropbox文件夹中的问题设置中使用了测量值(示例1,示例2,示例3).对于任何有兴趣的人我也建立了一个博客,让你保持最新:-)
更新:迄今为止 表现最佳的算法就是这个算法.
该问题探讨了用于检测实时时间序列数据中的突然峰值的稳健算法.
请考虑以下数据集:
p = [1 1 1.1 1 0.9 1 1 1.1 1 0.9 1 1.1 1 1 0.9 1 1 1.1 1 1 1 1 1.1 0.9 1 1.1 1 1 0.9 1, ...
1.1 1 1 1.1 1 0.8 0.9 1 1.2 0.9 1 1 1.1 1.2 1 1.5 1 3 2 5 3 2 1 1 1 0.9 1 1 3, ...
2.6 4 3 3.2 2 1 1 0.8 4 4 …
Run Code Online (Sandbox Code Playgroud) language-agnostic algorithm signal-processing time-series data-analysis
我在以前的问题上有一些非常棒的帮助来检测爪子内的爪子和脚趾,但所有这些解决方案一次只能用于一次测量.
现在我有数据包含:
显然将所有内容都放在一个大对象上并不会削减它,所以我认为我需要使用类而不是当前的大量函数.但即使我已经阅读了学习Python关于类的章节,我也无法将其应用于我自己的代码(GitHub链接)
我还觉得每次想要获取一些信息时处理所有数据都很奇怪.一旦我知道每只爪子的位置,我就没有理由再次计算它.此外,我想比较同一只狗的所有爪子,以确定哪个接触属于哪个爪子(前/后,左/右).如果我继续只使用功能,这将变得一团糟.
所以现在我正在寻找关于如何创建类的建议,让我以合理的方式处理我的数据(链接到一条狗的压缩数据).
我可以通过查找一阶导数或其他东西的零交叉来自己编写一些东西,但它似乎是一个通用的函数,可以包含在标准库中.谁知道一个?
我的特定应用是2D阵列,但通常它将用于在FFT等中查找峰值.
具体而言,在这些类型的问题中,存在多个强峰,然后是许多较小的"峰值",这些"峰值"仅由应该忽略的噪声引起.这只是例子; 不是我的实际数据:
一维峰值:
二维峰值:
峰值寻找算法将找到这些峰值的位置(不仅仅是它们的值),理想情况下会找到真正的样本间峰值,而不仅仅是具有最大值的索引,可能使用二次插值等.
通常,您只关心一些强峰,因此它们要么被选中,要么是因为它们高于某个阈值,要么是因为它们是有序列表的前n个峰值,按振幅排列.
正如我所说,我知道如何自己写这样的东西.我只是问是否有一个已知的功能或包已知可以正常工作.
更新:
我翻译了一个MATLAB脚本,它适用于1-D案例,但可能更好.
更新更新:
sixtenbe 为1-D案例创造了更好的版本.
在我之前的问题中,我得到了一个很好的答案,帮助我检测到爪子撞到压板的位置,但现在我正在努力将这些结果与相应的爪子联系起来:
我手动注释了爪子(RF =右前方,RH =右后方,LF =左前方,LH =左后方).
正如您所看到的那样,显然有一种重复的模式,它几乎在每次测量中都会出现.这是一个手动注释的6个试验的演示链接.
我最初的想法是使用启发式方法进行排序,例如:
但是,我对我的启发式方法持怀疑态度,因为一旦遇到我没想过的变化,他们就会对我失败.他们也无法应对可能有自己规则的跛脚犬的测量结果.
此外,Joe提出的注释有时会搞砸,并没有考虑到爪子的实际外观.
基于我在关于爪子内峰值检测的问题上收到的答案,我希望有更先进的解决方案来对爪子进行分类.特别是因为每个单独的爪子的压力分布和其进展是不同的,几乎像指纹.我希望有一种方法可以使用它来聚集我的爪子,而不是按照发生的顺序对它们进行排序.
所以我正在寻找一种更好的方法来用相应的爪子对结果进行排序.
对于接受挑战的任何人,我挑选了一个包含所有切片阵列的字典,其中包含每个爪子的压力数据(通过测量捆绑)和描述其位置的切片(板上和时间上的位置).
为了澄清:walk_sliced_data是一个包含['ser_3','ser_2','sel_1','sel_2','ser_1','sel_3']的字典,它们是测量的名称.每个测量包含另一个字典,[0,1,2,3,4,5,6,7,8,9,10](例如来自'sel_1'),表示提取的影响.
另请注意,可以忽略"假"影响,例如部分测量爪子的位置(空间或时间).它们只是有用,因为它们可以帮助识别模式,但不会被分析.
对于任何有兴趣的人,我都会在博客上保留有关该项目的所有更新!
from PIL import Image
import numpy as np
from scipy.ndimage.filters import maximum_filter
import pylab
# the picture (256 * 256 pixels) contains bright spots of which I wanna get positions
# problem: data has high background around value 900 - 1000
im = Image.open('slice0000.png')
data = np.array(im)
# as far as I understand, data == maximum_filter gives True-value for pixels
# being the brightest in their neighborhood (here 10 * 10 pixels)
maxima = (data == maximum_filter(data,10))
# How can …
Run Code Online (Sandbox Code Playgroud) 在我之前的问题中,很多用户希望我给玩具提供更多数据.所以我开始导出所有数据并用Python处理它,但后来我意识到:我在哪里留下所有这些数据?
好吧我决定最好将它们放在数据库中,所以至少我不必每次都解析原始文件.但由于我对数据库一无所知,因此结果令人困惑.我尝试了一些教程来创建一个sqlite数据库,添加一个表和字段并尝试插入我的numpy.arrays,但它无法让它工作.
通常我的每条狗的结果看起来像这样:
所以我有35只不同的狗,每只狗有24个测量值.每个测量本身都有未知数量的联系人.每个测量由3D阵列(整个板的248帧[255x63])和2D阵列(板的每个传感器的最大值[255x63])组成.在数据库中存储一个值不是问题,但在那里获取我的2D数组似乎不起作用.
所以我的问题是如何在数据库中订购并将数组插入其中?
我试图python
尽可能接近返回图像中最明显聚类的中心,如下图所示:
在我之前的问题中,我问过如何获得二维数组的全局最大值和局部最大值,并且给出的答案完美无缺.问题在于我可以通过平均使用不同的bin大小获得的全局最大值得到的中心估计总是稍微偏离我用眼睛设置的那个,因为我只考虑最大的bin而不是一组最大的bin (就像一个人的眼睛).
我尝试将这个问题的答案适应我的问题,但事实证明我的图像太嘈杂,无法使算法工作.这是我实现该答案的代码:
import numpy as np
from scipy.ndimage.filters import maximum_filter
from scipy.ndimage.morphology import generate_binary_structure, binary_erosion
import matplotlib.pyplot as pp
from os import getcwd
from os.path import join, realpath, dirname
# Save path to dir where this code exists.
mypath = realpath(join(getcwd(), dirname(__file__)))
myfile = 'data_file.dat'
x, y = np.loadtxt(join(mypath,myfile), usecols=(1, 2), unpack=True)
xmin, xmax = min(x), …
Run Code Online (Sandbox Code Playgroud) 假设我在NumPy中有一个包含连续可微函数评估的数组,我想找到局部最小值.没有噪音,所以每个点的值低于其所有邻居的值都符合我的局部最小值的标准.
我有以下列表理解,适用于二维数组,忽略边界上的潜在最小值:
import numpy as N
def local_minima(array2d):
local_minima = [ index
for index in N.ndindex(array2d.shape)
if index[0] > 0
if index[1] > 0
if index[0] < array2d.shape[0] - 1
if index[1] < array2d.shape[1] - 1
if array2d[index] < array2d[index[0] - 1, index[1] - 1]
if array2d[index] < array2d[index[0] - 1, index[1]]
if array2d[index] < array2d[index[0] - 1, index[1] + 1]
if array2d[index] < array2d[index[0], index[1] - 1]
if array2d[index] < array2d[index[0], index[1] + 1]
if array2d[index] < array2d[index[0] + …
Run Code Online (Sandbox Code Playgroud) 目前,如果我想比较狗的每只爪子下的压力,我只比较每个脚趾下面的压力.但我想尝试比较整个爪子下面的压力.
但要做到这一点,我必须旋转它们,所以脚趾重叠(更好).因为大多数时候左右爪子都在外面略微旋转,所以如果你不能简单地将一个爪子放在另一个上面.因此,我想旋转爪子,所以它们都以相同的方式对齐.
目前,我通过使用脚趾检测查找两个中间脚趾和后脚趾来计算旋转角度,然后计算黄线(脚趾绿色和红色之间的轴)和绿色线(中性轴)之间的角度. .
现在我想旋转阵列将围绕后脚趾旋转,使黄色和绿色线对齐.但是我该怎么做?
请注意,虽然这个图像只是2D(只有每个传感器的最大值),但我想在3D阵列上计算(平均10x10x50).我的角度计算的另一个缺点是它对脚趾检测非常敏感,所以如果有人在数学上有更正确的计算方法,那我就是耳朵.
我看过一项关于人体压力测量的研究,他们使用局部几何惯性轴方法,至少非常可靠.但这仍然无法解释如何旋转阵列!
如果有人觉得需要进行实验,这里有一个包含所有切片阵列的文件,其中包含每个爪子的压力数据.为了澄清:walk_sliced_data是一个包含['ser_3','ser_2','sel_1','sel_2','ser_1','sel_3']的字典,它们是测量的名称.每个测量包含另一个字典,[0,1,2,3,4,5,6,7,8,9,10](例如来自'sel_1'),表示提取的影响.
python ×9
numpy ×4
scipy ×2
algorithm ×1
class-design ×1
fft ×1
image ×1
matplotlib ×1
oop ×1
time-series ×1