使用Python PILLOW的虚线

时间:2018-08-18 12:16:00

标签: python python-imaging-library

如何使用Python PILLOW绘制虚线或虚线或矩形。谁能帮我?使用openCV我可以做到这一点。但我想要使用枕头。

3 个答案:

答案 0 :(得分:1)

我决定写出我在评论中建议的想法-即用实线绘制形状,然后叠加阈值的噪点图像以消除部分线条。

我将所有噪声都放在较小的图像上,然后按比例放大,以使噪声“更结实” ,而不是微小的斑点。

这只是测试图像的生成:

#!/usr/local/bin/python3

import numpy as np
from PIL import Image, ImageDraw

# Make empty black image
im = Image.new('L', (640,480))

# Draw white rectangle and ellipse
draw = ImageDraw.Draw(im)
draw.rectangle([20,20,620,460],outline=255)
draw.ellipse([100,100,540,380],outline=255)

这将生成噪声叠加层并将其叠加-您只需删除此句子并将两个代码块合并在一起即可:

# Make noisy overlay, 1/4 the size, threshold at 50%, scale up to full-size
noise = np.random.randint(0,256,(120,160),dtype=np.uint8)
noise = (noise>128)*255
noiseim = Image.fromarray(noise.astype(np.uint8))
noiseim = noiseim.resize((640,480), resample=Image.NEAREST)

# Paste the noise in, but only allowing the white shape outlines to be affected
im.paste(noiseim,mask=im)
im.save('result.png')

结果是这样的:

enter image description here

固体绘制的图像是这样的:

enter image description here

噪音是这样的:

enter image description here

答案 1 :(得分:1)

由于@martineau的评论,我弄清楚了如何绘制虚线。这是我的代码。

cur_x = 0
cur_y = 0
image_width = 600
for x in range(cur_x, image_width, 4):
    draw.line([(x, cur_y), (x + 2, cur_y)], fill=(170, 170, 170))

这将绘制一条灰色虚线。

答案 2 :(得分:0)

以下函数绘制一条虚线。它可能很慢,但是可以用,我需要它。

“破折号”是破折号的长度,以像素为单位。 -- “比率”是空白空间与短划线长度的比率(值越大,获得的空白空间越多)

import math # math has the fastest sqrt

def linedashed(x0, y0, x1, y1, dashlen=4, ratio=3): 
    dx=x1-x0 # delta x
    dy=y1-y0 # delta y
    # check whether we can avoid sqrt
    if dy==0: len=dx
    elif dx==0: len=dy
    else: len=math.sqrt(dx*dx+dy*dy) # length of line
    xa=dx/len # x add for 1px line length
    ya=dy/len # y add for 1px line length
    step=dashlen*ratio # step to the next dash
    a0=0
    while a0<len:
        a1=a0+dashlen
        if a1>len: a1=len
        draw.line((x0+xa*a0, y0+ya*a0, x0+xa*a1, y0+ya*a1), fill = (0,0,0))
        a0+=step