Python中具有抗锯齿的光栅化算法

Posted

技术标签:

【中文标题】Python中具有抗锯齿的光栅化算法【英文标题】:Rasterization algorithms with anti-aliasing in Python 【发布时间】:2022-01-22 14:15:06 【问题描述】:

我有矢量图形。 (在我的第一种情况下,它是epigraph of a function,它的公式是给定的。所以它是一个轮廓由parametric curve 给出的形状。)

我想用anti-aliasingrasterize 这张图片。所以我想要光栅图形,即一个 numpy 数组。我想以低级别的方式获得这个数组,避免使用用于带有绘图轴等的面向对象的交互式 GUI 可视化的库。我只想要一个数组。做类似Y,X=np.ogrid(...) 然后picture = Y>f(X) 的唯一问题是它没有抗锯齿。 (请注意,模糊二进制图片比一个好的专用抗锯齿算法更糟糕。)如何在 Python 中使用抗锯齿进行光栅化,而不需要任何过度杀伤的以 GUI 为中心的库?

【问题讨论】:

考虑查找一些教程、论文和文档。你试图避免的图书馆可能有关于这个主题的有价值的信息。例如,您还可以在不触发 UI 的情况下将 matplotlib 图形生成为图像。 @MadPhysicist 我猜你的意思是matplotlib backends。也许matplotlib 的一些低级部分可以调用,它们甚至没有考虑绘制anything (like spines) 的开销,除了图像本身,而不是考虑它并决定隐藏它左右。 【参考方案1】:

如果曲线由隐式方程 F(x,y)=0 给出,则计算每个像素四个角处的函数值。如果符号相同,则像素完全在外部或内部。如果符号不同,由角和沿边缘的点形成的多边形内函数消失的区域(仅通过线性插值找到这些)会告诉您背景色和前景色的混合(alpha 混合系数)。

追踪多边形并不难:遍历正方形的四个边,并按照遇到它们的顺序保持正顶点和零点。你会从三角形变成六边形。面积由鞋带公式求得。


参数函数的情况有点困难。您需要找到曲线与网格线的交点,并在遍历的所有单元格中执行面积估计。为此,将曲线绘制为多段线(这称为展平),然后将多段线用水平线切割,然后再用垂直线切割。

【讨论】:

谢谢!有没有这样做的图书馆?使用库是可以的,而不是像考虑绘制 extra stuff such as spines and labels 然后决定隐藏它的选项那样有不必要的开销。 @root:在这种情况下,我会使用大脑而不是图书馆。

以上是关于Python中具有抗锯齿的光栅化算法的主要内容,如果未能解决你的问题,请参考以下文章

C#制作不规则窗体,如何使边缘平滑(抗锯齿)?

谷歌地图GroundOverlays默认情况下是不是具有抗锯齿功能?

Metal2剖析:抗锯齿之基于Imageblock特性的增强MSAA

CGContextClip 抗锯齿问题

OpenGL核心技术之抗锯齿

Pixelart 的抗锯齿算法