我有4个角坐标(四边形)的数千个多边形,并希望将它们转换为光栅表示为numpy 2d数组。 存在许多网格化算法,如流行的扫描线填充图形。 (请参阅http://www.cs.rit.edu/~icss571/filling/how_to.html或http://cs.uvm.edu/~rsnapp/teaching/cs274/lectures/scanlinefill.pdf)
Octave在poly2mask函数中实现了这一点(例如http://octave.sourceforge.net/image/function/poly2mask.html)。
Numpy也有类似的功能吗? 我仍然没有详细了解这些算法是如何工作的,因此,如果你能给我一些关于如何有效地在Python / Numpy中实现它的提示,我将非常感激。
或者出于速度原因在CPython(我也不熟悉)编写它会更好吗?
答案 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