在具有可变背景噪声的非常嘈杂的图像中找到一条微弱的线

问题描述 投票:0回答:1

我有一张噪声非常大的灰度图像,其中噪声水平沿一个轴调制。在该图像中,可能有一条宽度未知的非常微弱的线。我希望能够识别这条线何时出现在图像中。我想要的应用程序需要自动化。

以下代码可用于生成两个综合示例。

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 这样的大多数标准边缘检测方法似乎都不起作用,因为它们往往依赖于局部梯度,而局部梯度会被噪声完全破坏。

我已经对这个主题的论文进行了一些有限的搜索,但我还没有找到任何适合这个问题的内容。如果可能的话,我想找到一个不依赖于对线条了解太多的解决方案,比如它的厚度。

python image-processing computer-vision edge-detection straight-line-detection
1个回答
0
投票

我手边没有 OpenCV,但可以使用 ImageMagick 获得相当合理的结果,如果该技术看起来可以满足您的需求,可以很容易地将其移植到 OpenCV。

基本上,我正在计算每个像素位置处 3px 宽 x 30px 高的盒子的平均值,并对结果进行对比度拉伸。这是你的模糊图像:

magick input.png -statistic mean 3x30 -auto-level result.png

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.