代码之家  ›  专栏  ›  技术社区  ›  matousc

为什么PIL draw polygon不接受numpy数组?

  •  3
  • matousc  · 技术社区  · 7 年前

    此代码按预期工作:

    import numpy as np
    from PIL import Image, ImageDraw
    
    A = (
        (  2,  2),
        (  2, 302),
        ( 302, 302),
        ( 302,   2)
    )
    
    img = Image.new('L', (310, 310), 0)
    ImageDraw.Draw(img).polygon(A, outline=1, fill=1)
    mask = np.array(img)
    
    print(mask)
    

    但是,如果A矩阵作为numpy数组提供:

    A = np.array(
        [[  2,  2],
         [  2, 302],
         [302, 302],
         [302,   2]], dtype="int32"
    )
    

    它会产生完全错误的结果。我还尝试将A阵列展平,但这没有帮助。

    我错过什么了吗?我可以把numpy数组直接塞进PIL吗?

    1 回复  |  直到 7 年前
        1
  •  5
  •   user3666197    7 年前

    如果call interaface说使用元组列表或交错值列表,

    最好使用元组列表或交错值序列/列表:

    PIL.ImageDraw.ImageDraw.polygon( xy, fill = None, outline = None )
    绘制多边形。

    多边形轮廓由给定坐标之间的直线以及最后一个坐标和第一个坐标之间的直线组成。

    xy 顺序
    任何一个
    类2元组 [(x, y), (x, y), ...]

    数值,如 [x, y, x, y, ...]


    我能塞东西吗。。

    使用

    >>> xy
    array([[ 2,  3],
           [10,  3],
           [10,  0],
           [ 2,  0]])
    >>> xy.flatten().tolist()
    [ 2, 3, 10, 3, 10, 0, 2, 0 ]
    >>> 
    

    应工作并满足PIL记录的呼叫接口 ImageDraw.polygon()