我想要绘制一个与 Photoshop 的椭圆工具完全相同的实心圆(精确到像素)。
我不想实现任何抗锯齿,所以我的问题可以被视为循环二进制掩码生成问题。实现相同的圆一开始似乎相当简单,但是,我现在已经实现了 5 种以上不同的圆绘制算法,但没有一个能够完全匹配 Photoshop 的圆生成。
我使用 Python 进行算法编程,使用 numpy 进行数组操作,使用 OpenCV 进行圆形绘制实现/洪水填充,使用 Scikit-Image 进行图像保存功能。我将问题表述为一个函数,该函数在给定图像上绘制给定半径和 x,y 位置的圆,并返回一个在其上绘制圆的新图像。
我已经编程/使用了以下圆形绘制实现:
这些算法在两种不同的场景中进行了测试:一个半径为 10 像素的小圆和一个半径为 257 像素的大圆。小圆圈用于比较更明显的视觉差异,而大圆圈用于针对 Photoshop 中生成的相同半径的圆计算误差度量。
以下是这些测试的结果:
上述六种算法被指示在 40x40px 图像的中心绘制一个 10px 半径的圆。为了便于比较,我将所有结果合并起来。

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

朴素毕达哥拉斯学派:

开放式CV:

布雷森纳姆:

中点:

算术圈:
本实施例中对参数进行了优化。