2016-02-21 105 views
2

我從SciKit-Image找到了這個函數,它可以讓普通或反鋸齒的線條畫成一個numpy數組。也有創建多邊形的選項,但這些不是反鋸齒的如何在SciPy中繪製粗糙的反鋸齒線?

由於沒有繪製粗線(寬度大於一個像素)的函數,所以我考慮繪製一個多邊形,在邊上也考慮了線,具有抗鋸齒效果。但我認爲這不是最好的解決方案。

這就是爲什麼我想問一下,如果有更好的選擇將粗糙的反鋸齒行繪製成一個numpy數組(可能使用matplotlib或某物)?

回答

2

使用PIL,您可以antialias by supersampling。例如,

import numpy as np 
from PIL import Image 
from PIL import ImageDraw 

scale = 2 
width, height = 300, 200 

img = Image.new('L', (width, height), 0) 
draw = ImageDraw.Draw(img) 
draw.line([(50, 50), (250, 150)], fill=255, width=10) 
img = img.resize((width//scale, height//scale), Image.ANTIALIAS) 
img.save('/tmp/antialiased.png') 
antialiased = np.asarray(img) 
print(antialiased[25:35, 25:35]) 
# [[252 251 250 255 255 237 127 18 0 0] 
# [255 251 253 254 251 255 255 237 127 18] 
# [184 255 255 254 252 254 251 255 255 237] 
# [ 0 72 184 255 255 254 252 254 251 255] 
# [ 1 0 0 72 184 255 255 254 252 254] 
# [ 0 3 1 0 0 72 184 255 255 254] 
# [ 0 0 0 3 1 0 0 72 184 255] 
# [ 0 0 0 0 0 3 1 0 0 72] 
# [ 0 0 0 0 0 0 0 3 1 0] 
# [ 0 0 0 0 0 0 0 0 0 3]] 

img = Image.new('L', (width//scale, height//scale), 0) 
draw = ImageDraw.Draw(img) 
draw.line([(25, 25), (125, 75)], fill=255, width=5) 
img.save('/tmp/aliased.png') 
aliased = np.asarray(img) 
print(aliased[25:35, 25:35]) 
# [[255 255 255 255 255 255 255 0 0 0] 
# [255 255 255 255 255 255 255 255 255 0] 
# [255 255 255 255 255 255 255 255 255 255] 
# [ 0 0 255 255 255 255 255 255 255 255] 
# [ 0 0 0 0 255 255 255 255 255 255] 
# [ 0 0 0 0 0 0 255 255 255 255] 
# [ 0 0 0 0 0 0 0 0 255 255] 
# [ 0 0 0 0 0 0 0 0 0 0] 
# [ 0 0 0 0 0 0 0 0 0 0] 
# [ 0 0 0 0 0 0 0 0 0 0]] 

antialiased.png:

enter image description here

aliased.png

enter image description here