嘈杂图像中的长边界检测

2024-09-29 03:29:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

即便如此,我仍然无法提取出任何有意义的边界-当我试图对图像进行边缘检测时,图像会陷入噪声中,而这些噪声会被阈值分割大大放大-边界检测算法在很大程度上依赖于导数的计算,因此,二值图像中的急剧变换确实会影响它们的性能,但我认为这是必要的,因为没有其他方法能够区分边界。在

有没有什么方法可以强制局部Otsu阈值在特定的全局阈值下使噪声变平,或者让一种边界提取算法忽略看起来像这样的东西?在

enter image description here

或者最好写一个基于局部Otsu阈值的替换,它只在返回类似于线的模式时应用阈值?在

任何帮助,找到正确的方法,以获得相关的边界是感激的。在


Tags: 方法图像算法情况阈值局部scikit噪声
2条回答

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

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

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

这是一个很好的萨夫曼-泰勒不稳定性;)

格伦是对的,你可能需要在检测边缘之前做一些滤波(梯度对噪声非常敏感)。因为你要检测边缘,你需要尝试一个边缘保持去噪滤波器。以下是一些示例:

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()

denoised image and Canny edges

你得多玩一会儿才能把这件事做好。我还尝试从边缘图像中过滤出一些小线段;也许,一些几何特性会有帮助:

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

祝你好运!在

相关问题 更多 >