【问题标题】:Finding edges in a height map在高度图中查找边缘
【发布时间】:2017-02-14 14:48:27
【问题描述】:

我想在高度图图像中找到锐边,同时忽略浅边。

OpenCV 提供了多种在二维图像中寻找边缘的方法:CannySobeletc

但是,所有这些方法都是通过比较边缘两侧的强度值来实现的。 如果 2D 图像表示 3D 对象的高度图,那么这会导致一些奇怪的行为。

在高度图中,3D 对象在给定 X/Y 坐标处的 高度 表示为该 X/Y 坐标处 2D 像素的强度

在上图中,边缘B 的强度在左侧和右侧之间仅略有变化,尽管它是一个尖角。

在边缘A处,边缘左侧和右侧的像素之间的强度变化很大,尽管只是一个浅角度。

因此对于 Canny 或 Sobel 来说,没有阈值可以保留锐边但过滤浅边。

(在上面的例子中,边 B 的一侧有上升坡度,一侧有下降坡度。我可以过滤这个特征;但这会删除边 CD 也是)

如何获得仅包含某个角度以上的边缘的二值边缘图像? (例如边缘BCD,但不包含@987654334 @)

或者,我怎样才能得到梯度导数图像,其中每个像素的强度与该像素的边缘角度成正比?

【问题讨论】:

  • 你可以明确检查角度。

标签: opencv image-processing image-recognition edge-detection heightmap


【解决方案1】:

您可能希望在此任务中使用二阶导数而不是一阶导数。

这是我的直觉:在均匀间隔的网格上的每个位置取高度(在您的情况下为强度)的导数将与采样点之间的表面斜率的反正切成正比(或 at 采样点,如果您使用 2 边导数近似)。但是由于您想检测锐利的边缘 - 您正在寻找采样点处的斜率导数。这意味着您可以为强度导数的反正切导数设置阈值以实现您的目标(幸运的是,没有“需要更深入”:))

您必须格外小心地对您将得到的“斜角”进行导数 - 根据坐标系,您可能会遇到角度差的模糊性(有两种方法可以从一个角度到达另一个角度) ,在一般情况下是不同的;您正在寻找“较短”的)。您可以寻找可能的解决方案here

【讨论】:

    【解决方案2】:

    我在阅读博客文章时发现了一个相当简单的方法。

    它涉及计算灰度图像的中值值。使用这个值,我们现在可以设置两个阈值:

    • max(0, (1.0 - 0.33) * v)
    • min(255, (1.0 + 0.33) * v)

    现在将这两个值作为参数传递给cv2.Canny() 函数。

    您现在可以在给定任何图像的情况下执行优化的边缘检测。这个答案的症结取决于不同图像的图像中值。

    【讨论】:

      【解决方案3】:

      如果我正确理解您的问题,“您需要的基本上是一个具有高强度值的角落”。 如果是这样,那么寻找哈里斯角检测器,它可以帮助您找到在两个方向上具有高梯度变化的点。 http://docs.opencv.org/2.4/doc/tutorials/features2d/trackingmotion/harris_detector/harris_detector.html

      一旦检测到角点,您可以使用合适的阈值过滤具有高强度的角点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多