小编Bri*_*erk的帖子

像 Photoshop 的椭圆工具一样绘制圆形

问题

我想要绘制一个与 Photoshop 的椭圆工具完全相同的实心圆(精确到像素)。

我不想实现任何抗锯齿,所以我的问题可以被视为循环二进制掩码生成问题。实现相同的圆一开始似乎相当简单,但是,我现在已经实现了 5 种以上不同的圆绘制算法,但没有一个能够完全匹配 Photoshop 的圆生成。


尝试的解决方案

我使用 Python 进行算法编程,使用 numpy 进行数组操作,使用 OpenCV 进行圆形绘制实现/洪水填充,使用 Scikit-Image 进行图像保存功能。我将问题表述为一个函数,该函数在给定图像上绘制给定半径和 x,y 位置的圆,并返回一个在其上绘制圆的新图像。

我已经编程/使用了以下圆形绘制实现:

  1. 朴素毕达哥拉斯方法
  2. OpenCV 的圈子
  3. 布雷森纳姆圆环
  4. 算术圈
  5. 安德烈斯圈子

测试解决方案

这些算法在两种不同的场景中进行了测试:一个半径为 10 像素的小圆和一个半径为 257 像素的大圆。小圆圈用于比较更明显的视觉差异,而大圆圈用于针对 Photoshop 中生成的相同半径的圆计算误差度量。

以下是这些测试的结果:

小圆圈测试

上述六种算法被指示在 40x40px 图像的中心绘制一个 10px 半径的圆。为了便于比较,我将所有结果合并起来。

结果

  • 蓝色圆圈是真实的、图形化的圆圈,已缩放以适合 20 像素的直径。

大圆圈测试

上述六种算法被指示在 2370x1770px 图像的中心绘制一个 257px 半径的圆。将每个算法生成的圆从 Photoshop 中绘制的 257 像素半径圆中减去,以获得差值。

作为参考,在 Photoshop 中生成的圆如下:

这里

朴素毕达哥拉斯学派:

  • 像素差异:1082
  • 差异结果图像:

结果

开放式CV:

  • 像素差异:724
  • 差异结果图像:

结果

布雷森纳姆:

  • 像素差异:251
  • 差异结果图像:

结果

中点:

  • 像素差异:224
  • 差异图像:

结果

算术圈:

本实施例中对参数进行了优化。

  • 像素差异(未经优化): …

python algorithm geometry drawing pixel

5
推荐指数
0
解决办法
338
查看次数

标签 统计

algorithm ×1

drawing ×1

geometry ×1

pixel ×1

python ×1