以前,我使用海龟在 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()
,这就是我们得到的:
在这里,我们得到一系列彩色像素。这需要另一个问题。
更新 4:
我不知道以前发生了什么,但似乎有一个np.uint8
数组,Image.fromarray()
使用 0-255 的颜色值。有了这个智慧,我离了解这只曼德虫又近了一步!
现在,我确实得到了一些模糊的数学知识,但它仍然输出奇怪的东西。
这个点就是全部......如果我更改为np.uint16
,我会得到更奇怪的东西,我想是由于不同的字节形状和编码方案。