我正在尝试从相当嘈杂的图像中提取单个长边界(原谅绿色,图像在任何情况下都会转换为灰度)。我已经尝试运行各种边缘检测和阈值算法来提取边界。我到目前为止最接近的是使用与scikit-image捆绑的本地Otsu阈值:
即便如此,我仍然无法提取任何有意义的边界 - 当我尝试在图像上使用边缘检测时,它会被噪声所吸引,这会被阈值处理大幅放大 - 边界检测算法是如此严重依赖于计算导数,因此二进制图像中的急剧转换确实会损害它们的性能,但我认为这是必要的,因为根本没有其他方法能够区分边界。
是否有某种方法可以强制局部Otsu阈值使特定全局阈值下的噪声变平,或者让其中一个边界提取算法忽略看起来像的东西?
或者最好是根据当地的Otsu阈值来编写替换,只有当它返回类似于线的模式时才应用阈值?
任何寻求获得相关边界的正确方法的帮助都表示赞赏。
答案 0 :(得分:3)
这是一个很好的Saffman-Taylor不稳定你到那里;)
格伦是对的,你可能想在尝试检测边缘之前做一些过滤(渐变往往对噪音非常敏感)。由于您正在检测边缘,因此您需要尝试使用边缘保留去噪滤波器。以下是一些例子:
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()
你需要玩很多才能做到这一点。我也尝试过滤边缘图像中的小线段;也许,一些几何属性会对此有所帮助:
http://scikit-image.org/docs/dev/auto_examples/plot_regionprops.html
祝你好运!答案 1 :(得分:0)
通常,在存在噪声的情况下处理检测的最佳方法是首先降低噪声。
使用各种降噪操作对图像进行预滤波可能有助于改善边界检测算法的行为。常见(简单)降噪方法是空间模糊或中值滤波。但是,如果您知道噪声存在于特定频率范围内,则频域陷波滤波器通常也很有用。
诀窍是减少噪音而不破坏你想要找到的边界。根据图像内容,这通常是一个反复试验的过程。