3

我正在尝试从相当嘈杂的图像中提取单个长边界(请原谅绿色,无论如何图像都会转换为灰度)。我尝试运行各种边缘检测和阈值算法来提取边界。到目前为止,我得到的最接近的是使用与 scikit-image 捆绑的本地 Otsu 阈值:

即便如此,我仍然无法提取任何有意义的边界——当我尝试对图像使用边缘检测时,它会陷入噪声中,而噪声会被阈值处理大大放大——边界检测算法非常依赖于计算导数,因此二进制图像中的急剧过渡确实会损害它们的性能,但我认为这是必要的,因为根本没有其他方法能够区分边界。

是否有某种方法可以强制局部 Otsu 阈值在特定全局阈值下消除噪声,或者让其中一种边界提取算法忽略看起来像的东西?

在此处输入图像描述

还是最好根据本地 Otsu 阈值编写替换,仅在返回类似于线条的模式时应用阈值?

感谢您找到获得相关边界的正确方法的任何帮助。

4

2 回答 2

3

这是一个很好的 Saffman-Taylor 不稳定性;)

Glenn 是对的,您可能需要在尝试检测边缘之前进行一些过滤(梯度往往对噪声非常敏感)。由于您正在检测边缘,因此您需要尝试使用边缘保留去噪滤波器。这里有些例子:

http://scikit-image.org/docs/dev/auto_examples/plot_denoise.html

以下是过滤图像的快速尝试:

from skimage import io
from skimage import color
from skimage import filter
import matplotlib.pyplot as plt

image = color.rgb2gray(io.imread('4g1te.png'))
denoised = filter.denoise_tv_bregman(image, 1)
edges = filter.canny(denoised, 1, 0.01, 0.1)

fig, axes = plt.subplots(ncols=2)
axes[0].imshow(denoised)
axes[1].imshow(edges)
for ax in axes:
    ax.set_axis_off()
plt.show()

去噪图像和 Canny 边缘

你需要玩很多才能做到这一点。我也会尝试从边缘图像中过滤掉小的线段;也许,一些几何属性会对此有所帮助:

http://scikit-image.org/docs/dev/auto_examples/plot_regionprops.html

祝你好运!

于 2014-04-18T01:54:08.157 回答
0

通常,在存在噪声的情况下处理检测的最佳方法是首先降低噪声。

使用各种降噪操作对图像进行预过滤可能有助于改善边界检测算法的行为。常见的(简单)降噪方法是空间模糊或中值滤波。但是,如果您知道噪声存在于特定频率范围内,频域陷波滤波器通常也很有用。

诀窍是在不破坏您想要找到的边界的情况下减少噪音。根据图像内容,这通常是一个反复试验的过程。

于 2014-04-17T11:32:29.573 回答