给定一个图像,一个像素点和一个以像素为单位的半径。如何找到它创建的圆形边框的像素坐标

Posted

技术标签:

【中文标题】给定一个图像,一个像素点和一个以像素为单位的半径。如何找到它创建的圆形边框的像素坐标【英文标题】:Given a image, a pixel point and a radious in pixels. How do I find the pixel coordenate of the circle border it creates 【发布时间】:2022-01-07 17:41:43 【问题描述】:

给定一个图像矩阵,我想找到以中心 (x,y) 为中心的给定圆的边界中所有点/像素的像素点坐标,其中 x 和 y 是整数,半径为 r,其中 r 也是一个整数。考虑到边框是 1 像素厚。只有这个外边缘是我需要找到的。我遇到了麻烦,因为我只有整数可以使用。我尝试了曼哈顿距离,但它给了我一个旋转 45 度的正方形。我真的不知道如何前进

【问题讨论】:

【参考方案1】:

假设中心是原点(如果不是,您可以轻松翻译),您所追求的是由定义的区域的轮廓

x² + y² - r² ≤ 0.

对于给定的 x,这是验证约束的最大 y。换句话说,

x² + y² - r² ≤ 0 < x² + (y+1)² - r² = x² + y² - r² + 2y + 1.

现在如果你增加 x,

(x+1)² + y² - r² = x² + y² - r² + 2x + 1 ≤ 0 < (x+1)² + (y+1)² = x² + y² - r² + 2x + 2y + 2

可能会变为 false,您需要通过递减来调整 y。

这就是圆增量算法的精髓。您保持 x² + y² - r² 更新并逐个单元地进行 x、y 调整。这仅涉及整数算术。事实上,只有加法、减法和比较!由于坐标每次最多变化一个,曲线将是连续的。

我没有提到一点复杂性,这意味着八种不同的情况:x 和 y 可能需要递增或递减,x 可以比 y 变化得更快,反之亦然。这些对应于平面在八个主要八分圆中的分解。

【讨论】:

【参考方案2】:

我看到了你的最后一个问题,看来你需要扩大圈子。

请注意,简单地绘制圆周像素可能会产生小的空白区域。绘制半径为 1,2,...,n 的圆示例:

但是你可以完成像 Bresenham 那样的整数圆绘制算法。

逐一增加r值。在第一个八分圆中使用 Bresenham 算法生成像素坐标序列。如果像素尚未填充(从另一个单元格中心),则绘制像素,并检查下部像素是否已填充 - 如果没有,则绘制它以删除空白空间。对 7 个对称像素及其相邻像素执行相同操作(第二个八分圆的底部,依此类推)

【讨论】:

我明白了,对于上半部分,我只需要检查下面的像素以确保所有像素都被绘制了吗?这样我就不需要跑遍整个内圈了,对吧? 如果目的是画一个粗圆(一个实心圆环),这是一个XY问题。绘制几个增加半径的圆不是首选方法。 Bresenham 算法的大多数已知实现生成一个八分圆的圆,其他部分可能由反射产生。您生成点和点以下,并检查主八分圆和所有反射坐标。 @Yves Daoust Previous question 是关于增加区域 我编辑了它,但我希望这些区域以循环方式增加。所以这解决了我想要的。英语不是我的第一语言,所以我可能在上一个问题中表达错误

以上是关于给定一个图像,一个像素点和一个以像素为单位的半径。如何找到它创建的圆形边框的像素坐标的主要内容,如果未能解决你的问题,请参考以下文章

R确定图像宽度和高度(以像素为单位)

如何在mapkit中以像素为单位获取米?

iOS:以像素为单位获取显示的图像大小

如何将 vh 中给定的元素的高度转换为像素?

Android 背景图像大小(以像素为单位)

如何测量图像中每个极点的长度(以像素为单位)