我想在高度图图像中找到锋利的边缘,而忽略浅浅的边缘。
OpenCV提供了在2d图像中寻找边缘的多种方法:机智、索贝尔、等。
然而,所有这些方法都是通过比较边缘两侧的强度值来工作的。如果2D图像表示一个3D对象的高度图,那么这将导致一些奇怪的行为。
在高度图中,三维物体在给定X/Y坐标下的高度表示为该X/Y坐标下二维像素的强度:

在上面的图片中,在边缘B的强度变化只有轻微的左和右之间,尽管它是一个尖锐的角。
在边缘A,边缘的左侧像素和右侧像素之间的强度有很大的变化,尽管它只是一个浅角度。
因此,对于Canny或Sobel来说,没有阈值可以保留锋利的边缘,但可以过滤浅的边缘。
(在上面的示例中,边B有一个具有上升斜率的边,一个边有一个下降的斜面。我可以为这个特性过滤,但这也会去掉C和D的边缘)
如何才能得到一幅只包含一定角度以上边缘的二值边缘图像?(例如边缘B__、C__和D__,而不是A__)。
或者,我怎样才能得到梯度导数图像,其中每个像素的强度与该像素边缘的角度成正比?
发布于 2017-02-05 15:40:03
在这个任务中,您可能希望使用二阶导数而不是第一个。
这里是我的直觉:取高度的导数(在你的例子中是强度)在一个均匀间隔的网格上的每一个位置将成比例的表面斜率在取样点之间(或者在取样点,如果你使用一个双边导数近似)。但是,因为你想要检测尖锐的边缘-你是在寻找一个导数的斜率在取样点。这意味着您可以对强度导数的一个导数设置一个阈值,以达到您的目标(幸运的是,没有“需要深入研究”:)
你必须格外小心地取一个你将要得到的“斜角”的导数--取决于坐标系,你可能会遇到角度差的模糊性(从一个角度到另一个角度有两种不同的方法,这在一般情况下是不同的;你在寻找“较短的”角度)。您可以寻找可能的解决方案这里
发布于 2017-02-14 06:48:27
我有一个相当简单的方法,我偶然发现,我读了一篇博客文章。
它涉及到计算灰度图像的中值值。使用此值,我们现在可以设置两个阈值:
max(0, (1.0 - 0.33) * v)min(255, (1.0 + 0.33) * v)现在将这两个值作为参数传递到cv2.Canny()函数中。
现在,您将能够执行一个优化的边缘检测给任何图像。这个答案的关键取决于图像的中值,这个中值对于不同的图像是不同的。
发布于 2017-02-07 05:49:00
如果我正确理解你的问题,“你需要的基本上是一个高强度值的角落”。如果是这样的话,那就去找哈里斯角探测器,它可以帮助你找到两个方向都有高梯度变化的点。detector.html
一旦检测到角点,就可以使用合适的阈值过滤具有高强度的角点。
https://stackoverflow.com/questions/42050632
复制相似问题