以前,我用python创建了一个Mandelbrot生成器。现在,我正在重新编写使用Python图像库的程序,以便提高速度并减少对图像大小的限制。在
然而,下面的程序只输出RGB无意义,几乎是噪音。我认为这与NumPy和PIL处理数组的方式不同有关,因为当执行img = Image.fromarray(l)
和{l[x,y] = [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时,程序现在输出:
正如你所看到的,它确实显示了一些数学形状,但却充满了这些奇怪的红、绿、蓝像素!为什么这些会在这里?我的程序只能将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()
,这就是我们得到的:
这里我们得到一系列彩色像素。这需要另一个问题。在
更新4:
我不知道之前发生了什么,但是对于np.uint8
数组,Image.fromarray()
使用的颜色值是0-255。有了这一点智慧,我离理解曼德拉虫又近了一步!在
现在,我做了得到一些模糊数学的东西,但是它仍然输出奇怪的东西。在
只有这个点。。。如果我改成np.uint16
,我会发现更奇怪的事情,我想是因为字节形状和编码方案不同。在
你没有正确地索引3D数组l,试试看
相反。有关如何访问和修改numpy数组的详细信息,请看numpy indexing
作为一个旁注:numpy的quickstart documentation实际上有一个mandelbrot集生成和打印的实现。在
相关问题 更多 >
编程相关推荐