2

以前,我使用海龟在 python 中创建了一个 Mandelbrot 生成器。现在,我正在重新编写程序以使用 Python Imaging Library,以提高速度并减少对图像大小的限制。

但是,下面的程序只输出 RGB 废话,几乎是噪声。我认为这与 NumPy 和 PIL 处理数组的方式不同有关,因为在执行和时说l[x,y] = [1,1,1]wherel = np.zeros((height,width,3)) 不仅仅使 1 个像素变白。img = Image.fromarray(l)img.show()

def imagebrot(mina=-1.25, maxa=1.25, minb=-1.25, maxb=1.25, width=100, height=100, maxit=300, inf=2):
    l,b = np.zeros((height,width,3), dtype=np.float64), minb

    for y in range(0, height):
        a = mina
        for x in range(0, width):

            ab = mandel(a, b, maxit, inf)

            if ab[0] == maxit:
                l[x,y:] = [1,1,1]

            #if ab[0] < maxit:
                #smoothit = mandelc(ab[0], ab[1], ab[2])
                #l[x, y] = colorsys.hsv_to_rgb(smoothit, 1, 1)

            a += abs(mina-maxa)/width
        b += abs(minb-maxb)/height

    img = Image.fromarray(l, "RGB")
    img.show()

def mandel(re, im, maxit, inf):
    z = complex(re, im)
    c,it = z,0

    for i in range(0, maxit):
        if abs(z) > inf:
            break
        z,it = z*z+c,it+1
    return it,z,inf

def mandelc(it,z,inf):
    return (it+1-log(log(abs(z)))/log(2))

更新 1:

我意识到这个程序中的一个主要错误(我敢肯定有很多)是我使用 x,y 坐标作为复系数!所以,0 到 100 而不是 -1.25 到 1.25!我已经更改了这一点,因此代码现在使用变量 a,b 来描述它们,以我从海龟版本中的一些代码中窃取的方式递增。上面的代码已相应更新。由于当前已注释掉平滑着色算法代码以进行调试,因此该inf变量已减小到2大小。

更新 2:

我在一位优秀用户的帮助下编辑了 numpy 索引。当设置为 200 x 200 时,程序现在输出:

失败的曼德布罗

正如你所看到的,它确实显示了一些数学形状,但却充满了所有这些奇怪的红色、绿色和蓝色像素!为什么这些会在这里?我的程序只能将 RGB 值设置为默认值[1,1,1]或将其保留为默认值[0,0,0]。不可能是[1,0,0]这样的——这一定是一个严重的缺陷……

更新 3:

我认为 NumPy 和 PIL 的集成存在错误。如果我l = np.zeros((100, 100, 3))先声明然后声明l[0,0,:] = 1,最后声明img = Image.fromarray(l)& img.show(),这就是我们得到的:

不仅仅是1个白色像素!

在这里,我们得到一系列彩色像素。需要另一个问题。

更新 4:

我不知道以前发生了什么,但似乎有一个np.uint8数组,Image.fromarray()使用 0-255 的颜色值。有了这个智慧,我离了解这只曼德虫又近了一步!

现在,我确实得到了一些模糊的数学知识,但它仍然输出奇怪的东西。

白色背景中的黑色圆圈。

这个点就是全部......如果我更改为np.uint16,我会得到更奇怪的东西,我想是由于不同的字节形状和编码方案。

4

1 回答 1

4

您对 3D 数组 l 的索引不正确,请尝试

l[x,y,:] = [1,1,1]

反而。有关如何访问和修改 numpy 数组的更多详细信息,请查看numpy indexing

附带说明:numpy 的快速入门文档实际上有一个 mandelbrot 集生成和绘图的实现。

于 2017-01-07T19:44:44.920 回答