我想在高度图图像中找到锐边,而忽略浅边。
OpenCV提供了多种方法来查找二维图像中的边缘:Canny,Sobel,etc。
然而,所有这些方法都是通过比较边缘两侧的强度值来实现的。 如果2D图像表示3D对象的高度图,则会导致一些奇怪的行为。
在高度贴图中,给定X / Y坐标处的3D对象的高度表示为该X / Y坐标处的2D像素的强度 :
在上图中,在边缘B
,强度在左侧和右侧之间仅略微变化,即使它是一个尖角。
在边缘A
处,边缘左侧和右侧像素之间的强度发生了很大变化,即使它只是一个很小的角度。
所以没有Canny或Sobel的门槛可以保留锋利的边缘但是过滤浅边缘。
(在上面的例子中,边B
的一边有一个上升的斜率,一边有一个下降的斜率。我可以过滤这个特征;但那会删除边C
1}}和D
以及
如何获得二进制边缘图像,仅包含特定角度以上的边缘? (例如边B
,C
和{{1} },但不是D
)
或者,我怎样才能得到一个梯度导数图像,每个像素的强度与该像素边缘的角度成正比?
答案 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
一旦检测到角落,您可以使用合适的阈值过滤高强度的角落。