我有一张噪声非常大的灰度图像,其中噪声水平沿一个轴调制。在该图像中,可能有一条宽度未知的非常微弱的线。我希望能够识别这条线何时出现在图像中。我想要的应用程序需要自动化。
以下代码可用于生成两个综合示例。
back
的情节,一个极端的例子。
back2
的情节,一个不太极端的例子。
import numpy as np
def background(N, M, nl, nf, nT, r):
a = nf*np.sin((2*np.pi/nT)*np.arange(N))
a=a.reshape(-1,1)
fuzz = nl + a*np.ones((N,M))
fuzz+= r*a*np.random.normal(size=(N,M))
return fuzz
def add_slider(B, s, v, w, a, r):
N, M = B.shape
amps = a+r*np.random.normal(size=M)
x=np.arange(N)
for i, y in enumerate(range(s, N, v)):
if i >= M: break
B[:,i]+=amps[i]*np.exp(-(x-y)**2/(2*w**2))
def subtracted(im):
return im - im.mean(1).reshape(-1, 1)
B = background(1000, 300, 0, 5, 100, 1)
add_slider(B, 0, 2, 40, 1, 1)
back = subtracted(B)
# For a less extreme example:
B2 = gs.background(1000, 300, 0, 5, 100, 1)
gs.add_slider(B2, 0, 2, 40, 5, 1)
back2 = subtracted(B2)
我尝试了很多方法,但是当我更改一些用于生成图像的参数时,它们都不能很好地工作。例如,我尝试过应用高斯模糊,有时会起作用,但获得正确的宽度可能会非常棘手,并且当线条更加垂直时,它会很困难。我也尝试过像这篇文章中那样的旋转面罩,但它似乎受到调制噪声水平的阻碍。我还对氡气变换做了一些实验,但我也找不到任何一致的东西。像 Canny 这样的大多数标准边缘检测方法似乎都不起作用,因为它们往往依赖于局部梯度,而局部梯度会被噪声完全破坏。
我已经对这个主题的论文进行了一些有限的搜索,但我还没有找到任何适合这个问题的内容。如果可能的话,我想找到一个不依赖于对线条了解太多的解决方案,比如它的厚度。