Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 在高度贴图中查找边_Opencv_Image Processing_Image Recognition_Edge Detection_Heightmap - Fatal编程技术网

Opencv 在高度贴图中查找边

Opencv 在高度贴图中查找边,opencv,image-processing,image-recognition,edge-detection,heightmap,Opencv,Image Processing,Image Recognition,Edge Detection,Heightmap,我想在heightmap图像中找到锐利的边,而忽略浅边 OpenCV提供了多种在2d图像中查找边缘的方法: 但是,所有这些方法都是通过比较边缘两侧的强度值来工作的。 如果2D图像表示3D对象的高度贴图,则会导致一些奇怪的行为 在高度贴图中,给定X/Y坐标下3D对象的高度表示为该X/Y坐标下2D像素的强度: 在上图中,在边缘B处,左右两侧的强度变化很小,即使它是一个锐角 在边缘A,边缘左侧和右侧的像素之间的强度有很大的变化,即使它只是一个浅角度 因此,对于Canny或Sobel来说,没有一个阈值可

我想在heightmap图像中找到锐利的边,而忽略浅边

OpenCV提供了多种在2d图像中查找边缘的方法:

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

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

在上图中,在边缘B处,左右两侧的强度变化很小,即使它是一个锐角

在边缘A,边缘左侧和右侧的像素之间的强度有很大的变化,即使它只是一个浅角度

因此,对于Canny或Sobel来说,没有一个阈值可以保留锐利的边缘,但过滤浅薄的边缘

在上面的示例中,边B的一侧具有上升坡度,另一侧具有下降坡度。我可以过滤这个功能;但这也会去除边缘C和D

如何获得仅包含某个角度以上边缘的二值边缘图像?e、 g.边B、C和D,但不是A


或者,如何获得梯度导数图像,其中每个像素的强度与该像素处边缘的角度成比例?

对于此任务,您可能希望使用二阶导数而不是一阶导数

这是我的直觉:在你的例子中,在等距网格上的每个位置对高度-强度进行导数,与采样点之间或采样点处的曲面坡度的arctan成正比,如果你使用双面导数近似。但是,由于您想要检测锐利的边缘,因此您需要在采样点处寻找斜率的导数。这意味着您可以设置arctan导数和强度导数的阈值,以实现您的目标,幸运的是,无需深入:


你必须格外小心地获取你将得到的坡度角的导数-根据坐标系,你可能会遇到角度差的模糊性,从一个角度到另一个角度有两种方法,这在一般情况下是不同的;你在找短一点的。您可以寻找可能的解决方案

如果我正确理解您的问题,您需要的基本上是一个具有高强度值的角落。 如果是这样的话,那么寻找哈里斯角点检测器,它将帮助你找到在两个方向上梯度变化大的点。


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

我有一个非常简单的方法,我是在读博客文章时遇到的

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

下限:最大0,1.0-0.33*v 上限:最小255,1.0+0.33*v 现在将这两个值作为参数传递到cv2.Canny函数中


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

您可以明确检查角度。