0

提供了一个复杂的不规则形状,绘制在 2D 表面(比如说画布)上。还以坐标的形式在画布上提供一个点(例如鼠标点击的坐标)。

如何确定该点是否位于所述对象的内部、边缘或外部。

为简单起见,让我们将边缘视为一个像素(点)宽。

为了简化问题并提出复杂程度,让我们考虑如下图所示的形状。

在此处输入图像描述

所以,总结一下:

  1. 具有给定坐标的点是否在形状内?
  2. 它在边缘吗?
  3. 还是在形状之外?
4

4 回答 4

3

一种可能的策略:

  1. 将外部填充成某种颜色,比如红色。
  2. 任何接触红色像素的黑色像素都是外部边界像素。
  3. 任何接触白色像素的黑色像素都是内部边界像素。
  4. 所有其他黑色像素都在对象内部。

可以在一次图像扫描中同时评估点 2–4。

如果您想真正快速地做到这一点,您可以使用带有评估片段着色器的 OpenGL。但这涉及更多。

于 2013-06-30T10:05:04.307 回答
1

在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
于 2013-06-30T10:40:51.753 回答
0

我在这里发布了一些洪水填充算法。希望这能有所帮助。

于 2013-06-30T10:45:20.340 回答
0

我没有尝试,但尝试通过以下方式进行伪边缘检测:

filter=[0 -1 0 ; -1 4 -1 ; 0 -1 0];
newImage=conv2(yourImage,filter);

它假设只(或主要)保留外部和内部的egdes。之后,如果您执行 yourImage-newImage,您将获得不是边缘的对象的内部像素。

我认为它可以完成一些工作,以进一步解决您的问题。

于 2013-06-30T11:59:19.303 回答