Python / Numpy中的扫描线填充算法

时间:2014-02-20 22:07:05

标签: python image-processing numpy

我有4个角坐标(四边形)的数千个多边形,并希望将它们转换为光栅表示为numpy 2d数组。 存在许多网格化算法,如流行的扫描线填充图形。 (请参阅http://www.cs.rit.edu/~icss571/filling/how_to.htmlhttp://cs.uvm.edu/~rsnapp/teaching/cs274/lectures/scanlinefill.pdf

Octave在poly2mask函数中实现了这一点(例如http://octave.sourceforge.net/image/function/poly2mask.html)。

Numpy也有类似的功能吗? 我仍然没有详细了解这些算法是如何工作的,因此,如果你能给我一些关于如何有效地在Python / Numpy中实现它的提示,我将非常感激。

或者出于速度原因在CPython(我也不熟悉)编写它会更好吗?

2 个答案:

答案 0 :(得分:7)

在scipy生态系统中有一些不同的功能(无序):

1)最广泛使用的选项是使用matplotlib的points_inside_poly。但是,填充规则网格非常不理想(即它是多边形测试中的显式点,而不是“扫描线”方法)。

2)mahotas实现了一个效率很高的fill_polygon函数:http://mahotas.readthedocs.org/en/latest/polygon.html#drawing

3)skimage(scikits-image)实现了一个draw.polygon函数,该函数应该至少同样有效,如果不是更有效的话:http://scikit-image.org/docs/dev/api/skimage.draw.html#skimage.draw.polygon

4)最后,您还可以使用PIL并将图像转换为numpy数组。看一下ImageDraw模块:http://effbot.org/imagingbook/imagedraw.htm

总的来说,我建议安装skimage并使用它。这是一个非常有用的库。但是,如果由于某种原因无法安装scikits图像,则其他选项应该有所帮助。

答案 1 :(得分:1)

OpenCV项目还具有多边形填充功能:cv2.fillPoly