如何填充半径增大的圆?

问题描述 投票:0回答:4

作为更复杂算法的一部分,我需要以下内容:

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

enter image description here

如何找到每一步要填充的点,以便在每一步结束时我都完全归档了圆圈?

我正在考虑一些圆形光栅化算法,但这会导致填充时出现一些空白。另一种方法是使用一些数学形态学运算,例如膨胀,但这似乎在计算上很昂贵。

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

algorithm image image-processing geometry
4个回答
3
投票

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

只绘制 1px 边框是相当棘手的。您的示例图像甚至不太一致。在某些地方,白色像素出现在绿色像素的对角线上,而在其他地方,该像素为红色。

编辑:

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

3
投票

我目前的圆形解决方案。

基于众所周知的中点圆算法

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

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

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

enter image description here


2
投票

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

圆形算法往往针对绘制圆形进行优化......请参阅此处的链接


0
投票

绘制半径为 1, 3, 5, 7, 9, ... 的圆,并根据需要填充它们之间的空间,或绘制所有半径 1, 2, 3, 4, 5, ... 并填充孔适当的时间与到中心的距离成正比。

这两种方法都需要提前绘制下一个半径圆并在下一步中使用它。

© www.soinside.com 2019 - 2024. All rights reserved.