从Java图像中提取多边形区域像素

时间:2019-03-14 07:16:36

标签: java image image-processing computational-geometry

我有一个浮动图像存储在一个浮动2d数组中。

有一个GUI(以灰度显示)。只需单击鼠标,我就可以准确地指向并显示像素的原始值。

现在,给定图像上的点列表,即多边形(也许是凹面),我想挑选出多边形内部的像素。

这就是我的想法。

  1. 使用修改后的Bresenham的线描算法创建多边形。将每个扫描行的 edge 点标记并存储在HashMap<ScanPoint, List<EdgePoint>> HashMapList
  2. 确定向内弯曲的点(内角> 180度)。 (将它们两次添加到HashMapList中,以便可以使用它们)
  3. 使用扫描线多边形填充算法挑选出所有内部点。

现在,我对第二点有疑问。我无法区分下图 Polygon1 在这里,我必须在HashMapList中添加两次“凹入”点才能完成任务。因为它正在创建两个单独的区域(一个结束,另一个在 same 点开始。)

和下图 Polygon2 我不需要在HashMapList中添加两次,因为它不会创建单独的区域。

如何区分这两个像素/点?


Java中是否有任何库可以处理图像上的几何图形? JTS在纯几何上工作,并且坐标点处于浮动状态,这不是很有用。 图片中的像素具有整数坐标。

1 个答案:

答案 0 :(得分:1)

您想要实现的是精确的扫描线多边形填充(SLPF)算法。正如您在发布的这两张图片中所看到的,唯一的区别是形状的方向。屏幕空间。但是内角是形状的一个固有特征,与空间在全局坐标中的放置方式无关。

如果可以从给定的多边形拐角点查询相邻拐角点,请检查两个相邻点是在当前点之下还是在当前点之上,或者检查两条边的最大Y或最小Y是否相同。