当使用NumPy&Pillow绘制Mandelbrot时,程序输出明显的噪声

2024-09-27 09:23:38 发布

您现在位置:Python中文网/ 问答频道 /正文

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

然而,下面的程序只输出RGB无意义,几乎是噪音。我认为这与NumPy和PIL处理数组的方式不同有关,因为当执行img = Image.fromarray(l)和{}时,说l[x,y] = [1,1,1],其中{}并不能只使1个像素变白。在

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×200时,程序现在输出:

Failed Mandelbrot

正如你所看到的,它确实显示了一些数学形状,但却充满了这些奇怪的红、绿、蓝像素!为什么这些会在这里?我的程序只能将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(),这就是我们得到的:

Not just 1 white pixel!

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

更新4:

我不知道之前发生了什么,但是对于np.uint8数组,Image.fromarray()使用的颜色值是0-255。有了这一点智慧,我离理解曼德拉虫又近了一步!在

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

Black circle in White Background.

只有这个点。。。如果我改成np.uint16,我会发现更奇怪的事情,我想是因为字节形状和编码方案不同。在


Tags: 代码image程序imgabnpitrgb
1条回答
网友
1楼 · 发布于 2024-09-27 09:23:38

你没有正确地索引3D数组l,试试看

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

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

作为一个旁注:numpy的quickstart documentation实际上有一个mandelbrot集生成和打印的实现。在

相关问题 更多 >

    热门问题