【问题标题】:Efficient way to fill a convex shape填充凸形的有效方法
【发布时间】:2012-04-01 02:02:06
【问题描述】:

假设我有一个封闭的形状,如下图所示,我有边缘像素。填充形状的最有效方法是什么,即在以下情况下将像素“打开”在形状内:

1) 我有所有的边缘像素

2) 我拥有大部分边缘像素,而不是全部(如图所示)。

【问题讨论】:

    标签: c++ graphics opencv visualization computational-geometry


    【解决方案1】:

    构造凸包并添加缺失的像素。然后使用扫描线算法填充多边形。

    【讨论】:

      【解决方案2】:

      标准的flood fill 算法在凸形上非常有效,并且可以处理凸形不如预期的情况。不幸的是,它需要一个完整的轮廓。

      【讨论】:

        【解决方案3】:

        这一切都取决于情况。

        如果您手动创建帧缓冲区(基本上使用字节数组或类似的东西),您必须遍历所有要更改的像素。因此,例如,从一行的最左边开始:

        • 在行上查找形状的开始
        • 右跳并打开像素,直到找到行(或行尾)形状的第二个末端
        • 下一行继续

        这当然只有在您拥有所有边缘像素时才有效。看看Marching Squares,可以帮到你。

        请说得更具体一些。 “填充形状的最有效方法”取决于您的底层渲染库,如果它是光栅图形等等......

        编辑 注意,如果可以生成边缘像素,算法会快很多,那么就不需要寻找边缘的起点了。

        【讨论】:

          【解决方案4】:
          1. 如果单词“inside”,边界中断会破坏其含义。
          2. 像人类视网膜这样的神经网络在执行此处理方面非常有效。
          3. 在计算机上,您需要花时间来定义“内部”的含义。差距有多大?边界有多曲折?
          4. 模拟一个较大的圆形虫子在“内部”周围弹跳 - 太大而无法穿过间隙,但小于边界的最小曲率半径????

          【讨论】:

          • 我喜欢“错误”的想法。您也可以在外部运行它以提供超出间隙的第二个边界,然后用另一种方法填充内部。
          【解决方案5】:

          在填充物体的内部之前,您需要确定确切的边界,在这种情况下,这将构成识别圆。

          之后,您只需检查每个像素的圆圈周围的框,如果它确实在其中。由于您必须对圆内的每个像素进行处理,并且圆中的像素数与边界正方形的像素数成线性关系(假设边界正方形的边的长度为“半径 * 常数”以表示某个常数),这个应该接近最优。

          【讨论】:

            猜你喜欢
            • 2011-04-14
            • 1970-01-01
            • 2019-09-03
            • 2021-06-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多