gpt4 book ai didi

python - 建议在沙盘上检测直线,python

转载 作者:行者123 更新时间:2023-12-02 16:49:42 25 4
gpt4 key购买 nike

我正在做一个需要在一块沙子上检测线条的项目。线条是由用户手工绘制的,因此并非完全“笔直”(见图)。而且由于沙子,线条很难区分。
enter image description here

我尝试了OpenCV的cv2.HoughLines,但未取得良好的效果。那么对检测方法有什么建议吗?欢迎提出改进线条清晰度的建议。我正在考虑在平板周围放一些led灯。

谢谢

最佳答案

检测方法在很大程度上取决于您需要多少通用性:曝光和对比度会从一幅图像变为另一幅图像吗?典型的线宽会改变吗?在下文中,我假设此类参数对于您的应用程序不会有太大变化,如果我输入错了,请更正我。

我将使用scikit-image,这是用于Python的常见图像处理包。如果您不熟悉此软件包,可以在http://scikit-image.org/上找到文档,并且该软件包与Scientific Python的所有安装 bundle 在一起。但是,我使用的算法在其他工具(例如opencv)中也可用。

我的解决方案写在下面。基本上,原理是

首先,

  • 去噪图像。经过去噪步骤后,生活通常会更简单。在这里,我使用了总变化滤波器,因为它会产生分段恒定的图像,使阈值变得更容易。我使用形态侵 eclipse (在灰度图像上)增强了黑暗区域。
  • 然后
  • 应用一个自适应阈值,该阈值在空间上会局部变化,因为对比度会在整个图像中变化。此操作将生成二进制图像。
  • 侵 eclipse 二进制图像以破坏区域之间的虚假链接,并仅保留较大的区域。
  • 计算区域伸长率的度量,以仅保留最伸长的区域。在这里,我使用惯性张量的特征值之比。

  • 最难调整的参数是自适应阈值的块大小,以及要保留的最小区域大小。我还对降噪后的图像(skimage.filters.canny)尝试了Canny过滤器,结果相当不错,但是边缘并不总是封闭的,您可能还想尝试一种边缘检测方法,例如Canny过滤器。

    结果如下所示:
    result image
    # Import modules
    import numpy as np
    from skimage import io, measure, morphology, restoration, filters
    from skimage import img_as_float
    import matplotlib.pyplot as plt

    # Open the image
    im = io.imread('sand_lines.png')
    im = img_as_float(im)

    # Denoising
    tv = restoration.denoise_tv_chambolle(im, weight=0.4)
    ero = morphology.erosion(tv, morphology.disk(5))

    # Threshold the image
    binary = filters.threshold_adaptive(ero, 181)

    # Clean the binary image
    binary = morphology.binary_dilation(binary, morphology.disk(8))
    clean = morphology.remove_small_objects(np.logical_not(binary), 4000)
    labels = measure.label(clean, background=0) + 1

    # Keep only elongated regions
    props = measure.regionprops(labels)
    eigvals = np.array([prop.inertia_tensor_eigvals for prop in props])
    eigvals_ratio = eigvals[:, 1] / eigvals[:, 0]
    eigvals_ratio = np.concatenate(([0], eigvals_ratio))
    color_regions = eigvals_ratio[labels]

    # Plot the result
    plt.figure()
    plt.imshow(color_regions, cmap='spectral')

    关于python - 建议在沙盘上检测直线,python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32566344/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com