在高度图中查找边

时间:2017-02-05 09:50:53

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

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

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

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

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

enter image description here

在上图中,在边缘B,强度在左侧和右侧之间仅略微变化,即使它是一个尖角。

在边缘A处,边缘左侧和右侧像素之间的强度发生了很大变化,即使它只是一个很小的角度。

所以没有Canny或Sobel的门槛可以保留锋利的边缘但是过滤浅边缘。

(在上面的例子中,边B的一边有一个上升的斜率,一边有一个下降的斜率。我可以过滤这个特征;但那会删除边C 1}}和D以及

如何获得二进制边缘图像,仅包含特定角度以上的边缘? (例如边BC和{{1} },但不是D

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

3 个答案:

答案 0 :(得分:0)

可能你会想要使用二阶导数而不是第一导数来完成这项任务。

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

你需要特别小心地采用"倾斜角度的衍生物"您将获得 - 根据坐标系您可能会遇到角度差异的模糊性(从一个角度到另一个角度有两种方式,一般情况下是不同的;您正在寻找& #34;更短"一个)。您可以查找可能的解决方案here

答案 1 :(得分:0)

我有一个相当简单的方法,我遇到了阅读博客文章。

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

  • 降低max(0, (1.0 - 0.33) * v)
  • 上方min(255, (1.0 + 0.33) * v)

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

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

答案 2 :(得分:-1)

如果我正确理解你的问题,"你所需要的基本上是一个具有高强度值的角落"。 如果是这样,那就找Harris角点探测器,它可以帮助你找到两个方向都有高梯度变化的点。 http://docs.opencv.org/2.4/doc/tutorials/features2d/trackingmotion/harris_detector/harris_detector.html

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