如何用增加的半径填充圆?

时间:2011-03-17 09:14:49

标签: algorithm image image-processing geometry

作为更复杂算法的一部分,我需要遵循:

  • 假设我在离散网格(图像)上绘制了半径为R1的圆(下图中的绿色)
  • 我想画一个半径R2大于R1的圆圈,一个像素(下图中的红色)。
  • 在每个算法步骤中绘制半径增加的圆圈,每次我都有一个实心圆圈。

enter image description here

如何在每个步骤中找到要填写的点数,以便在每个步骤结束时我已完全归档?

我考虑过一些圆光栅化算法,但这会导致填充方面出现一些空白。另一种方法是使用一些数学形态学操作,如扩张,但这似乎在计算上是昂贵的。

我一般都在寻找在任意形状上执行此操作的方法,但最初的圆形算法就足够了。

3 个答案:

答案 0 :(得分:2)

您最好的选择是绘制并填充稍大的红色圆圈,然后绘制并填充绿色圆圈。然后重做下一次迭代。

仅绘制1px边框非常棘手。您的样本图像甚至不是很一致。在某些地方,白色像素与绿色像素对角地出现,而在其他地方,像素为红色。

编辑:

  • borderPixels = emptySet
  • 对于每个绿色像素, p
    • 对于每个邻居 n p
      • 如果 n 为白色
        • n 添加到* borderPixels`
  • 使用 borderPixels 做任何你喜欢的事情(例如将它们涂成红色)

答案 1 :(得分:2)

我目前的圈子解决方案。

基于众所周知的Midpoint circle algorithm

  • 为R1半径(浅绿色像素)
  • 创建1个八分圆的点集
  • 为R2半径(深橙色像素)
  • 创建1个八分圆的点集
  • 对于图像中的每一行,比较橙色和绿色像素的X坐标,并获得0或1(或其他)中间像素数(浅橙色)。
  • 重复每个八分圆(对于某些八分圆柱而不是行必须进行比较)

该算法可应用于其他类型的参数形状(例如基于贝塞尔曲线)

对于具有中心对称性(圆形)的核的非参数形状(基于像素)图像卷积(膨胀)。换句话说,对于形状中的每个像素寻找具有小半径的圆的邻居并将它们设置为该组的一部分。 (昂贵的计算)

enter image description here

答案 2 :(得分:1)

另一种选择是绘制一个带有2像素宽的红色边框的圆/形状,然后绘制一个带有无边框的绿色实心圆/形状。哪个应该留下 大约 1px宽边。 这取决于您使用的技术如何将线条分解为像素。

圆形算法往往针对绘制圆圈进行优化..... See the link here