如何从此图像中提取此明显事件?

awa*_*lll 5 python statistics signal-processing numpy image-processing

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

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

我想写一个程序,它自动确定曲线何时切换方向.我有数据,我也有这个图像,但事实证明,做一些有意义的事情是非常棘手的.阈值处理失败,因为存在不同背景颜色的条带.由于同样的原因,Sobel算子和Hough变换也不能很好地工作.

人们很容易看到这种切换何时发生,但不容易告诉计算机.有小费吗?谢谢!

整蛊!

编辑:谢谢大家,我现在正在使用结果的一般高斯和骨架化进行卷积后为这个图像拟合线条.任何关于这样做的指针将不胜感激:)

骷髅!

awa*_*lll 2

在 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
Run Code Online (Sandbox Code Playgroud)

减去中位数。

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

clipped_background = no_background.clip(min=0)
Run Code Online (Sandbox Code Playgroud)

修剪负值。

步骤 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)
Run Code Online (Sandbox Code Playgroud)

信号

步骤 4:对一维信号求导。

conv = np.convolve([-1.,1],weighted_sum, mode='same')
pl.plot(conv)
Run Code Online (Sandbox Code Playgroud)

一维导数

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

signs=np.sign(conv)
pl.plot(signs)
pl.ylim(-1.2,1.2)
Run Code Online (Sandbox Code Playgroud)

卷积

步骤 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)
Run Code Online (Sandbox Code Playgroud)

中值滤波器

步骤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)
Run Code Online (Sandbox Code Playgroud)

最后结果