如何使用PIL绘制函数生成的值?

时间:2017-12-20 16:57:45

标签: python image python-imaging-library

我想知道如何在间隔(-1,1)中使用python中的PIL绘制任何函数。我从函数y = x**2开始,到目前为止,我有这个:

from PIL import Image

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)


def parabola(x):
    return (-1) * (x ** 2)

def draw_function(function, size=200):
    im = Image.new("RGB", (size, size))
    for x in range(size):
        for y in range(size):
            if function(x)< function(y):
                im.putpixel((x,y), BLACK)
            else:
                im.putpixel((x,y), WHITE)
    im.show()

draw_function(parabola)

但我得到了:

enter image description here

我想得到:

enter image description here

你能告诉我问题出在哪里吗?

2 个答案:

答案 0 :(得分:2)

好吧,我不认为你正确地解决了这个问题。首先,考虑一下像素为黑色的条件意味着:

function(x) < function(y)

这并没有真正定义抛物线下面的区域。这样做的条件是

function(x) < y

另外,想想你的绘图区域是什么。它是[0, 200) x [0, 200)。此外,在PIL中,x坐标在图像中向下增加,因此您的抛物线将可见(如果有的话)颠倒。

这里对您的代码进行了一些修改:

from PIL import Image

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)


def parabola(x):
    return (-1) * ((x - 100) ** 2) + 150

def draw_function(function, size=200):
    im = Image.new("RGB", (size, size))
    for x in range(size):
        for y in range(size):
            if function(x) < y:
                im.putpixel((x,y), BLACK)
            else:
                im.putpixel((x,y), WHITE)
    im.show()

draw_function(parabola)

这应该产生一个有点类似的图片: enter image description here

答案 1 :(得分:0)

您需要确保xy值,以便它们代表0size-1范围内的坐标,以便使用它们来绘制{ {1}}。这是在下面的代码中完成的,首先找到函数将返回该范围内Image值的最小值和最大值。然后它使用它们来翻译(移动)并缩放它们,使它们都落入所需的范围。要使曲线下方的区域为填充,您需要绘制垂直线,而不是单个像素。为此,我使用x代替ImageDraw.Draw.line()。在im.putpixel()来电中,图片背景也会初始化为WHITE

另请注意,生成的图像将与大多数教科书中显示的图像颠倒,因为原点是左上角,y轴从那里到左下角。大多数插图的起源都在左下角。如果你愿意,你也可以解决这个问题。

Image.new()

结果:

output showing parabola