我怎样才能从这个图像中提取这个明显的事件?

How can I extract this obvious event from this image?

编辑:我找到了解决方案 :D 感谢您的帮助。

我创建了一个图像处理算法,可以从数据中提取这张图像。它很复杂,所以我不会详细介绍,但是这个图像本质上是一个巨大的 numpy 数组(它可视化 angular 对象像素强度的依赖性)。

我想写一个自动判断曲线何时切换方向的程序。我有数据,也有这张图片,但事实证明,用其中任何一个做一些有意义的事情都很棘手。阈值化失败,因为存在不同背景颜色的条带。出于同样的原因,Sobel 算子和 Hough 变换也不能很好地工作。

当这种切换发生时,人类很容易看到,但告诉计算机就没那么容易了。有小费吗?谢谢!

编辑:谢谢大家,在与结果的一般高斯卷积和骨架化之后,我现在正在为该图像拟合线条。任何关于这样做的指示将不胜感激:)

您可以采用连续列的加权点积来获得更易于处理的一维信号。您也许可以使用此信号提取模式:

import numpy as np
A = np.loadtxt("img.txt")
N = A.shape[0]
L = np.logspace(1,2,N)
X = []
for c0,c1 in zip(A.T, A.T[1:]):
    x = c0.dot(c1*L) / (np.linalg.norm(c0)*np.linalg.norm(c1))
    X.append(x)

X = np.array(X)

import pylab as plt

plt.matshow(A,alpha=.5)
plt.plot(X*3-X.mean(),'k',lw=2)
plt.axis('tight')
plt.show()

这绝对不是对问题的完整回答,而是一个有用的观察,但太长了,无法发表评论。如果出现更好的答案,我会删除。

为了检测尖端位置或转折点,您可以尝试在原始图像(不是骨架化图像)上使用角检测器。作为角检测器,结构张量可能是适用的。结构张量对于计算图像中的局部方向也很有用。

在 Mark McCurry 的帮助下,我取得了不错的成绩。

第 1 步:加载原始图像。通过从自身中减去每个垂直列的中值来移除背景。

no_background=[]
for i in range(num_frames):
    no_background.append(orig[:,i]-np.median(orig,1))
no_background=np.array(no_background).T

第 2 步:将负值更改为 0。

clipped_background = no_background.clip(min=0)

第 3 步:提取一维信号。取垂直列的加权和,将列中的最大强度与其位置相关联。

def exp_func(x):
    return np.dot(np.arange(len(x)), np.power(x, 10))/(np.sum(np.power(x, 10)))

weighted_sum = np.apply_along_axis(exp_func,0, clipped_background)

第四步:对一维信号求导。

conv = np.convolve([-1.,1],weighted_sum, mode='same')
pl.plot(conv)

第 5 步:确定导数何时改变符号。

signs=np.sign(conv)
pl.plot(signs)
pl.ylim(-1.2,1.2)

第 6 步:对上述信号应用中值滤波器。

filtered_signs=median_filter(signs, 5) #pick window size based on result. second arg and odd number.
pl.plot(filtered_signs)
pl.ylim(-1.2,1.2)

第 7 步:找到符号切换时的索引(帧位置)。绘图结果。

def sign_switch(oneDarray):
    inds=[]
    for ind in range(len(oneDarray)-1):
        if (oneDarray[ind]<0 and oneDarray[ind+1]>0) or (oneDarray[ind]>0 and oneDarray[ind+1]<0):
            inds.append(ind)
    return np.array(inds)

switched_frames = sign_switch(filtered_signs)