提供了一个复杂的不规则形状,绘制在 2D 表面(比如说画布)上。还以坐标的形式在画布上提供一个点(例如鼠标点击的坐标)。
如何确定该点是否位于所述对象的内部、边缘或外部。
为简单起见,让我们将边缘视为一个像素(点)宽。
为了简化问题并提出复杂程度,让我们考虑如下图所示的形状。
所以,总结一下:
- 具有给定坐标的点是否在形状内?
- 它在边缘吗?
- 还是在形状之外?
提供了一个复杂的不规则形状,绘制在 2D 表面(比如说画布)上。还以坐标的形式在画布上提供一个点(例如鼠标点击的坐标)。
如何确定该点是否位于所述对象的内部、边缘或外部。
为简单起见,让我们将边缘视为一个像素(点)宽。
为了简化问题并提出复杂程度,让我们考虑如下图所示的形状。
所以,总结一下:
一种可能的策略:
可以在一次图像扫描中同时评估点 2–4。
如果您想真正快速地做到这一点,您可以使用带有评估片段着色器的 OpenGL。但这涉及更多。
在matlab中
l = bwlabel( img, 4 ); % label white regions using 4-connect neighbors
[or oc] = find( (l == 0) & imdilate( l == 1, strel('disk',1,0) ) ); % outer boundary
[ir ic] = find( (l == 0) & imdilate( l == 2, strel('disk',1,0) ) ); % inner boundary
我在这里发布了一些洪水填充算法。希望这能有所帮助。
我没有尝试,但尝试通过以下方式进行伪边缘检测:
filter=[0 -1 0 ; -1 4 -1 ; 0 -1 0];
newImage=conv2(yourImage,filter);
它假设只(或主要)保留外部和内部的egdes。之后,如果您执行 yourImage-newImage,您将获得不是边缘的对象的内部像素。
我认为它可以完成一些工作,以进一步解决您的问题。